SecretSpec
SecretSpec separates secret declaration from
secret provisioning. You define the secrets that your application needs
in a secretspec.toml file and each developer, CI system, and
production environment can provide those secrets from their preferred
secure provider.
Quick Start
Follow the SecretSpec quickstart guide.
Runtime Loading (Best Practice)
While you can enable SecretSpec in devenv to load secrets into the
secretspec.secrets option, we recommend that you:
a) Use the Rust SDK to load secrets in your application code
b) Load secrets at runtime and expose them only to the processes that need them
$ devenv shell$ secretspec run -- npm start
Terminal window
The secretspec command is included with devenv, so no separate
installation is needed. When the integration is enabled, devenv also
exports the resolved profile as SECRETSPEC_PROFILE. If you explicitly
select a provider through devenv, it also exports that override as
SECRETSPEC_PROVIDER. Consequently, secretspec run uses the same
explicit overrides that devenv used while evaluating devenv.nix. When
no provider override is selected, SecretSpec commands remain free to use
the per-secret provider routes from secretspec.toml.
!!! tip “New in version 2.2.2”
devenv no longer infers `SECRETSPEC_PROVIDER` from the provider that happenedto resolve secrets during evaluation. It only exports an explicitly selectedprovider override, preserving per-secret provider and fallback chains.
This approach:
- Keeps secrets out of your shell environment
- Reduces exposure of sensitive data
- Makes secret rotation easier
- Follows the principle of least privilege
Configuration (Optional)
If you do need secrets in your devenv environment, you can configure via
devenv.yaml or CLI flags.
Via CLI flags (devenv 2.0+)
Override the provider and profile directly from the command line:
$ devenv --secretspec-provider dotenv --secretspec-profile dev shell
Terminal window
This automatically enables secretspec. You can also use environment variables:
$ SECRETSPEC_PROVIDER=dotenv SECRETSPEC_PROFILE=dev devenv shell
Terminal window
Via devenv.yaml
secretspec: enable: true provider: keyring # keyring, dotenv, env, 1password, lastpass profile: default # profile from secretspec.toml
devenv.yaml
CLI flags take precedence over devenv.yaml values.
The resolved profile applies both while evaluating devenv.nix and to
secretspec commands run inside the development shell. An explicitly
selected provider does too. If you omit the provider, SecretSpec uses
the provider configuration in secretspec.toml for both. You can access
the resolved secrets in devenv.nix:
{ config, ... }:
{ env.DATABASE_URL = config.secretspec.secrets.DATABASE_URL or "";}
devenv.nix
Cachix auth token
To make the Cachix auth token a built-in required secret, without
declaring it in secretspec.toml, set secretspec.cachix_auth_token to
true:
secretspec: enable: true provider: keyring cachix_auth_token: true
devenv.yaml
This uses the secret name CACHIX_AUTH_TOKEN. If your provider’s policy
(e.g. an OpenBao/Vault policy) only grants access to a secret under a
different name, set the option to that name:
secretspec: enable: true provider: openbao cachix_auth_token: MY_TEAM_CACHIX_TOKEN
devenv.yaml
The string is the secret name, not the token itself. Set the option to
false or omit it to disable the built-in requirement. Only the
SecretSpec lookup is renamed: the environment variable and the Cachix
push daemon still use CACHIX_AUTH_TOKEN, which is what the Cachix CLI
reads.
Learn More
- SecretSpec
- Providers - Keyring, 1Password, dotenv, and more
- Profiles - Environment-specific configurations
- Rust SDK - Type-safe
Last updated Oct 08, 2026