All notable changes to this project are documented here. The format follows Keep a Changelog and this project adheres to Semantic Versioning.
- Duplicate detection across five categories, with only same-site and same-brand/family groups treated as mergeable.
- Merge engine: survivor-first, verified before any deletion, soft deletes to trash.
bwsharp scanandbwsharp mergeon Spectre.Console; dry run by default.bwsharp scan --from <file>for read-only analysis of a savedbw list itemsdump.- Architecture tests enforcing the hexagon and keeping process execution inside Infrastructure.
- Avalonia desktop host: unlock screen and a three-pane vault browser (folder tree, item list, detail pane), with passwords masked until revealed.
AddBitwardenServe()— a secondIVaultClientadapter over the local Vault Management API frombw serve, on a random loopback port owned as a child process. Used by the desktop host, where one long-lived server beats a Node start-up per call.IVaultSessionport for unlock/lock, separate fromIVaultClientso only the desktop host depends on taking a master password.
- Rewritten from the pre-1.0 prototype, which returned process exit codes rather than data and had
no domain model. That work is preserved on the
archive/v0-copilottag.
- Full item model: cards, identities, secure notes and SSH keys alongside logins, plus password
history, per-cipher
key,repromptand collection ids. Card numbers, CVVs, SSH private keys and historical passwords all redact inToStringlike login passwords already did. - Folder create/rename/delete and drag-and-drop of items and folders, planned through
FolderPathsso a rename carries its subtree and self-nesting is refused before any write. - Website icons from Bitwarden's icon service, cached on disk, with a coloured-initial fallback. Off by one flag; see the README on what a lookup discloses.
- Duplicate queue and three-pane merge editor in the desktop app. The queue separates groups whose decisions are cosmetic from those with a real credential conflict; the editor handles groups of any size, per-property choices, per-element collection inclusion, and merging into a member or a new item.
- Desktop app froze on launch. Server start-up was awaited with
GetAwaiter().GetResult()from a DI factory, which runs on the UI thread; the awaits inside start-up then needed the thread that was blocked waiting for them. Start-up is lazy and asynchronous now, shutdown cancels-awaits- reshuts rather than blocking, and a test asserts that resolving a service starts no process. bw servewas left running after an abrupt exit, keeping an unauthenticated port onto an unlocked vault open indefinitely. Cleanup now runs on POSIX signals as well asProcessExit.- Several detail-pane sections bound
Count(an int) toIsVisible(a bool), which Avalonia reports as a binding error at runtime.
- Secrets are never passed as process arguments: the session key travels in the child environment
and the item payload for
bw editis piped to stdin. The prototype passed the master password on the command line, wherepsexposes it to every local user. - Records holding credentials redact them in
ToString.