Production is the base. Staging and preview inherit from it and override only what differs. Serve the result to Kubernetes, pull it into your shell, or push it to Unkey. Self-hosted, encrypted with AES-256-GCM.
Switch environments, reveal a value, or click a key.
How layering works
Put a key in production. Every environment that inherits from production can read it straight away.
production DATABASE_URL = postgres://prodGive staging its own database URL. Only staging changes, and production keeps its value.
staging DATABASE_URL = postgres://stgPreview sets nothing, so it reads staging's value, and production's where staging has none. Change the base once and it lands everywhere.
preview DATABASE_URL ← stagingGetting it into your app
Inheritance and references resolve server-side, so the pod only ever sees flat values.
Values never touch disk with cubby run — they go straight into the child process environment.
Every write re-pushes the whole resolved set, so the destination can't drift out of sync.
Security
Self-host it in a few minutes, or share a single secret right now without making an account.