Repository navigation
Releases
v1.5.2 — v1.5.2 — dashboard renders everything in tables
feat: dashboard renders everything in tables (v1.5.2)
Replace the per-vault mini-tables + loose text with a single flat
Lipgloss table per section. Each vault contributes rows — team vaults
get one row per member, personal vaults get a single summary row.
Columns: Vault | Member | Access | Scopes | Sync | Size
Before: 7 vaults rendered as 7 separate blocks with "No team members"
text between each, taking ~40 lines. After: one clean table, ~15 lines.
Empty sections (SHARED WITH YOU / LEGACY DIRECT SHARES) are hidden
entirely when there's nothing to show.
Legacy direct shares now render as a table too (Vault | User | Status |
Direction) instead of a plain "outgoing: N pending: M" line.
v1.5.1 — v1.5.1 — dashboard sync status
feat: dashboard shows sync status + local-only vaults (v1.5.1)
Each vault row now shows its sync state alongside the member table:
production 2 members · owner @nauman · synced 2026-04-12 · 4.7 KB
Three sync states match localvault sync status:
- "synced YYYY-MM-DD" — vault exists both locally and on InventList
- "remote only" — on InventList but not pulled to this machine
- "local only — not synced" — on disk but never pushed
Local-only vaults (exist on disk, not on the server) now appear under
OWNED BY YOU with a "local only" badge so you can see them and decide
whether to push. Previously they were invisible to the dashboard.
Size is shown when the server reports it (e.g. "4.7 KB").
3 new tests: synced-with-date, remote-only, local-only.
Suite: 507 → 510 runs, 0 failures.
v1.5.0 — v1.5.0 — localvault dashboard
feat: localvault dashboard — aggregate team access view (v1.5.0)
Before v1.5.0 there was no way to answer "who has access to what across
all my vaults" in a single command. team list [VAULT] showed one
vault; sync status showed sync state not access. Users had to loop
over every vault by hand.
localvault dashboard does the aggregation in one call:
OWNED BY YOU — team vaults where you are the owner, rendered
as a Lipgloss table per vault listing every
member with their Access (full/scoped) and
Scopes columns.
SHARED WITH YOU — team vaults where someone else is the owner
and you are a member. Same table shape so you
can immediately see whether your access is
full or scoped and to which keys.
LEGACY DIRECT SHARES — pre-v1.2 one-shot direct-share counts
(outgoing + pending). Shown for completeness;
users are pointed at receive / revoke.
v1.4.0 — v1.4.0 — transactional rotate + scoped sharing efficiency
feat: transactional rotate + scoped sharing efficiency (v1.4.0)
Addresses the two remaining medium audit findings. Also fixes a latent
bug in scoped-member rotation that the old code never actually exercised.
Finding #5 — transactional rotate
Before: team rotate and remove --rotate wrote new ciphertext + meta
to local disk and THEN pushed to the remote. A network / 5xx failure
on push left local rotated but remote stale. Especially bad for
revocation: the user sees "success" but the removed member still has
access on the remote bundle.
After: build the full new bundle (new_secrets_bytes, new_meta_bytes,
new_slots, packed JSON) entirely in memory, push to the remote FIRST,
only commit to local disk once push succeeds. If anything goes wrong
the user can retry with the same passphrase.
Finding #6 — scoped sharing inefficiency + empty test file
v1.3.5 — v1.3.5 — close audit gaps in CLI help + reference doc
docs: close audit gaps in CLI help + reference (v1.3.5)
Audit found that several command surfaces were registered in code but
missing from the rendered localvault help and the published CLI
reference doc. Close every gap.
CLI help (localvault help):
- Add explicit
localvault sync SUBCOMMAND,localvault team SUBCOMMAND, andlocalvault keys SUBCOMMANDlines pointing at
localvault help <namespace>so users discover the registered
Thor namespaces, not just the highlighted commands inside them. - Mention the backward-compat
team add/remove/verifyaliases inline
under TEAM SHARING (they exist for muscle-memory but the top-level
forms are preferred). - Split the old "TEAM & SYNC" combined section into separate SYNC,
TEAM SHARING, and KEYS sections — much easier to scan. - Add
[VAULT]toteam init,team list,team rotateto reflect
the v1.3.1 positional-vault support.
v1.3.3 — v1.3.3 — auto-prompt for passphrase in team commands, remove connect
feat: team commands auto-prompt + remove dangerous connect (v1.3.3)
The big UX fix users kept hitting:
-
team init/team rotate/add/remove --rotateno longer
require a separatelocalvault unlockstep. If the vault isn't
cached in the session, they prompt for the passphrase inline (same
UX assync pull). This is done via a new shared
TeamHelpers#ensure_master_keythat delegates toVault.openand
verifies by calling.all. -
Fix the
team initsuccess hint that still said
"Next: localvault team add @handle -v VAULT". It now says
"Next: localvault add @handle -v VAULT" to match the v1.3.0 top-level
command surface.
Security / cleanup:
- Remove the
connectcommand entirely. It took the API token as a
command-line argument (→ shell history), didn't validate the token,
v1.3.0 — v1.3.0 — move add/remove/verify to top-level CLI
feat: move add/remove/verify to top-level CLI (v1.3.0)
The @ prefix already signals a person operation, so localvault team add @bob
was redundant. Promote add, remove, and verify to top-level commands while
keeping team init, team list, and team rotate under the team subcommand
(those are vault-level operations).
- Extract shared helpers to
lib/localvault/cli/team_helpers.rb(new module,
included in both CLI and CLI::Team) - Move add/remove/verify implementations to cli.rb
- Keep
team add/remove/verifyas backward-compat delegators in cli/team.rb - Update help text, README command tables, and session/scenario references
- Add tests for top-level verify (4 cases) and backward-compat for each alias
v1.2.4 — bump: v1.2.4
v1.2.0 — docs: add RDoc to remove_key_slot private method
docs: add RDoc to remove_key_slot private method
v1.1.0 — fix: require 'time' for Time#iso8601 on Ruby 3.3
fix: require 'time' for Time#iso8601 on Ruby 3.3