What we shipped on 2026-08-08
Shipped 81 items (55 code, 7 infra, 9 docs, 5 release, 5 other).
Code
test(e2e): survive android emulator drops, up to cold-rebooting itThe adb connection to the Android emulator is fragile under WSL2 mirrored
test(e2e): pin android e2e builds to the emulator ABI and survive adb flapsThe e2e Android build compiles the release APK only for the emulator's CPU
fix: file actions api response types
test(e2e): record the BottomSheet content-collapse validation patchA root-cause validation for the folder-pin Detox spec, not a finished library
test(e2e): retry the document-editor back tap until the pop landsDetox-injected taps can be dropped for a few seconds after the editor is
test(e2e): split the native run into Maestro and Detox suites with a summaryThe shared runner (e2e/native/run.ts) already keeps the two suites apart, but
test(e2e): walk the onboarding phone step via smspitEvery UI-registered account on this stack is flagged by the signup fingerprint
test(e2e): harden rn-motion-ui 5 surface interactionsrn-motion-ui 5's Drawer , AdaptiveDropdown sheet and FullSheet panels
test(e2e): align specs with the FileSystem browser testIDsThe post-login "All files" view is a <FileSystem browser, so the seeded
refactor(backoffice): import icons from rn-motion-ui-iconsSwitch the backoffice pages and shared components from the retired
refactor(app): import icons from rn-motion-ui-icons and adapt to rn-motion-ui 5Switch every app component and route from the retired @offkeep/ui/lib/icons
refactor(packages/ui): import icons from rn-motion-ui-iconsWith the custom lib/icons.tsx set retired, switch every component to the
fix(e2e): guarantee a signed-out start for iOS Detox specsThe keychain — where the session lives — survives delete: true , so a
fix(app): make the iOS DeviceSync module compile against expo-modules-coreThe module was written without a Swift toolchain on hand and three things
feat(app): reimplement the DeviceSync native module for iOSThe Swift half, mirroring the Android one against the same types.ts
feat(app): reimplement the DeviceSync native module for AndroidThe Kotlin half of the module, written against the contract in types.ts .
refactor(app): drop the e2e-only session-reset hook from DeviceSyncisE2EReset existed so a Detox spec could start signed out: the native
fix: stop ignoring the native halves of local Expo modulesios/ and android/ were bare patterns, so they matched at every depth —
fix(e2e): keep the app suite out of the root e2e projecte2e/tsconfig.json includes ./ / .ts , so moving the app suite under
fix(app): restore the device-sync type re-exportsThe lazy-resolution rewrite dropped the export type … from './types'
feat(app): say what failed at every error surfaceThe screens, forms and billing flows all reported failures with the same
feat(app): wire the error describer into the app's data layer@/lib/errors is the app's entry into describeError : it supplies the
fix(app): dismiss the keyboard when an organization form collapsesInside a Modal window the keyboard does not go away when the focused
fix(app): tell "you're offline" apart from "can't reach offkeep"One isOffline flag was written by two unrelated reporters — NetInfo when
feat(backoffice): report why an admin request failedThe pages rejected with new Error('Failed to load payments') , which
feat(ui): name the failure cause in the shared error surfacesDataFetchBoundary rendered "Something went wrong / An unexpected error
feat(utils): describe a thrown value by what actually failedEvery surface in the repo answered a failure with the same sentence,
fix(e2e): make the Detox auth and organization specs pass on AndroidFour Android-only failures, none of them in the app:
fix(app): stop Android toasts from swallowing every tapToasts were lifted above the app's own overlays by wrapping them in a
fix(app): lift modal content above the Android keyboard toouseKeyboardHeight was iOS-only on the reasoning that Android resizes the
fix(app): treat an unlinked DeviceSync module as unsupportedisDeviceSyncSupported() answered from Platform.OS alone, so on a build
feat(dev): reach the dev backend from the Android emulatorlocalhost inside an emulator is the emulator's own loopback, so the app's
chore(e2e): skip `pod install` when building off macOSCocoaPods only exists on macOS, so the iOS Detox build command failed at
chore(e2e): stop retrying failed Detox specsA retry hides a flake instead of surfacing it, and doubles the time a
feat(e2e): auto-start the stack and narrow Detox down to one testIterating on a native spec meant keeping a second terminal alive for
refactor(e2e): move the app suite into an `e2e/app` workspaceThe Detox specs, Maestro flows and their helpers lived under apps/app/e2e ,
chore: finish the app-new → app rename in Metro and the build cacheThe directory rename left two references behind: Metro's blockList still
chore: ignore Detox artifacts and the generated app theme mirrorapps/app/artifacts/ is written by Detox, one directory per run, and
chore: update ValueProposition pay-as-you-go copyReword the 'Only pay for the storage you use' card to reflect the
feat: add prelude sign-up bands to comparison pagesEach comparison page now opens with a PreludeCta band that summarizes the
feat: add prelude sign-up bands to marketing pagesEach marketing page now opens with a PreludeCta band that pitches the
feat: add pay-as-you-go billing pageNew /pay-as-you-go page explaining metered billing: tiered per-GB rates,
feat: add PreludeCta sign-up band and hash-skip infrastructureNew PreludeCta component: a sign-up band that sits above a page's hero,
refactor(ui): tighten interactive surface sizing — reduce heights 4px and padding 2px across tiersButton, Input, OtpInput, Tabs, ButtonGroup, MenuItem, and MultiStepMenu sidebar
refactor(ui): migrate inline style props to className where possible
feat!: rename button tokens to interactive surface family, add radius system, menu stagger, button press modesBREAKING: --spacing-button- → --spacing-interactive- ,
fix: wrongly named changesets
chore: remove unused presenceAffectsLayout prop from AnimatePresence
feat: Table column layout refactor, cn() utility adoption, and performance improvementsTable: new columnLayoutStyle() utility for consistent width resolution; removed containerWidth prop from sub-components
feat: ButtonGroup component, FeedbackWidget animation overhaul, and fixesNew ButtonGroup form component with segmented/toolbar/grid layouts
fix: replace workspace:* with ^0.0.2 for rn-motion-ui-icons dependencyThe workspace: protocol leaks to npm when changeset publish runs npm publish,
feat(icons): forward ...props to underlying Svg element, extend IconProps from SvgPropsIcon components now spread remaining props onto the root <Svg
chore: avoid oneLiner warnings in coverage badge script
test: add per-guard unit tests incl. composite guards
feat: add isArrayOf/isObjectOf/isUnionOf composite guardsisArrayOf(value, itemGuard) narrows to T when every element passes the
Infra
One-command deploy entrypoint + template-ize config (wrangler/terraform)scripts/deploy.sh is the single deploy entrypoint (npm run deploy / make
chore(deps): bump rn-motion-ui to 5.0.3 and drop the obsolete validation patchrn-motion-ui 5.0.3 supersedes the BottomSheet content-collapse validation
test(e2e): offer to start docker before the full e2e suiteBoth e2e stacks boot their services via docker compose, so a run with the
chore(deps): bump rn-motion-ui to 5.0.2 and retire the material-symbols icon pipelinern-motion-ui 5 depends on the new rn-motion-ui-icons package (one subpath
chore: remove temporary NPM_TOKEN verification workflowVerified: stored NPM TOKEN secret is invalid (401) — publish would fail.
chore: temp workflow to verify NPM_TOKEN secret (will be removed)
ci: tag/release-triggered npm publish with gates, automation tokenpublish.yml: publishes to npm when a v tag is pushed or a release is
Docs
Expand README into a reusable template quickstart'Create a new project from this template': GitHub Use-this-template +
Add architecture diagram and README linkdocs/architecture.md: Mermaid system overview (SPA + Worker router +
chore: auto-sync README
chore: auto-fix README sync for packages/ui/README.md table and husky pre-push hookcheck-readme.mjs --fix now extracts PascalCase exports from component sources
docs: pin gitRevision to main for idempotent api.md regenerationTypeDoc embeds the current HEAD commit SHA into source links by default,
docs: refresh api.md source links to current HEAD
docs: generate API reference from JSDoc via TypeDocAdd full JSDoc (purpose, type params, params, returns, throws) to all
docs: add hero example, badge row, and API docs link to README
chore: add coverage reporting, CI gate, and README badgebunfig.toml: V8 coverage on every bun test (text + lcov - coverage/lcov.info)
Release
rn-motion-ui@5.0.34754dab: - ButtonGroup : new form component for grouping buttons with segmented,
rn-motion-ui@5.0.201a8bf9: fix: replace workspace:\ protocol with ^0.0.2 for rn-motion-ui-icons dependency so upstream consumers can resolve it
rn-motion-ui@5.0.1Updated dependencies 646025b
rn-motion-ui@5.0.044a0672: FileSystem : drag and drop now runs on Draggable / Dragzone / MultiDragManager .
rn-motion-ui-icons@0.0.2646025b: Icon components now forward all remaining props to the underlying <Svg element via ...props . IconProps extends SvgProps from react-native-svg, so consumers can pass any SVG prop (hitSlop, onLayout, pointerEvents, opacity, etc.) through to the root SVG.
Other
Ignore __pycache__
Template-ize WebAuthn identity: derive RP ID/origin from request host; add MIT licenseThe template promised 'no source edits required' but hardcoded the dead
Add share token model and management APIBackend for public read-only share links (feature: tokenized board share):
next
app-new -> app
← All shipped days