Features
- check for updates from the menu, and say who wrote this
- offer an update in a native dialog on launch
- update the app in place from a signed GitHub release
- flip UI flags at runtime from a shortcut, so a signed build can be tested
- put rotation behind a build-time flag, off by default
- rotate the vault's secret, with every consequence stated first
- open the highlighted entry from the panel, and separate the disconnect verbs
- fill the browser from the panel
- Enter copies the highlighted result's password
- send the hotkey to the vault window when locked
- search the vault from the panel and pick a result
- make Enter the fill action in the panel
- show the panel's shortcuts under the search field
- offer to carry a vault's entries into the shared one
- connect a browser in one code and one click
- let a browser claim the sync invite over the link
- sync with the desktop app over the link, not the relay
- hold the desktop link open so sync can arrive unprompted
- sync with browsers on this machine over the link, not the relay
- carry sync frames over the browser link
- compare pairing emoji instead of twelve digits
- admit the joiner in the process, not the window
- keep the vault in step with its group after enrollment
- run device-sync enrollment in the webview
- give this device a sync identity
- expose the sync host's crypto, and skip the native WebRTC bridge
- ask the desktop app what it holds
- carry queries over the established session
- index the vault for the browser link
- bundle the proxy so the browser link works from a real app
- link to the Bramble desktop app
- show a pairing code in Settings
- install the native-messaging host manifest
- add the native-messaging proxy
- serve the browser pairing handshake over a local socket
- keep the pairing key in the OS credential store
- pair with a browser extension over an allowlisted static key
- expose the Noise handshake to the native build
- outlive the main window, and leave the Dock with it
- add the spotlight panel shell
- let the single-column screens fill the window
- fix the window at 600x580, and name the scripts by verb
- scaffold the Tauri 2 app on the shared Rust core
- validate the expiry and security code too
- validate the card number against a zod schema
- copy a card's expiry and CVV from the row menu
- add an MDX blog, starting with the one-month write-up
Bug Fixes
- hide the desktop link where the browser cannot do it
- make a universal build actually produce a universal app
- make --universal actually release a universal build
- serve a valid update manifest before the first release
- arm nothing when no desktop app is paired
- reconnect the pipe and the relay after either drops
- say whether the vault on screen is the one the desktop app shares
- keep the vault and its metadata owner-only
- say which vault a desktop connect will leave you in
- three faults the first real pairing surfaced
- let the release build reach the sync relay
- let cargo run in this crate without a staged sidecar
- make a broken pairing key visible instead of silent
- read the pairing key once, not per connection
- scan this package for Tailwind classes, and collapse the panel
- give the app icon the macOS shape
- place the relayed picker in document, not viewport, coordinates
- host the picker in the top frame for hosted-fields checkouts
- translate the vault errors the UI renders
- make the session guards fail loudly instead of silently
- stop a superseded session from firing sync, backup and pop-out work
- make VEK install and removal transactional and fail closed
- bind the decrypted index to the vault session that built it
- deliver picker secrets on the requesting document's own channel
- keep app URIs out of the web hostname index
- say why a scanned QR was rejected instead of "none found"
- detect one-time-code and identifier fields beyond English
- capture logins on formless SPA submits
- keep a revealed secret inside its detail row
Refactors
- drop the link's Test button and site probe
- let a session take its peers from somewhere other than the relay
Documentation
- the bundling gap is closed
- record the browser link, and that pairing needs signing
- design extension unlock delegation as operation delegation
- write out the extension pairing's security model
- bring the port plan up to what was actually built
- plan the Tauri 2 desktop app
- record the versions carrying the xm22 transport fix
- rewrite the GHSA-xm22 audit as a record, not a plan
- publish the GHSA-xm22 transport audit
- keep the contributed single-pass field-inventory plan
- release notes for the bulk-selection work, and translate them
Other
- build(android): build releases on macOS, drop the F-Droid container
- build(desktop): build universal everywhere, not just for a release
- test(desktop): give the desktop tests room for the first import
- build(desktop): release universal by default
- test(desktop): make the update smoke server usable in practice
- build(desktop): skip notarization for the local update test build
- build(desktop): cut releases with
pnpm release desktop <version> - test(desktop): serve a fake update locally to exercise the update path
- build(desktop): notarize with the App Store Connect key iOS already uses
- build(desktop): unlock the updater key with the YubiKey, like every other release key
- chore(i18n): translate the desktop strings and restore catalog ordering
- chore(desktop): take the signing identity from .env.local
- chore(desktop): add run:desktop, and sign build:desktop by default
- test(desktop): cover the reconnect path, and add an extension stand-in
- test(desktop): cover the storage layer, and make it testable
- test(autofill): cover nesting, scrolling and COEP for the relayed picker
- chore(deps): patch the nanoid zero-size loop advisory
- chore(deps): patch the js-yaml omap CPU advisory
- test(sync): bound flushUntil in real time so it survives a loaded machine
- test(e2e): move the transport-race gate under e2e/extension
- test(e2e): record four more login shapes, and make the recorder headed
- chore(e2e): add --skip to the HAR recorder, and measure the size tradeoff
- test(e2e): replay skanetrafiken from a HAR to verify capture on the real app
- chore(deps): patch undici, brace-expansion, and fast-uri advisories
- chore(git): ignore docs/private for pre-disclosure security notes
Full Changelog: 0.12.0-android...0.13.0-android