Release Notes
SecretSpec 0.21 lets other programs request only the secrets they need, lets
providers run outside SecretSpec, and preserves binary values from storage to
the consuming application. It also adds Doppler and Tailscale Setec providers,
project-wide provider defaults, and a Claude Code credential integration.
Changed
-
Cached values use a new format to preserve binary secrets. Existing cache
entries remain readable by 0.21. SecretSpec 0.20 and earlier cannot read new
entries; they fall back to the original provider and leave those entries
untouched. Avoid sharing a cache store between 0.20 and 0.21 clients. -
Command-generated values now include all stdout bytes, including spaces
and a final newline. For example,openssl rand -hex 32produces a value
ending in\n; trim it in the command if that is unwanted. Existing stored
values do not change. Empty or whitespace-only output is still rejected. -
Piped
secretspec setinput remains trimmed text. Use--from-file -
when whitespace or non-UTF-8 bytes must be preserved from stdin. -
secretspec getno longer adds a newline when writing to a pipe or file.
This makes redirects preserve the exact value. Terminal output still ends in
a newline; shell command substitution behaves as before. -
Rust secrets are byte values.
Secrets::setnow takesSecretBytes.
Replaceset(name, Some(value))withset_text(name, &value)for text and
set(name, None)withprompt_and_set(name). Custom providers must update
theirget,set, andget_manyimplementations to useSecretBytes;
Provider::namenow returns&str, andgenerator::generatereturns bytes. -
Building the new C resolver client requires system yyjson. Meson finds it
through pkg-config and CMake throughfind_package(yyjson CONFIG). Static
consumers must link-lyyjson;secretspec-resolver.pcrecords the dependency.
Added
-
Resolve secrets from another process.
secretspec serveexposes a
private, versioned stdio protocol so an application can request one declared
secret without loading the whole manifest into its own process. It can return
a value or a temporary file that is cleaned up when the session ends. Clients
can also answer prompts, store or delete declared secrets on the same provider
route, and receive expiry and revision information for their own caches.
secretspec serve --read-onlyrefuses operations that would write, including
generation and prompting when they would store a value. Applications can use
the Rustsecretspec-ipccrate (async or blocking), the C
libsecretspec-resolverlibrary, or the protocol directly. Rust clients can
also connect over SSH or an existing authenticated stream. -
Install providers outside the SecretSpec release cycle. Trusted external
executables can register as providers and serve a versioned provider protocol.
They can describe their capabilities, request credentials for their own URI,
and return an interaction reference that appears in the audit log for an
approval flow.secretspec config provider loginandsecretspec setcan
collect missing credentials. SecretSpec passes each endpoint only the
base environment plus the variables it declared, keeping other providers'
tokens separate. -
Keep binary secrets intact. Providers, fallback chains, imports, and the
cache now preserve arbitrary bytes. Usesecretspec set NAME --from-file FILE
(or--from-file -for stdin) to store exact bytes, andas_path = trueto
pass them to an application through a temporary file. The file, systemd
credential, environment, keyring, Google Secret Manager, Kubernetes, and
Scaleway providers support binary values; AWS Secrets Manager also supports
SecretBinary. Rust callers can useresolve_bytes()and
resolve_named_bytes(). Text-only outputs report a UTF-8 error naming the
secret. On Unix,runpasses non-UTF-8 values to child processes; it rejects
NUL bytes before launching them. -
Doppler provider (
doppler://PROJECT[/CONFIG]): read, write, delete, and
discover secrets in an existing Doppler project. It keeps names unchanged so
secrets remain usable in the Doppler dashboard anddoppler run. The active
SecretSpec profile selects the Doppler config unless the URI pins one.
Authenticate withDOPPLER_TOKENor atokenprovider credential. Doppler
restrictions and values it cannot store unchanged are reported as errors. -
Tailscale Setec provider (
setec://): read, write, delete, and discover
secrets through a tailnet-authenticated Setec server. It supports binary
values and reads pinned to a Setec version. -
Set a project-wide provider chain with
[defaults].providers. Secrets
without their own or a profile-level chain use this default, so a checked-in
manifest can refer to an alias that each developer maps to their preferred
store. User-global aliasreftemplates can expand{project},{profile},
and{key}. Native SDK inline declarations support this through schema v2;
v1 declarations still work. -
Use SecretSpec credentials with Claude Code.
secretspec claude configure
installs anapiKeyHelperthat retrieves Anthropic API or gateway credentials
from any provider.loginandlogoutmanage them by settings scope and API
resource;unconfigureremoves the managed helper without replacing unrelated
settings. Repository, user, worktree, andCLAUDE_CONFIG_DIRsettings are
supported. -
Get editor help for configuration. Export JSON Schemas for
secretspec.tomland userconfig.tomlwithsecretspec schema --config projectorsecretspec schema --config globalfor autocomplete, field
descriptions, and validation. -
Generate OpenPGP and OpenSSH private keys. Use
type = "openpgp_private_key"withgenerate.user_id, or
type = "ssh_private_key". Both generate modern keys by default and offer
RSA for compatibility; OpenPGP keys can be limited to signing or encryption. -
Target a specific Bitwarden item by UUID when several items share a name.
Reads and writes accept the UUID, and imports reject duplicate item fields
before making changes. -
Declare JVM SDK secrets inline with
withInlineSpecinstead of requiring
a manifest file.
Fixed
-
Stalled HTTP providers fail in bounded time. Vault, OpenBao, Infisical,
Cloudflare, Scaleway, Azure App Configuration, Doppler, and Setec use a
10-second connection timeout and a 60-second request timeout. Vault and
OpenBao now retry timed-out requests as configured. -
macOS keyring access no longer asks for the login keychain password on
every run after an upgrade. A new build may ask once per existing item;
choose "Always Allow" to keep later runs of that build quiet. Reads preserve
the item and its access settings, even if access is denied. -
KeePassXC KDBX 4.0 files can be written. SecretSpec upgrades them to
KDBX 4.1 on write while preserving their encryption and key-derivation
settings. -
Bitwarden reads are faster and more consistent. A batch uses one vault
listing, and a single read falls back to the full listing if Bitwarden's
search returns only similarly named items. -
pass, gopass, and LastPass handle whitespace and multiline values more
reliably. The pass provider removes one final newline added by thepass
CLI on read. Existing gopass text entries still return their trimmed first
line until rewritten; new values requiring exact bytes use its binary-entry
format. Ordinary single-line gopass values remain readable by older tools.
LastPass rejects NUL bytes before writing rather than silently truncating
them. -
Cache planning avoids unnecessary provider reads and refuses a cache
that would point to the same physical secret as its source under the active
profile, preventing an overwrite or deletion of the source value.
Install secretspec 0.21.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/cachix/secretspec/releases/download/v0.21.0/secretspec-installer.sh | shDownload secretspec 0.21.0
| File | Platform | Checksum |
|---|---|---|
| secretspec-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| secretspec-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| secretspec-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| secretspec-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| secretspec-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
| secretspec-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| secretspec-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |