Secretspec 0.18: Secret Lifecycle, Bitwarden, Keeper, AWS PS, and Swift

domenkozar1 pts0 comments

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...

secretspec value secret provider source delete

Related Articles