SecretSpec 0.18: Secret lifecycle, Bitwarden, Keeper, AWS Parameter Store, and Swift | SecretSpec<br>Skip to content
SecretSpec 0.18: Secret lifecycle, Bitwarden, Keeper, AWS Parameter Store, and Swift
Aug 3, 2026<br>Domen Kožar
SecretSpec 0.18<br>ships:
Secret lifecycle commands : add<br>declarations, delete stored values, and move secrets between providers<br>without leaving the source copy behind.
Provider-backed discovery :<br>initialize a manifest from an age file, an AWS Parameter Store hierarchy, or<br>a Bitwarden collection without writing any values to it.
Four new providers : use Bitwarden Password<br>Manager, Keeper Secrets Manager, AWS<br>Systems Manager Parameter Store, and<br>Dashlane through the same CLI and SDK interface.
Swift SDK : resolve manifests natively on macOS<br>through a checksummed XCFramework that includes the shared Rust resolver.
Vault and OpenBao authentication :<br>use custom AppRole and JWT mounts, AppRoles without SecretID binding, and<br>server-configured default JWT roles.
We have a new logo!<br>Section titled “We have a new logo!”
Secret lifecycle commands<br>Section titled “Secret lifecycle commands”
SecretSpec has always kept the declaration in secretspec.toml separate from<br>the stored value. 0.18 brings both sides of that lifecycle into the CLI.
secretspec add adds a declaration to the selected<br>profile while preserving the manifest’s comments, formatting, and unrelated<br>tables:
Terminal window$ secretspec add STRIPE_API_KEY --description "Stripe API access token"
✓ Added secret 'STRIPE_API_KEY' to profile 'default' in secretspec.toml
Set its value with: secretspec set STRIPE_API_KEY --profile default
$ secretspec set STRIPE_API_KEY
Enter value for STRIPE_API_KEY: ********
✓ Secret 'STRIPE_API_KEY' saved to keyring (profile: default)
add never asks for or stores the value. The declaration can be reviewed and<br>committed before each developer or deployment supplies its own value.
secretspec delete does the inverse on the<br>storage side: it removes a value without changing the declaration. The next<br>check therefore reports the secret as missing instead of quietly removing<br>the application’s requirement:
Terminal window$ secretspec delete STRIPE_API_KEY
Deleted 'STRIPE_API_KEY'
Deleted 1 secret value; 0 already absent
Deletion is idempotent, invalidates an associated cache entry, and follows the<br>same primary-write-provider routing as set. delete --all requires an<br>interactive confirmation, or an explicit --yes in non-interactive use.
Provider migrations can now remove each source value after proving the move<br>succeeded:
Terminal windowsecretspec import dotenv:~/.config/payments/.env --delete-source
import --delete-source reads the destination back<br>and compares it with the source before deleting anything. An identical value<br>already at the destination is safe to remove from the source; a conflicting<br>value leaves the source intact. SecretSpec also rejects a source without<br>deletion support before writing the destination and recognizes equivalent<br>provider spellings as the same store, so a migration cannot delete the value<br>it just wrote through another alias.
Together these commands keep the distinction explicit: add changes what the<br>application declares, set and delete change one environment’s stored<br>value, and import --delete-source moves that value between stores.
Provider-backed discovery<br>Section titled “Provider-backed discovery”
The first SecretSpec command in an existing project is often<br>secretspec init --from .env. In 0.18,<br>init --from accepts every provider that can discover<br>declarations, including age, AWS Parameter Store, and Bitwarden Password<br>Manager.
Hierarchical stores also receive an explicit project and profile so SecretSpec<br>looks only inside the namespace the new manifest will use:
Terminal window$ secretspec init \
--from 'awsps://production@us-east-1?template=/{profile}/{project}/{key}' \
--project payments \
--profile production
✓ Created secretspec.toml with 12 secrets
For a password-manager vault, scope discovery to the collection and item type<br>that belong to the application:
Terminal window$ secretspec init --from 'bw://Acme%20Inc@dev-secrets?type=login'
✓ Created secretspec.toml with 8 secrets
Discovery writes names and generated descriptions, never secret values. After<br>reviewing the manifest, keep the discovered provider as the profile’s source<br>or use secretspec import to copy the now-declared values somewhere else.
Four new providers<br>Section titled “Four new providers”
0.18 brings SecretSpec to 24 providers, with four additions spanning personal<br>password managers, machine-oriented vaults, and cloud parameter storage.
Bitwarden Password Manager is separate from the existing<br>Bitwarden Secrets Manager provider. The new bw:// provider uses the official<br>bw CLI to read and write regular vault items: logins, secure notes, cards,<br>identities, and SSH keys. It can address organizations and collections by name<br>or ID, restrict a provider to one item type or field, discover...