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
npm install -g @thelacanians/tinyvault@latest # npm
go install github.com/abdul-hamid-achik/tinyvault/cmd/tvault@latest # Go, from source
tvault self-update # downloaded release binarytvault self-update verifies the release checksum before replacing the binary and is meant for a binary you downloaded yourself; keep Homebrew, npm, and distro packages on their own package manager. See Install & quickstart for every install option.
If 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
Changed
- Desktop release artifacts are now built one Windows architecture per invocation, so a release carries
-win-x64.exeand-win-arm64.exeonly. Given both arches at once, electron-builder's NSIS target also emits a combined installer whose${arch}is empty — v0.25.0 therefore has a redundant 211 MBTinyVault-0.25.0-win.exebeside the two named ones. It is not produced from the next release.
0.25.0 — 2026-10-01
Added
- Desktop app (
app/): an Electron GUI overtvault mcp— secrets with per-field reveal, create/edit/delete and random generate, a sortable table and empty-vault onboarding, version history and rollback, cross-project search, the audit log with server-side time-range, action, and resource-type filters, environment groups (create by linking existing projects, drift matrix, promote with dry-run, add and remove environments, delete a group, inheritance, pin/unpin), sharing (identities, recipients, share/revoke, seal to a commit-safe v2 blob, open a sealed blob back to a0600file), a.envscreen (discover dotenv files in a folder, preview then run an import, diff against a project, sync pull/push/mirror, export plaintext or encrypted), and vault snapshots (write, list, restore). It is a front end, not a second implementation: it spawns the CLI and speaks JSON-RPC over stdio, and never opensvault.db, so the Go process keeps sole ownership of the crypto, the audit log, and the single-writer bbolt lock. The renderer is sandboxed (no Node, no filesystem, no navigation,window.opendenied), values auto-hide after 30s, the clipboard self-clears, screen-capture exclusion engages only while a value is on screen, and the passphrase never reaches the renderer. It cannot author a file path either: every read or write target comes from an OS dialog answered in the main process, or from a dotenv file the server discovered inside a folder you picked, and main refuses any path it did not issue. See Desktop App. - Desktop release artifacts. Each
v*release now also carriesTinyVault-<version>-mac-{arm64,x64}.dmg,-linux-{x86_64,arm64}.AppImage, and-win-{x64,arm64}.exe, built from the same tag as the CLI. They are unsigned and unnotarized and have no auto-update, so Gatekeeper and SmartScreen warn until you clear them — the desktop guide has the exact steps. The app does not bundle the Go binary; it resolvestvaultat runtime, so install the CLI as well. --jsonfortvault backup,tvault restore, andtvault key rotate, with metadata-only shapes ({path, bytes, raw_bytes, compressed, immutable, created_at},{restored, source, vault_dir, saved_snapshot, restored_at}, and{rotated, vault_dir, rotated_at}), recorded in thetvault docs featuresmanifest. Snapshots are copied as opaque bytes and never decrypted, so there is no value to leak. Passphrase prompts and warnings (for example,--immutablenot applied on this platform) go to stderr so stdout stays a single JSON document, andrestore --jsonrequires--yesbecause a confirmation prompt cannot be answered on a machine-readable stream.
Changed
- Every remaining
--jsonwriter (list,projects,search,status,sync,diff,doctor, the locked-vault envelope,help,docs) now goes through one encoder —writeJSON, with HTML escaping off — so&,<, and>are emitted verbatim instead of arriving as HTML escapes. ADATABASE_URLwith a query string was previously corrupted in JSON output.tvault sync --jsonalso reports snake_case fields and names its direction.
Fixed
vault_env_sealignored itsoutput_path. The handler set the path, then overwrote it with an empty string and returned the whole sealed blob as base64 anyway — so a caller that asked for a file got ciphertext in the conversation instead, contradicting the tool's documented contract and diverging fromvault_seal_for_recipientsandvault_export_env_encrypted, which both write a0600file and return only its path. Ciphertext is not plaintext, so nothing was exposed, but the point ofoutput_pathis to keep the blob out of the model's context. It now writes the file like its two siblings.tvault sync --jsonemitted plaintext secret values.sync.ConflictcarriedVaultValueandEnvValuewith no JSON tags, and the whole result was marshalled to stdout, so both sides of every conflict landed in machine-readable output — against the value-minimisation model in Security. Nothing consumed those fields: the human output and the MCP layer report key + resolution only. They are deleted rather than tagged out, which also keeps the values out of memory after the merge.tvault restoreworks on Windows when a vault already exists (it released the lock too late to rename over the open file), caps gzip expansion at 8 GiB, and names its fallbackvault.db.pre-restore-*copy with millisecond resolution so two quick restores cannot overwrite each other.- Backup rotation matches only the exact names it writes, so a hand-made
vault-*.dbin the backup directory is never pruned; the directory is fsync'd after each rename;--keeprejects negative values; the success line reports the compressed size on disk. tvault env --format shelland thetvault sshscript skip keys that are not valid shell identifiers (defense in depth; keys are validated on write).
0.24.0 — 2026-09-23
Added
- Rotated, compressed backup snapshots:
tvault backup [path] [--dir D] [--keep N] [--immutable]without a path writes a timestamped, gzip-compressedvault-YYYYMMDD-HHMMSS.mmm[-reason].db.gzinto--dir(orbackup.dirinconfig.yaml) and prunes the oldest beyond--keep(orbackup.keep, default 30); rotation only ever touches files it wrote (vault-*.db[.gz]). --immutable/backup.immutable: truemarks rotated snapshots with the macOS/BSD user-immutable flag (chflags uchg), so an accidentalrm -rffails withOperation not permitted;tvault backupclears the flag itself on snapshots it prunes. Unsupported on Linux/Windows (a warning is printed; the snapshot is still written).- Safety snapshots before destructive operations: when
backup.diris configured,tvault delete,tvault projects delete,tvault restore, and the MCPvault_delete_secret/vault_delete_projecttools take a rotated snapshot first (pre-delete,pre-delete-project,pre-restore) and are refused — nothing changes — if that snapshot fails to write. tvault restorenow stages and verifies the incoming backup before touching the current vault, and always saves the current vault first (intobackup.dirwhen configured, else next tovault.dbasvault.db.pre-restore-<time>) before the atomic swap. It also accepts a gzip-compressed backup, auto-detected by magic bytes.tvault doctorgained a backups check: warns whenbackup.dirisn't configured, when it has no snapshots yet, or when the newest snapshot is older than 7 days; otherwise reports the snapshot count and age.- Documented backup scheduling with a macOS launchd example and a Linux systemd
--usertimer example — see Backups & recovery.
Changed
tvault backupnow writes a consistent, transactional snapshot (store.Snapshot, a bbolt read transaction viaTx.WriteTo) instead of a raw byte copy ofvault.db, so a concurrent write from anothertvaultprocess can no longer produce a torn backup. The snapshot is written to a private temp file in the destination directory,fsync'd, verified (opened read-only, core buckets checked), and only then renamed atomically into place at0600— a failed or interrupted backup never leaves a truncated file behind. One side effect: because the audit log usually dominates a vault's size and compresses roughly 10x, a compressed snapshot can be noticeably smaller thanvault.db.
0.23.0 — 2026-09-22
Added
agent.passphrase_command(config.yaml) andTVAULT_PASSPHRASE_COMMANDlet the vault passphrase live in a password manager or the OS keychain instead of a plaintext file — for example 1Password (op read op://…), the macOS Keychain (security find-generic-password -w), orpass. The command runs directly (never through a shell), with stdin closed, output capped at 4096 bytes and time-bounded to 2 minutes, and errors never echo its stdout. A command sourced fromconfig.yamlonly runs when that file is owned by the current user and not writable by group or others.tvault mcpdoes not treat a configured command as a "cheap" unlock source — it prefers a running local agent for reads and only runs the command as the fallback unlock, so an MCP session start does not force a Touch ID prompt.tvault agent installaccepts it as an alternative to--passphrase-fileand warns when the program isn't an absolute path. See Keep the passphrase out of plaintext.tvault shell-init <bash|zsh|fish> --project <name>prints quoted export assignments forevalat shell startup. It never prompts: values come from a runningtvault agent, or — only with--allow-unlock— a non-interactive unlock source. When nothing is available it prints nothing, warns once on stderr (--quietsilences it), and exits0, so a locked vault never blocks a new shell.--only/--prefixnarrow the loaded set.config.yamlnow also resolves from an XDG location ($XDG_CONFIG_HOME/tvault/config.yaml, falling back to~/.config/tvault/config.yaml) when the vault is the default~/.tvault, plus a--config <file>flag andTVAULT_CONFIGenvironment variable. Scratch vaults (--vault/TVAULT_DIR) ignore the XDG location.tvault doctorwarns when both a vault-directory and an XDG config file exist.tvault doctorreports the non-interactive "unlock source" that would be used (environment variable, passphrase command, plaintext passphrase file, or none) without ever running the command or printing a secret; a plaintext file is flagged with a suggestion to move toagent.passphrase_command.
Security
tvault env --format shell,tvault ssh's remote export script, andtvault shell-initnow always single-quote a value that contains a character outside a conservative safe set ([A-Za-z0-9@%+=:,./_-]). Previously, characters such as;,&,|,<,>,(,*,~, and#were left unquoted, so a stored value likea;touch pwnedcould execute part of itself when the caller raneval "$(tvault env)".
0.22.2 — 2026-08-24
Fixed
- Windows npm smoke: do not
process.exit()afterfetch, which aborted with a libuvUV_HANDLE_CLOSINGassert even after the registry wait succeeded.
0.22.1 — 2026-08-24
Fixed
- npm smoke waits for
registry.npmjs.orgto serve the new version (main package and every platform package) and installs with a fresh cache, so a CDN lag cannot cache anETARGETmiss. Ubuntu failed that way on 0.22.0 while macOS and Windows passed. - CI and the release toolchain pin Go 1.26.6 (stdlib fixes that
govulncheckflagged on 1.26.5).
0.22.0 — 2026-08-24
Added
tvault auditlists recent vault audit-log entries (metadata only: action, resource, timestamp). Lock-free; filter with--action,--resource-type,--since,--until,--limit.--jsonavailable.tvault generate KEYstores a cryptographically random secret and prints only metadata. The value is never printed. Same generator as MCPvault_generate_secret.tvault ssh <destination> -- <command>runs a remote command with vault secrets in its environment. Values stream over SSH stdin; they are never written to remote disk and never appear on the ssh command line.tvault docker build/compose/run/initwraps the Docker CLI: BuildKit secret mounts, compose interpolation, anddocker run -e KEY(name only). Values stay off the docker command line.tvault mcp --connectcan serve secret reads through a running local agent so GUI hosts need not storeTVAULT_PASSPHRASE.- MCP
vault_open_sealeddecrypts a recipient-sealed v2 blob and writes a0600dotenv; the tool result is path + key names, never values. tvault run --redactreplaces literal injected secret values in child output with[REDACTED:KEY]. Default is still an unredacted stream.
Changed
- Get, set, delete, project create/delete, rollback, history, and bulk project reads now write the audit log in the vault layer, so CLI, MCP, and the agent share one trail without duplicate rows.
Fixed
tvault env --format jsonandtvault export --format jsonencode the whole object withencoding/json. Control bytes produce valid JSON;&,<, and>stay literal.
Removed
tvault studio(aliasesbrowse,ui) and the Bubble Tea TUI. Browse and mutate with the CLI (status,list,search,get,set,delete,audit,env group,diff) or MCP.
0.21.1 — 2026-08-14
Fixed
- Non-interactive unlock now finds
~/.config/secrets/envwhen neitherTVAULT_PASSPHRASEnorTVAULT_PASSPHRASE_FILE/agent.passphrase_fileis set. GUI-launched MCP hosts do not inherit a login shell, sotvault get/tvault runfrom those children used to fail locked even when the conventional 0600 passphrase file existed. Scratch vaults (TVAULT_DIR/--vault) do not inherit that file.TVAULT_PASSPHRASE_FILEis documented on the environment-variables page.
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).
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.