Move docs/architecture/overview.md to ARCHITECTURE.md at the repo root — it is the primary cross-codebase architecture doc (four-codebase diagram, inter-codebase contracts, secrets map, build matrix, test strategy, where-to-look table) and belongs at the root alongside STATUS.md, ROADMAP.md, etc. Update relative paths inside the file (../../crates/ → crates/, etc.). Update CHANGELOG.md's one active reference to the old path. Add a "Living docs — update discipline" table to CLAUDE.md that maps every ALLCAPS.md file to the area it covers and the trigger for updating it. This closes the loop on the ALLCAPS.md documentation system. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
12 KiB
12 KiB
Changelog
v0.5.0 — 2026-05-02
Three release trains roll into one tag — backup/restore + LastPass import (originally v0.3.0), device authentication (originally v0.4.0), and the v0.5.0 polish + harden bundle (security fixes + UX fixes + two confirmed bugs).
Security
- Pre-receive hook now actually verifies signatures (audit S1, HIGH).
Earlier
relicario-serverbuilds accepted any commit with aGood signatureline on stderr regardless of which key signed it — device-auth was a no-op. The hook now builds anallowed_signersfile fromdevices.jsonat the commit (viaGIT_CONFIG_*env, no global git-config mutation), parses the SSH SHA-256 fingerprint out ofgit verify-commit --rawstderr, and rejects unregistered keys or revoked keys whose committer-date is at or after the revocation timestamp. Bootstrap mode is preserved only when bothdevices.jsonANDrevoked.jsonare empty (closes an empty-devices.json privilege-escalation route). - Backup-restore tar unpacking hardened (audit S2).
relicario backup restoreno longer truststar::Archive::unpack's defaults. A newrelicario_core::safe_unpack_git_archivevalidates each entry's path components (rejects.., absolute paths, Windows drive prefixes), rejects symlinks/hardlinks, and caps total uncompressed size at the lower of 100×compressed-bytes or 1 GiB. The CLI restore path adds a paranoiddest.starts_with(.git/)check after path-joining as defense-in-depth. RELICARIO_*env-var surface audited (audit S3).docs/SECURITY.mdgains a per-variable trust table.RELICARIO_NO_GROUPS_CACHE(a developer escape hatch, not a user knob) is nowcfg(debug_assertions)-gated and is a no-op in--releasebuilds; the env-var lookup is removed from the binary by the optimiser.
Fixed
- Strength meter no longer goes stale after the regenerate button (B1).
Programmatic
input.value = newPassworddoesn't fireinputevents; the regenerate handler now dispatches a syntheticInputEvent('input', { bubbles: true })so the meter listener re-rates the new value. - Snake_case error codes no longer leak into the UI (B2 / P4).
Errors like
vault_locked,origin_mismatch,unauthorized_senderused to render verbatim in the fullscreen vault tab and (in some cases) the popup. Newextension/src/shared/error-copy.tscentral registry maps every service-worker error code to friendly title/body/CTA copy; the popup and fullscreen tab consume the same map. The fullscreen lock screen'svault_lockedblock now readsVault locked / Unlock your vault to continue. / [Unlock vault]. A generated test enumerates the live error codes via grep so the registry can't drift.
Added
- Sidebar logo in the fullscreen vault tab. The
vault-sidebar__headernow renders the 16-optimized SVG logo inline before the "Relicario" wordmark (20×20 px,flex-shrink: 0so it survives narrow-pane wraps). Popup unaffected. - Password coloring (P1). Revealed passwords in the popup
item-detail, fullscreen item view, field-history viewer, and
generator preview render digits and symbols in distinct colors.
Defaults: blue digits, red symbols. Users can override via the
new Display section in settings (color pickers + live preview
swatch + reset). Defaults round-trip via
chrome.storage.sync.password_display_scheme; cross-device when Chrome sync is enabled. - Setup wizard hands off to the fullscreen vault tab on completion
(P2). Both create-new and attach-existing flows now open
vault.htmlin a new tab and best-effort close the setup tab after device registration succeeds — replaces the prior setup-tab-stays-open terminal screen. - Sync now button in the extension settings view — surfaces the
previously hidden
{ type: 'sync' }SW message to users with success / error feedback. - Device registration from the popup. The "Register this device"
button on the devices view now opens an inline name input and (on
confirm) generates a keypair via WASM, persists the private key + name
locally, and writes the device to the remote — no setup-wizard detour.
Backed by a new
register_this_deviceSW message. relicario settings generator-defaults— view-and-edit access to the generator defaults stored inVaultSettings. Flags:--random/--bip39to switch mode,--length,--words,--symbols,--separatorto update fields of the active mode.relicario editnow supports TOTP items. Issuer, label, and secret rotation work; rotated secrets are pushed tofield_history(key:core:totp_secret).relicario history <query>— view captured field history. Values are masked by default;--showreveals them;--field <name>filters to one synthetic key (e.g.login_password,totp_secret).relicario detach <query> <aid>— remove an individual attachment from an item. Refuses to drop a Document item's primary attachment (usepurgeinstead).relicario status— vault summary: root path, item count (active / trashed), attachment count + total bytes, registered device count, last commit (%h %s).- Backup & restore. New
relicario backup export <out.relbak>andrelicario backup restore <in.relbak> [<dir>]commands. The.relbakformat is a single encrypted file: Argon2id-derived key from a user-chosen backup passphrase (independent of the vault factor), XChaCha20-Poly1305 ciphertext, zstd-compressed JSON envelope. Reference image and.git/history are opt-in inclusions (--include-image,--no-history). - Vault-tab Backup & Restore panel. Export downloads the
.relbakviachrome.downloads. Restore takes a file + backup passphrase + new-remote config and writes the vault into a fresh empty repo (refuses to clobber existing). Git history is never bundled from the extension — CLI is the source of full backups. - LastPass CSV import. New
relicario import lastpass <csv>command + vault-tab Import panel (vault.html#import). Logins map toLoginitems; rows withurl == "http://sn"map toSecureNote(extra column → body verbatim, structured data preserved as-is for manual re-categorization). TOTP secrets in thetotpcolumn are base32-decoded intoLoginCore.totp; bad base32 surfaces a warning and the login is imported without TOTP. Failed rows (missingname, missing password on a login) are skipped with a per-row warning. Each row gets a freshly-minted ID — re-running the import creates duplicates rather than corrupting state. - Popup deep link to the Import panel.
settings-vaultgains an "import" section with aLastPass CSV →button next to the existingBackup & restore →button. relicario statusshows last export age. NewLast export: <human-readable>line reading.relicario/last_backup(a marker filecmd_backup_exportwrites on success). Reads "never" for fresh vaults, "4 days ago" otherwise.
Changed
- Form layout in the fullscreen vault tab is now visually consistent
(P3). Notes, custom-fields disclosure, attachments disclosure, and
form-actions in fullscreen logins now sit inside a
.form-lowerwrapper with the samemax-width: 960px; margin: 0 autoenvelope as the.form-gridcards above. Removes the visual rhythm break at the 2-col → full-width transition. The popup surface is unchanged. - Documentation refreshed for v0.5.0 (doc audit, 14 findings).
ARCHITECTURE.mdnow describes four codebases (therelicario-serverpre-receive hook crate is no longer invisible);CLAUDE.mdproject tree and roadmap reflect current state;docs/SECURITY.mdnames the server crate and itsverify-commit/generate-hooksubcommands and notes the without-the-hook-it's- advisory caveat;docs/ARCHITECTURE.mdshowssettings.encas a parallel artifact in the vault-creation flow; the foundational design spec gains a "historical" status banner pointing readers at the current docs. relicario generatenow consultsVaultSettings.generator_defaultswhen invoked inside an initialized vault. Explicit flags (--length,--bip39,--words,--symbols,--separator) override the vault default. Outside a vault, behavior is unchanged (length 20, safe symbol set, 5 BIP39 words, space separator).
Known limitations
- Mid-restore failure leaves the target remote in a half-written
state.
cmd_backup_restoreand the vault-tab Restore panel both write artifacts sequentially viawriteFileCreateOnly. If the process is interrupted partway, a retry against the same remote refuses to clobber. Workaround: delete the partial repo and retry. - Cross-tool backup compatibility. CLI-exported backups stored
attachments at
<item_id>/<aid>.enc; extension stores at flat<aid>.bin. The.relbakenvelope canonicalizes to<item_id>/<aid>keys and each tool translates at the boundary. Round-trip works in both directions.
Internal
- 5 stale local feature branches and 3 worktrees pruned (audit C1).
- Pre-existing clippy warnings cleaned up across
relicario-{core,cli}(deref operators,Option::is_none_orovermap_or(true, ...),iter_mut().enumerate()patterns,div_ceil()) so the workspace builds clean under-D warnings. Cargo.lockregenerated and committed; was stale since the--totp-qrcommit.- Refactored
cmd_addandcmd_editin the CLI: eachItemCorevariant now has its ownbuild_*_item/edit_*helper. Pure mechanical extraction; behavior unchanged. The dispatcher matches and delegates. - Extracted pure helpers (
escapeHtml,ratePassphrase,scheduleRate,entropyText,STRENGTH_LABELS) fromextension/src/setup/setup.tsintosetup-helpers.ts. State-coupledupdateStrengthUistays insetup.tssince it walks live wizard state. Setup.ts went from 1205 → 1137 lines.
v0.2.0 — 2026-04-27
Fixed
- Setup wizard could silently overwrite an existing vault. Pointing the
wizard at a remote that already contained a Relicario vault would clobber
manifest.enc,.relicario/salt, and friends with no warning. The wizard now probes the remote after the connection test and refuses to create a new vault on top of an existing one. Affected users whose vault was wiped by this bug should restore from the git history of the affected repo (git log+git checkout <pre-init-sha> -- .). - New devices registered during initial setup were silently dropped. The
wizard's Step 5 fired
add_deviceover a service-worker channel that required an unlocked vault, which is unavailable mid-wizard. Device pubkeys now write directly to.relicario/devices.jsonfrom the wizard. - Wizard-created vaults were missing
settings.enc. The CLI'sinitwrites a default-VaultSettingssettings.encalongsidemanifest.enc, but the wizard skipped it, causing everyget_vault_settingsSW call to 404. The wizard now encrypts and writessettings.encusing a newdefault_vault_settings_jsonWASM helper that keeps defaults in sync with Rust core.
Added
- Attach this device to an existing vault — purely from the GUI. New Step 0 mode picker splits the wizard into "create new vault" and "attach this device." The attach path takes a passphrase + reference image, fetches the existing manifest, verifies the credentials by decrypting it, and only then registers a new device key. No CLI required for multi-device setup.
GitHost.lastCommit(path)andGitHost.writeFileCreateOnly(path, ...).default_vault_settings_json()WASM export.
v0.1.0 — 2026-04-22
Initial release.