Skip to content

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:

Terminal window
prk secrets set DATABASE_URL --project api --env production
Terminal window
prk run --project api --env production -- npm start

The 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

Examples

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.