Features
- add Buttondown newsletter signup form
- collapsible stats row on home, sticky
- graceful spinner fallback for slow lazy-route loads
- plain divider + "Create another vault" on single-vault unlock
- Astro + Starwind landing site on shared @vault/theme
- bolder, wider on-page picker
- make QR scan the primary Join experience on mobile
- wire back navigation - Android hardware back (#15) + setup-shell back button
- restore the QR-code scanner in the mobile Join flow
- always offer the "Join a device" tab
- active-vault-aware Android autofill + per-vault biometric
- per-vault biometric unlock (core + iOS)
- show 'Join a device' in the setup shell on a fresh device
- render 'Restore from backup' inline as a tab, not a page swap
- unify first-run 'open existing vault' with the multi-vault restore flow
- hide 'Create new vault' on unlock when multiple vaults exist
- join a P2P mesh from the setup shell (join = add a vault)
- per-vault VEK inc 6 - atomicity guard + lock-to-picker
- per-vault VEK inc 5 - hand the VEK to enrollment explicitly
- per-vault VEK inc 4 - tag the background consumers
- per-vault VEK inc 3 - scoped view adapter + create binding
- per-vault VEK inc 2 - the seam flip (offscreen + background)
- per-vault VEK inc 1 - inert threading (schemas + vek-store)
- forward the inviter's recovery slot to joiners (shared group recovery code)
- restore .bramble backups from the Add-a-vault screen
- scheduled backups cover every vault, not just the primary
- vault name inline on the home header + on the unlock screen
- always show the active vault's name in the header
- show the active vault's name in the header
- per-vault device sync (extension)
- share the active vault id with the background (multiple vaults phase 2)
- vault name input in General; delete moves to its own re-auth-gated section
- drop create/switch buttons from the settings vault section
- settings vault section acts on the current vault only
- inline recovery-code and switch-vault links with a dot separator
- per-vault picker cards + context-aware setup screen (multiple vaults)
- settings vault list + switch vault (multiple vaults phase 1)
- add 'choose a different vault' link on the unlock screen
- create parallel vaults + launch-time vault picker (multiple vaults phase 1)
- thread active vault id through VaultProvider (multiple vaults phase 0)
- vault registry + id-aware blob storage (multiple vaults phase 0)
Bug Fixes
- converge racing no-registry migrations on one vault id
- show a loader while decrypting, not an empty-vault flash
- 2FA verification-code fields no longer misdetected as CVV
- corner card / picker box model survives host-page CSS resets
- omit ambient cookies so WebDAV uploads authenticate
- override adm-zip to 0.6.0 (GHSA-xcpc-8h2w-3j85)
- refresh the on-page picker after unlock (#20)
- no white flash before the theme resolves
- stop hiding the "Keyboard suggestions" toggle behind a keyboard probe (#19)
- drive Android back through the router, not window.history
- show the real per-vault sync panel on mobile (drop the stale "primary vault" gate)
- use the extension's segmented tabs on mobile (drop the rough pill variant)
- disconnect removes the ACTIVE vault's namespaced group, not flat sync.group
- push the ACTIVE vault's password slot to iOS autofill
- target the active vault in sync + persist active-vault; scope the migration
- add the joiner to the roster in the enroll host, not just the popup
- per-vault VEK - locking is a clean slate (single-view UX)
- joining a group provisions a fresh recovery code for the device
- 'Back up now' backs up the active vault, into its own folder
- keep Firefox's event page alive during enrollment
- start ongoing sync as soon as a vault's group exists
- land on the unlocked vault's home, not the picker
- restore never overwrites an existing vault (adds a new one)
- scope the sync panel to the primary vault (stopgap)
- restore the unlocked vault on reopen instead of the picker
- use the shared TextField for the vault-name input
- make the vault picker scroll when there are many vaults
- keep unlock-screen links at text-xs
Performance
- virtualize the entry list
- code-split non-first-paint routes to shrink the initial bundle
- batch native decrypt so a large vault opens in one bridge call
- decrypt the whole vault in one offscreen round-trip
Refactors
- finish the Button sweep - ErrorBoundary + BackupSection
- add a shared cva Button and adopt it across the app
- delete the dead inline-capability probe + trim comments
- drop the always-true
restorecapability - namespace every vault by id via a one-time copy migration
- remove the dead primaryId, fall back to the legacy/default vault
- drop the Settings 'Join with a pairing code' path
- single verified delete path (useVault.deleteVault)
- rename/remove act only on the active vault (never another)
- central localized date formatter; picker shows 'Created on Jan 13, 2026'
Documentation
- record the no-registry migration convergence guard
- refresh the gallery, add six new shots
- device-verification status (2026-07-18)
- record the phase-1 ship date + a phase-2 flip checklist
- reconcile status after biometric/autofill/join/restore work
- correct the stale perVaultSync comment (mobile now targets the active vault)
- mobile Tier 1 core landed (active-vault + per-vault sync)
- Firefox multi-vault is done, not pending (survey + user testing)
- add mobile multi-vault Tier 1 to the backlog
- record the setup-shell UX (create/restore/join tabs)
- record host-side enrolled-roster fix for Firefox inviter
- Settings join removed (follow-up done)
- mark join-from-setup landed; note the Settings-join follow-up
- mark per-vault VEK landed; call out join=add-a-vault as the next gap
- per-vault VEK design (supersedes single-VEK + primary vault)
- record the sync-panel stopgap ahead of increment 3
- note picker cards + context-aware setup screen
- mark multiple-vaults phase 1 complete (create + picker + management)
- mark multiple-vaults phase 1 create + picker landed
- mark multiple-vaults phase 0 complete; clarify migration staging vs release cadence
- plan for multiple vaults
Other
- ci(website): deploy to Cloudflare Pages via wrangler + API token
- ci(website): deploy to Cloudflare Pages instead of GitHub Actions
- chore(scripts): dev runs chrome + firefox + website together
- chore(docs): new fable security audit
- chore(website): add CNAME for the bramble.sh custom domain
- test(e2e): picker refreshes after unlock without refocusing (#20)
- test(e2e): guard lock-pref persistence across a browser restart
- test(vaults): pin the createVault sync-reset guard; retire the stale "still open" note
- test(e2e): end-to-end namespacing-migration test; fix stale registry after lazy migration
- chore(ext): add a Firefox dev watch (dev:firefox)
- a11y(ui): raise the vault-name contrast to text-foreground/70
- test(e2e): per-vault sync isolation (tier 2, increment 4)
- test(e2e): create + lock + unlock vault flow (tier 2, increment 3)
- test(e2e): playwright setup + extension loading (tier 2, increments 1-2)
- test(vault): per-vault sync unit coverage (tier 0)
- docs+feat(sync): phase 2 design + per-vault sync-key helper
- chore(i18n): vault-name + delete-reauth strings
- chore(i18n): current-vault settings strings
- chore(i18n): 'Created on {0}' string
- chore(i18n): extract + translate add-a-vault / picker strings
- chore(i18n): extract + translate vault management strings
- chore(i18n): translate vault picker strings (de, es, fr, it, pt-BR)
- chore(i18n): extract + compile vault picker strings
- chore(readme): remove status section
- chore(ios): App Store release notes for this update
Full Changelog: 0.8.0-android...0.9.0-android