Changelog
Release history for TinyVault. Full notes and binaries are on the GitHub releases page; the canonical source is CHANGELOG.md in the repo.
Install or upgrade:
brew upgrade --cask tvault # Homebrew
go install github.com/abdul-hamid-achik/tinyvault/cmd/tvault@latestIf tvault was installed from the retired formula, migrate once with brew uninstall --formula tvault, then run brew install --cask abdul-hamid-achik/tap/tvault.
Unreleased
0.21.0 — 2026-08-01
Added
npm distribution.
npm install -g @thelacanians/tinyvaultinstalls the same binaries as the GitHub release, through per-platform packages and a thin spawn shim — andnpx -y @thelacanians/tinyvault mcpbecomes a zero-install MCP server command for hosts that prefer it.bashnpm install -g @thelacanians/tinyvault
Fixed
The "vault is locked" error stopped blaming the agent. Run non-interactively with no passphrase, it used to say "set TVAULT_PASSPHRASE, start 'tvault agent', or run in a TTY" — to everyone, including people whose agent was already running and could never satisfy the command:
bashtvault run --only API_KEY -- tvault get API_KEY # works, served by the agent tvault run --only API_KEY -- tvault set PROBE x # "vault is locked" (exit 3)Two deliberate boundaries meet there. The agent serves reads only and never hands out the key, so writes need the passphrase whether or not it is running; and a child of
tvault run(or MCP exec) inherits noTVAULT_*variable, so the parent's passphrase never reaches it. The error now says which applies and what would actually work, rather than sending you to debug a healthy socket.Nothing about the behaviour changed — nested reads still work through the agent, nested writes still need their own credential. Making the nested write "work" would have meant a write operation on the agent socket (any process running as you could then rewrite your vault) or forwarding the passphrase to children (handing a wrapped process the whole vault after you narrowed it with
--only). Both are worse than the error message was. See Troubleshooting.
0.20.2 — 2026-07-26
Fixed
tvault agent installrecorded the resolved binary path, which on Homebrew points into a version-pinned directory. The nextbrew upgradedeleted it, so the service silently stopped starting —launchctl bootstrapstill succeeded andtvault agent restartreported success. The stable symlink is now recorded, and bothrestartandstatusreport a missing binary instead of claiming everything is fine.After upgrading, re-run
tvault agent installonce to rewrite the definition:bashbrew upgrade --cask tvault tvault agent install --passphrase-file ~/.config/secrets/env
0.20.1 — 2026-07-26
Fixed
tvault studiono longer holds the vault database open for the whole interactive session. bbolt takes a process-wide exclusive lock, so every othertvaultinvocation on the machine failed while the studio was open. It now caches only the KEK and reopens the vault per operation — the same pattern the local agent uses — so a reopen costs a file open rather than re-deriving the key. No TinyVault surface holds the lock across a long-lived session anymore.
Added
- The studio's status pane reports the local agent (pid, time to idle-lock) and the installed service (launchd/systemd, and whether it is registered). This is read-only: it dials the socket and stats the definition, and never installs —
tvault agent installremains the only way to write a service.
0.20.0 — 2026-07-26
Added
tvault agent install/uninstall/restartregister the agent as a per-user background service — a launchd LaunchAgent on macOS, a systemd user unit on Linux. Review the generated definition first with--dry-run:bashtvault agent install --dry-run tvault agent install --passphrase-file ~/.config/secrets/env tvault agent restart # after upgrading tvaultThe definition records only the path to a passphrase file, never the passphrase, and is written 0600. The service restarts on failure but not after a clean exit, so the agent's idle auto-lock still takes effect.
TVAULT_PASSPHRASE_FILE(oragent.passphrase_filein~/.tvault/config.yaml) points at an env-style file holdingTVAULT_PASSPHRASE, so the agent can unlock where there is no terminal to prompt at. TinyVault refuses a file that is readable by group or others.Structured agent logging. Logs default to
$XDG_STATE_HOME/tvault/agent.log(0600 inside a 0700 directory) and rotate at 5 MiB. Configure with--log-dir/--log-level,TVAULT_LOG_DIR/TVAULT_LOG_LEVEL, oragent.log_dir/agent.log_level.tvault agent logsprints the path and--clearresets it for a redeploy. Records name operations, projects and key names — never a secret value, passphrase, or capability token.tvault agent statusnow also reports the installed service and whether it is registered with the service manager.
0.19.1 — 2026-07-26
Fixed
tvault runno longer holds the vault database open while the child process runs. bbolt takes a process-wide exclusive lock, so wrapping a long-lived process (an MCP server, a dev server) made every othertvaultinvocation on the machine fail for as long as that child lived. The lock is now released before the child starts.- A busy vault is no longer reported as a missing one.
tvault studio,unlock,lock, androtateclaimed the vault was absent and pointed attvault initwhen the real cause was another process holding the lock. - The "vault is locked by another tvault process" message no longer suggests
tvault agent start(circular when that was the failing command); it points atpgrep -fl tvaultinstead. - An interactive passphrase prompt no longer holds the lock while waiting for input.
0.19.0 — 2026-07-24
- Recipient identities can now resolve
env --group/--envandrun --group/--env. The identity must be shared to every participating project; selector reads still decrypt only the requested values,--strictstill fails before a child starts, andTVAULT_*controls remain stripped from child environments. - Added
tvault run --identity <name>for recipient-backed, passphrase-free command injection.run --only/--prefixnow decrypt only selected values across direct, inherited-group, recipient-identity, and local-agent reads;--strictremains fail-closed for missing exact keys. - The local agent now has a validated
getselectedread operation, and child processes receive noTVAULT_*controls before selected values are injected. - MCP policy loading and environment inheritance now fail closed: explicit policies must be complete, empty allowlists and zero read caps deny access, inherited base projects are checked, and plaintext export requires write permission.
- Existing vault permissions are normalized on open, non-regular database paths are rejected, and
golang.org/x/textis updated tov0.39.0.
0.18.2 — 2026-07-19
- Windows builds work again: the non-Unix agent client now includes the project-scoped status probe and continues to fail closed with
ErrUnsupportedPlatform. - CI compiles all six Linux, macOS, and Windows targets that GoReleaser ships, so platform-only API drift is caught before tagging.
0.18.1 — 2026-07-19
tvault status --jsonaddsagent_accessible, separating “the local socket exists” from “this process can use it for the selected project with its current token.”lockednow stays true when a token-required agent is running but the token is absent, invalid, or scoped to another project. The check remains lock-free and never reads a secret.- The release workflow is pinned to GoReleaser v2.17.0.
0.18.0 — 2026-07-16
- The MCP initialize handshake now reports the real build version instead of a hand-edited literal that had shipped stale in at least two prior releases.
- README's MCP tools table covers all 49 tools, anchored to the canonical tools reference.
- CI and release workflows pin GitHub Actions to verified commit SHAs (the release workflow produces the checksums
tvault self-updatetrusts). - Changelog sections backfilled for v0.11.1 through v0.15.0, with retro-bundled 0.16.0 bullets moved to the releases that actually shipped them.
0.17.2 — 2026-07-13
Fixed
- CLI secret-source flags now fail closed before reading a dotenv file, contacting the agent, opening the vault, or launching a child process. Ambiguous
getmodes, incomplete--group/--envpairs, group selection withrun --no-vault, and group selection mixed with identity mode are rejected explicitly. - Homebrew install and upgrade examples select the maintained cask explicitly.
- The MCP handshake now reports version 0.17.2.
0.17.1 — 2026-07-13
Fixed
get --group ... --env ...bypasses the direct-project agent fast path and resolves the requested environment through the unlocked vault, preventing a value from the current project from being returned for a grouped lookup.
0.17.0 — 2026-07-11
Security
- The production MCP server now fails closed without an explicit access policy: project/status metadata remains available, while secret reads, writes, and command execution are denied.
- MCP secret allowlists and per-session value-read limits are enforced.
- CLI- and MCP-launched child processes no longer inherit TinyVault control credentials (
TVAULT_PASSPHRASE,TVAULT_IDENTITY_KEY, orTVAULT_AGENT_TOKEN).
Maintenance
- CI is pinned to Go 1.26.5 and Goldmark is upgraded to 1.7.17.
0.16.0 — 2026-07-07
Added
- Lock-free, value-free enumeration + a deterministic "vault locked" signal — lets a non-interactive agent enumerate and probe the vault without a passphrase and without ever seeing sensitive free text:
tvault projects list --json --names-onlyandtvault list -p PROJECT --json --names-onlywork on a locked vault;tvault status --jsonaddslockedandagent_running; and unlock-requiring commands run non-interactively fail fast with exit code3and{"error":"vault_locked","locked":true}under--jsoninstead of prompting.
Changed
- Homebrew distribution migrated from the retired formula to a cask, and raw versionless binaries are published for direct download.
0.15.0 — 2026-06-26
Added
- Environment groups in studio — env-name annotations (
·production,·preview) for grouped projects,gcycles between environments in a group, inherited (←) and pinned (◈) markers with inheritance-aware reveal/copy,Dopens a key-set drift overlay across environments (no decryption needed), andGopens a groups list overlay. All read-only (work without--rw) and metadata-only (work when locked). See Studio.
0.14.0 — 2026-06-25
Added
- Environment groups / profiles — link projects as named environments (production, preview, staging) of the same application. Pure metadata; each environment keeps its own DEK. See Environment groups.
tvault env group create/list/show/add/remove/deletefor group membership.tvault env diff— key-set (and optional value) drift across environments.tvault env promote— copy a value between environments, versioned and audited (secret.promote).tvault env inherit/pin/unpin/inherited— metadata-only read-time key inheritance from a base, with per-key pinning.tvault env seal— pack every environment into one recipient-sealed v2 blob (decrypt in CI withdecrypt-env --section <env>).- Group/environment resolution (
--group/--env) on theget,run, andenvcommands. - 13 new MCP tools (
vault_env_group_*,vault_env_diff,vault_env_promote,vault_env_inherit,vault_env_inherited,vault_env_pin,vault_env_unpin,vault_env_seal) — all metadata- or ciphertext-only. Tool count: 36 → 49. See MCP tools reference.
0.13.1 — 2026-06-25
- Changed: documentation housekeeping for the codemap integration — recorded the shipped integration-plan slices and the least-privilege required-keys seal scope; removed the superseded FEATURE.md in favor of SPEC.md.
0.13.0 — 2026-06-24
Added
- Codemap integration — a documented, metadata-first MCP surface for codemap (a local code-graph indexer): rotation blast radius, private-registry LSP creds, env-var audit, credential freshness, and least-privilege seal scope. Most results are metadata, paths, or ciphertext; the private-registry recipe deliberately injects selected credentials into the launched indexer process. See Codemap integration.
Fixed
- Portable run-with-secrets shell tests (POSIX
printenvper key, fixing macOS flakiness).
0.12.0 — 2026-06-21
Added
tvault self-update(aliasupgrade) — checksum-verified in-place binary update from the official GitHub releases.--checkreports availability without installing;--version vX.Y.Zpins/downgrades. Replaces the removedinstall.sh. See CLI reference.tvault run --only/--prefix— least-privilege secret injection: expose only the named or prefixed keys to the child process.pulumi-configenv export format plus a Pulumi/IaC guide.- Server install script and a DigitalOcean/SSH server-secrets guide.
Fixed
tvault mcpnow coexists with the CLI: the server reopens the vault per request instead of holding bbolt's exclusive lock for its lifetime, sotvault set/get/run/importkeep working while the MCP server runs.
0.11.1 — 2026-06-20
- Added: documentation site pages — "For AI Agents" (with
llms.txt), Troubleshooting & FAQ, this Changelog page, and MCP Recipes; plus the repo's CHANGELOG.md through v0.11.0. - Fixed: agent-facing manifest drift and the homepage tool count.
0.11.0 — 2026-06-20
Added
- 15 new MCP tools (21 → 36), all metadata- or ciphertext-only.
vault_get_secretremains the dedicated plaintext-read tool; separately, command execution can relay child-process output:- Navigation & discovery:
vault_get_current_project,vault_set_current_project,vault_count_secrets,vault_search_projects,vault_projects_overview,vault_list_secrets_detailed,vault_list_secrets_global. - Sharing:
vault_share_project,vault_unshare_project,vault_project_recipients. - .env:
vault_diff_env,vault_sync_env,vault_export_env_encrypted. - Identities:
vault_identity_new,vault_identity_list— public recipient only; the private key is never returned.
- Navigation & discovery:
- This documentation site (built with VitePress, deployed at tinyvault.dev).
Changed
- The MCP command is now
tvault mcp(wasmcp-server, kept as an alias) and is no longer hidden. - Upgraded the MCP SDK to
modelcontextprotocol/go-sdkv1.6.1.
CI/maintenance
- GitHub Actions bumped to Node 24 runtimes;
golangci-lint/govulncheckpinned; the Security Scan now fails on a called vulnerability.
See the new MCP Recipes for end-to-end agent workflows using these tools.
0.10.1 — 2026-06-15
- Fixed: studio
--rwedit input sizing (placeholder/value render).
0.10.0 — 2026-06-15
- Changed: the
browsecommand is nowstudio(browse/uikept as aliases). - Added: broad end-to-end PTY test coverage for every CLI command and studio interaction.
0.9.0 — 2026-06-14
- Added: X25519 recipient layer +
tvault identity; project sharing with key rotation on live-vault recipient removal (retained snapshots and artifacts remain readable);.env.encryptedv2 (commit-safe);tvault git-filter;tvault seal/open; per-context identity transport (TVAULT_IDENTITY_KEY); Kubernetes commit-safe SealedSecrets; versioned secrets + rollback; the localtvault agent+ shell hooks;vault_seal_for_recipients;tvault diff;tvault doctor; studio--rwmode.
Earlier
See the GitHub releases for v0.8.0 and earlier.