Skip to main content

Declarative secret delivery across deployment platforms

Project description

SecretSync

Local-first CLI that pushes secrets from your vault-backed environment into deployments using a checked-in YAML file — without pasting values into Slack or dashboards.

⚠️ Disclaimer: This software is pre-alpha and under development. Use with caution.

Motivation

Vaults solve storage, rotation, access control, and audit. The gap is delivery: getting the same secret into GitHub Actions, Vercel, and SST without paste-into-Slack, clipboard history, or hand-copying the same key into three dashboards — and without half-rotated deploys when one destination is forgotten.

SecretSync is a thin CLI for that gap. You declare routing in a checked-in YAML file (reviewable in PRs; plaintext stays out of git), inject values from your vault into the process environment (op run, Doppler, etc.), and push. Destination quirks — GitHub repo/environment/org scopes, Vercel deployment targets, SST stages — stay behind connectors so the config stays simple.

Full secrets platforms (Infisical and similar) can do this and more, but they are overkill when you already trust a vault and only need to say which names land where. Plaintext should only move through process memory, authenticated provider APIs, or one-shot env injection — never config, plans, logs, or temp files.

Quickstart

# Scaffold config + 1Password-style env template
uvx secretsync init

# Edit secretsync.yaml (repo/project/stage names) and .env.tpl (secret references), then inject env:
# Example with 1Password CLI
op run --env-file=.env.tpl -- uvx secretsync validate
op run --env-file=.env.tpl -- uvx secretsync plan
op run --env-file=.env.tpl -- uvx secretsync apply --yes

# Run a health check to ensure secretsync is authenticated
op run --env-file=.env.tpl -- uvx secretsync health

## Plan and apply changes into your destination
op run --env-file=.env.tpl -- uvx secretsync apply --yes

You can also target a single deployent or destination

op run --env-file=.env.tpl -- uvx secretsync --deployment github-staging plan
op run --env-file=.env.tpl -- uvx secretsync --deployment github-staging apply --yes
op run --env-file=.env.tpl -- uvx secretsync --destination vercel plan

--deployment and --destination are repeatable; when both are set, only the intersection runs.

👉 While this example uses the 1Password CLI and vault, secretsync with any system that can securely set secrets in your environment (Doppler, mise, Infisical etc.)

Commands

Command Purpose
secretsync init Initialize secretsync.yaml + .env.tpl template
secretsync validate Check config + required env presence
secretsync plan Plan the necessary changes (--prune lists remotes and plans deletes)
secretsync apply Resolve the plan and write secrets (--prune also deletes orphaned secrets)
secretsync health Auth/reachability checks (skips unset tokens)
secretsync ui Interactive Textual review/apply
secretsync connectors List built-in connectors

Useful flags: --config, --format json, --verbose, --quiet, --deployment, --destination, --prune.

With --prune, SecretSync lists remote secret names at plan time and treats YAML as the full desired inventory for each destination scope — remote secrets not listed in the config are planned for deletion (including secrets never created by SecretSync). Without --prune, apply is put-only.

Supported Destinations

We currently support these destinations.

Audit

secretsync writes an audit trail under .secretsync/audit.log so you can keep track of what changed when. The .secretsync folder can safely be checked into source control.

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

secretsync_cli-0.1.0.tar.gz (46.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

secretsync_cli-0.1.0-py3-none-any.whl (65.1 kB view details)

Uploaded Python 3

File details

Details for the file secretsync_cli-0.1.0.tar.gz.

File metadata

  • Download URL: secretsync_cli-0.1.0.tar.gz
  • Upload date:
  • Size: 46.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for secretsync_cli-0.1.0.tar.gz
Algorithm Hash digest
SHA256 982b11d5dc0684fd4861e29bdd94ae6fb613ed473364f0dccdaab5967b905335
MD5 151e12707e04cf10a4d3d13e9ad3a548
BLAKE2b-256 de3f973703b9e23c4f90da7f570d231d82f0b598e9777542775203ea0b345955

See more details on using hashes here.

File details

Details for the file secretsync_cli-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: secretsync_cli-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 65.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for secretsync_cli-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4d617e459ada5c7d6acd1feada5caa4d697490e3c925857f489af51c36074054
MD5 8f375ac268210fb0a47a19aef7f18a62
BLAKE2b-256 d53ede2d9fbc119eb85bcf3b0f1cd2c0f94d7767e8b91ca50a1f45877d5bfa0b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page