prick
prick is a self-hosted secrets manager that runs inside your own Cloudflare account: one Worker, one D1 database, and nothing else to operate.
Store a secret once, and hand it to whatever needs it:
prk secrets set DATABASE_URL --project api --env productionprk run --project api --env production -- npm startThe value goes straight into the process’s environment block. No .env file,
nothing written to disk.
What you get
prk— a single static Rust binary that talks HTTP to your Worker.- A web UI — a SvelteKit admin app served from the same Worker.
- Cloudflare Access — SSO for people, service tokens for CI.
- Versioned secrets — every write keeps history, and every read is audited.
Secret values are encrypted with AES-256-GCM, and each ciphertext is bound to its row, so a value lifted out of one row and pasted into another fails to decrypt. Secret key names are stored in plaintext on purpose — see the Threat model.
The name: Portable Runtime Injection of Cloudflare (stored) Keys.
Start here
| If you want to… | Go to |
|---|---|
| Understand what this is | Introduction |
| Deploy it to your Cloudflare account | Quickstart |
| Install the CLI | Install |
| See a complete job done end to end | Examples |
| Look up a command | CLI reference |
| Work out why something failed | Exit codes and errors |
Guides
- Authentication — read this first. Every other guide assumes it.
- Projects and environments
- Secrets
- Using secrets — Docker, npm scripts, Cloudflare Workers, GitHub Actions.
- Access control — identities, grants, service tokens.
- Backup and recovery
- Key rotation
Examples
- Onboard a new service
- Migrate from a
.envfile - Give CI read-only access
- Respond to a leaked secret
- Script prk with
--json
Reference
- CLI — every command, flag and exit code.
- API — HTTP endpoints and the error envelope.
- Configuration — environment variables,
wrangler.jsonc,.dev.vars.
Architecture
Contributing
Project status
The architecture is settled, the security-critical layers are written, and the API surface is mounted. Two things are worth knowing before you adopt it, and this documentation says so at the point where it matters rather than describing intent as fact.
| Area | State |
|---|---|
| Crypto: envelope, AAD, key ring | Implemented |
| Access JWT verification, claims, authorization, bootstrap | Implemented |
| Domain layer: projects, environments, secrets, identities, grants, groups | Implemented |
| Domain layer: audit query, including per-scope narrowing | Implemented |
| Domain layer: key ring status and the rekey job | Implemented. No cron — a rotation advances one page per call to POST /admin/rekey |
| HTTP API | Fully mounted, and docs/openapi.json is generated from the router |
prk CLI |
Login, token storage, service tokens and every subcommand are wired |
| Web UI | Every screen exists and reads the domain layer |
prk installs from npm as @yashau/prick, which ships a prebuilt binary for
each platform, or builds locally with mise run build:rust — see
Install.