Skip to content

Comparison

SecretSpec is the application-facing layer of a secrets system. It defines what an application needs, resolves those requirements across environments, and delivers the resulting values through its CLI and provider-independent SDKs. Providers connect that layer to concrete value sources. Depending on the backend, they can add secure storage, identity, access control, availability, and provider-native operations.

This separation keeps secretspec.toml portable. A developer can use the system keyring, CI can supply environment variables, and production can use Vault or a cloud secret manager without changing the application’s secret contract.

secretspec.toml SecretSpec Provider
what the app needs → resolve · check · deliver ← provider-backed values
route · audit source · access
ResponsibilitySecretSpecProviders augment SecretSpec with
Application secret contractDeclares names, descriptions, requirements and defaults, generated values, and composed valuesSupply provider-backed values named by that contract
EnvironmentsDefines portable profiles, configuration inheritance, and profile-specific requirementsAdd provider-native projects, vaults, paths, or environments
Preflight validationcheck validates required secrets and configuration before the application startsReport whether a requested value exists or can be accessed
Provider selectionRoutes each secret independently through provider aliases and ordered fallback chainsSupply concrete sources and destinations
Existing provider-native secretsUses secret references to give an existing value a stable, application-facing nameInterpret provider-specific coordinates such as vault, item, field, path, or version
Application deliveryResolves secrets through the CLI, exports environments, starts child processes, and manages temporary filesSupply values through provider APIs or clients
Application SDKsOffers one provider-independent resolver with a shared runtime API and typed access across supported programming languagesVendor SDKs, when available, remain backend-specific; applications do not need to integrate them directly
AuditRecords local, metadata-only access events by default, including application context and optional reasonAdd centralized, provider-side access records where supported and configured
Encryption at restDelegates protection of provider-backed values to the selected providerProtect values when the backend supports encryption; dotenv and environment providers add no at-rest encryption
Identity and access policyUses the credentials available for the selected provider, including credentials sourced from another providerEnforce users, roles, service identities, policies, and sharing
Availability and retentionDelegates these guarantees for provider-backed valuesMay provide synchronization, replication, versions, backup, or retention, depending on the provider
Dynamic secrets and credential rotationRoadmap; not currently available and has no assigned target releaseProvide native lifecycle features where available; use them outside SecretSpec today

The distinction is intentional: SecretSpec provides portable application semantics, while each provider determines how its provider-backed values are stored, protected, and operated. Some providers, such as dotenv and environment variables, intentionally provide fewer safeguards. SecretSpec’s default audit log complements provider logs by recording the project, profile, secret name, outcome, actor, and reason seen by the application workflow. It is a size-bounded, best-effort local log, not a replacement for central compliance records.

See Available providers for the provider comparison, including storage backend, read and write support, encryption at rest, and TPM-backed keys.

Providers can be mixed within one project. For example, an application can read a shared credential from 1Password in the production profile, read the same secret from the system keyring in the development profile, and accept a deployment token from the environment in CI. A secret can also define an ordered fallback chain, which tries the next provider when an earlier provider does not return the value. SecretSpec keeps those storage decisions outside the application’s code.