What we shipped on 2026-08-11
Shipped 64 items (28 code, 23 infra, 4 docs, 3 design, 5 release, 1 other).
Code
fix(marketing): import rn-motion-ui tokens.css to register geometry classesrn-motion-ui components use custom utility classes (h-interactive-md,
feat(marketing): add dedicated Legal Information page (mentions légales)New /legal-information route: full official identification of Offkeep SAS —
fix(marketing): correct Offkeep legal identity — HQ in France, SIRET, Créteil courtsCompany is headquartered in Arcueil (Val-de-Marne), not Paris. Entity line in
feat(status): dark-mode-aware status colours and cleaner status page UIAdd --status-{operational,degraded,down} + -tint tokens to globals.css:
feat(marketing): ship legal hub, full Terms of Service and Privacy PolicyReplace the draft legal outlines with binding copy: Offkeep SAS (France,
chore(app): remove eslint, lint with Biomeapps/app used expo lint (eslint-config-expo) — the only eslint in the
chore(backend): use Airwallex demo env in production while staging keys are in useTemporary: production reuses the staging (demo) Airwallex account per
fix(backend): allow vs3.${domain} (console origin) in production ALLOWED_ORIGINThe console app (vs3.offkeep.com/console) calls api.offkeep.com from the
feat(marketing): swap lucide-react for MingCute icons (iconify)Replace all lucide-react icons across the marketing site with MingCute via
feat(status): live per-component health feed + real status pageBackend:
feat(marketing): add Offkeep favicon set (favicon.ico, icon.svg, apple-touch-icon)Replaces the stock Next.js favicon with the Offkeep logo rendered at
refactor: use @iv-stpn/typeguards instead of custom typeguardsReplace the hand-rolled guards in packages/utils/src/typeguards.ts with
test: fix probe yaml quoting
test: probe self-hosted runner with explicit labels
test: move runner probe to workflows dir
test: probe self-hosted runner
chore(marketing): remove misplaced root _redirects
fix(backend): align Airwallex webhook events with API naming (payment_intent.cancelled)Airwallex rejects the American spelling (payment intent.canceled); the
fix: constrain offkeep logo sizing with overflow-hidden and h-full w-fullReapplied from offkeep-marketing d987622.
refactor(ui): remove FeedbackFAB, consolidate into MorphingFAB with story demosDelete feedback-fab.tsx, feedback-widget.tsx, and their stories
chore(ui): JSDoc moti APIs, TS strictness, React.memo, error hardeningJSDoc — Moti animation engine (16 files, 20+ public APIs)
feat(ui): rename FeedbackWidget to MorphingFAB (generic shell), rebuild feedback flow as FeedbackFABMorphingFAB: generic FAB that morphs into a pane; arbitrary children or
feat(ui): re-add outline variant to Button/IconButton, add ThemedIcon token, fix OtpInput text style typesButton/IconButton: outline variant (border border-border bg-transparent,
feat: integer/finite/record/one-of/tuple guards, assert+parse, branded typesWhat
chore: rename package to @iv-stpn/typeguardsts-typeguards collides with the existing ts-type-guards package (npm's
chore: rename package typeguards -> ts-typeguardsnpm rejects 'typeguards' as too similar to the existing 'type-guards'
chore: align initial release to 0.0.1Downgrade the guard-kit-expansion and guarded-composite-helpers changesets
feat: add createEmptyRecord and objectKeys generic helpersPort the two generic utilities from offkeep's packages/utils/src/typeguards.ts
Infra
ci: publish via OIDC trusted publishing, drop NPM_TOKENRemoves NODE AUTH TOKEN/NPM TOKEN wiring and registry-url from the
ci: drop empty setup-node step after OIDC migrationThe setup-node step only provided registry-url (removed for OIDC
ci: sudo npm upgrade in OIDC publish stepWithout setup-node the runner's npm prefix (/usr/local) is not writable;
ci: pin npm@11 in OIDC publish stepnpm@latest is now npm 12, which requires node = 22.22.2 — the repo pins
Status page (live health feed + incident history), runner/CI fixes, MingCute icon migrationPromotes the staging branch (12 commits ahead of main).
feat(ci): path-filtered deploys, bun/Rust caching, macOS never-failsThree improvements to the deploy workflow:
fix(ci): show macOS build as cancelled (not failed) when billing is blockedTwo changes so the macOS job never shows "failure" when the hosted
fix(ci): properly cancel macOS desktop build when billing is exceededThree fixes to the deploy workflow's billing-block handling:
ci(deploy): fix billing detection — match any zero-step failed job, scan 10 runsThe previous filter only matched jobs named 'desktop (macos...' within 5
ci(deploy): macOS as separate job — shows 'skipped' while billing-blockedFix the broken previous attempt: matrix context is NOT available in
ci(deploy): show macOS job as skipped (not absent) when billing-blockedKeep the macOS matrix entry on main so the job appears in the workflow
ci(deploy): fix billing-block detection — use jobs API, not annotationsThe previous check read check-run annotations, which the workflow token
ci(deploy): auto-skip macOS desktop build while billing blocks hosted runnersconfig job detects the billing block from recent runs' job annotations
ci(deploy): cross-compile Windows desktop on self-hosted runnerWindows no longer needs the billing-blocked windows-latest hosted runner:
chore(deps): bump rn-motion-ui to ^5.3.0, drop rn-motion-ui patchrn-motion-ui 5.3.0 ships the outline Button variant, OtpInput TextStyle
ci(deploy): add file(1) to runner apt deps for linuxdeploylinuxdeploy shells out to file to classify binaries when bundling the
fix(ci): restore green test+fallow after status-page health feedtest/setup.ts s3 mock: add probeStorage (health.ts imports it; the mock
ci(deploy): add AppImage bundling deps for self-hosted runnerlinuxdeploy needs FUSE (libfuse2t64 on 24.04 / libfuse2 on 22.04) and
ci(deploy): use libayatana-appindicator3-dev + xdg-utils for self-hosted runnerGitHub-hosted ubuntu-22.04 images preinstall libappindicator3-dev and
ci: route Linux jobs to self-hosted runner, bypass billing blockCI jobs + deploy config/backend/marketing/release: runs-on self-hosted, linux, x64
ci(deploy): Linux-only desktop builds off main via self-hosted runnerconfig job emits desktop matrix: 3-OS on main (release artifacts),
chore(ci): re-trigger workflows after fast-forward
ci: upgrade npm in publish job for OIDC trusted publishingactions/setup-node's bundled npm 10.9 predates trusted-publishing auth
Docs
chore(marketing): 301 old /shipped links to makepod.dev/changelog (correct location)
chore(marketing): 301 old /shipped links to makepod.dev/changelog
chore: auto-sync README
docs: document createEmptyRecord and objectKeysAdd a Utilities section to the README (object-keys, create-empty-record) plus
Design
style: suppress underline on chrome, button, and nav linksReapplied from offkeep-marketing 8199944.
style: remove redundant hover:underline and text color from inline linksReapplied from offkeep-marketing a689404.
style: add global link token and default underline ruleReapplied from offkeep-marketing e317682.
Release
Release 89Full Changelog : https://github.com/iv-stpn/offkeep/compare/v86-afd902f6396624e04b0b98c5a293b4b73ee51797...v89-6a61c0843c852d16224fcb455284bba08eab7c18
Release 86Lint warning cleanup by @iv-stpn in https://github.com/iv-stpn/offkeep/pull/1
rn-motion-ui@5.3.043f1e60: Rename FeedbackWidget → MorphingFAB ; feedback flow becomes FeedbackFAB
chore: version packages
chore: version packages
Other
merge: staging → main — status tokens, Windows cross-compile, legal hubResolved conflicts keeping both branches' work:
← All shipped days