Skip to content

Proton Pass Provider

The Proton Pass provider integrates with Proton Pass for end-to-end encrypted cloud secret storage.

Providerprotonpass
URIprotonpass://[vault_name[/title-template]]
AccessRead and write
Best forEnd-to-end encrypted cloud storage through Proton Pass
AuthenticationA pass-cli login or personal access token
Default storageNote item {project}/{profile}/{key} in the monosecret vault
RequiresOfficial pass-cli, pinned to a version you have tested (see compatibility)
Terminal window
# Set a secret
$ monosecret set DATABASE_URL --provider protonpass://Personal
Enter value for DATABASE_URL: postgresql://localhost/mydb
# Get a secret
$ monosecret get DATABASE_URL --provider protonpass://Personal
# Run with secrets
$ monosecret run --provider protonpass://Personal -- npm start
  • Proton Pass CLI (pass-cli) - download from proton.me/pass/download
  • A Proton account, signed in via pass-cli login
  • A vault to store secrets in (e.g. pass-cli vault create monosecret)
  • A pass-cli version that works with your Monosecret release, see pass-cli compatibility

For local use, sign in interactively:

Terminal window
$ pass-cli login

For CI, use a personal access token as shown in CI/CD.

Each of these pass-cli releases changed behaviour the provider relies on:

pass-cliWhat changedMonosecret
2.0.3 (2026-05-19)item list output shapeHandled in 0.1.1+
2.1.0 (2026-05-20)Agent sessions reject audited item operations that carry no reasonHandled in 0.1.0+, see Agent sessions
2.2.4 (2026-07-31)pass-cli test removedHandled in 0.2+ (#279)

Monosecret probes the session once per run before any read or write. Monosecret 0.2.0 and earlier probe with pass-cli test, so on pass-cli 2.2.4 and later every Proton Pass operation fails with:

Provider operation failed: error: unrecognized subcommand 'test'

Monosecret 0.2+ tries pass-cli info and falls back to pass-cli test, so it works with supported pass-cli releases regardless of which check that release carries. info is preferred because it runs behind the CLI’s authentication gate and so reports whether a valid session is present, while test only proved that Proton’s servers were reachable. A pass-cli carrying neither is reported as incompatible with your Monosecret release rather than surfacing the CLI’s usage text.

On Monosecret 0.2.0 and earlier, use pass-cli 2.2.3, the last release published before pass-cli test was removed.

Install a specific release instead of tracking the latest build, and point Monosecret at it with MONOSECRET_PROTONPASS_CLI_PATH:

Terminal window
$ curl -Lo ~/.local/bin/pass-cli-2.2.3 \
https://github.com/protonpass/pass-cli/releases/download/2.2.3/pass-cli-linux-x86_64
$ chmod +x ~/.local/bin/pass-cli-2.2.3
$ export MONOSECRET_PROTONPASS_CLI_PATH="$HOME/.local/bin/pass-cli-2.2.3"

Every release publishes a .sha256 file next to each binary; verify it before use. Pin the same version in CI rather than installing the latest pass-cli on each run, and treat a pass-cli upgrade as a change worth testing: run monosecret check against the new version before rolling it out.

protonpass://[vault_name[/title-template]]
  • vault_name: Target vault (defaults to monosecret)
  • title-template: Item title pattern supporting {project}, {profile}, {key} placeholders
# Default vault ("monosecret")
protonpass://
# Specific vault
protonpass://Work
# Specific vault and custom title template
protonpass://Work/{project}/{profile}/{key}
monosecret.toml
[providers]
team = "protonpass://Work"
[profiles.production]
DATABASE_URL = { description = "Database URL", providers = ["team"] }

Secrets are stored as note items. The vault defaults to monosecret, and the item title defaults to {project}/{profile}/{key}. The URI can select another vault or replace the title template.

A secret’s ref field names an existing item instead: item is the exact item title, whose note is read (field is not supported). Reads and writes target that item in place.

[profiles.production]
DATABASE_URL = { description = "DB", ref = { item = "Production Database" }, providers = [
"protonpass://Work",
] }
Terminal window
# Create a token
$ pass-cli personal-access-token create --name ci --expiration 1y
# Authenticate in CI (store the token as a CI secret)
$ pass-cli login --pat $PROTON_PASS_PAT
$ monosecret run -- deploy

pass-cli 2.1.0 introduced agent sessions, which require a PROTON_PASS_AGENT_REASON to be set for audited item operations (reading, creating, and deleting items). Monosecret sets this automatically, so existing secrets resolve correctly under an agent session.

The reason recorded in the Proton Pass audit log is resolved in this order:

  1. The --reason flag (or MONOSECRET_REASON environment variable):

    Terminal window
    $ monosecret run --reason "Deploying app from CI" -- ./deploy.sh

    When using the Rust SDK, set it for the session with with_reason:

    use monosecret::Secrets;
    let spec = Secrets::load()?.with_reason("Deploying app from CI");
  2. The PROTON_PASS_AGENT_REASON environment variable read by pass-cli:

    Terminal window
    $ export PROTON_PASS_AGENT_REASON="Deploying app from CI"
  3. A default that identifies the Monosecret version (for example, monosecret/0.2.0 (https://ifiokjr.github.io/monosecret/)).

To force a meaningful reason instead of falling back to the default, use the require_reason policy in monosecret.toml. It defaults to "agents", so sessions Monosecret detects as AI agents must explain why they read a secret. Detection is heuristic; set it to true to require a reason from every Monosecret caller. Monosecret then refuses operations through Monosecret that do not supply an explicit reason.