sigillo
Self-hostable secrets manager for humans & agents
Sigillo replaces `.env` files with a **cloud-based secrets manager** you can self-host. Prefix your commands with `sigillo run` and secrets are injected as environment variables, never written to disk.
```bash
# instead of this
source .env && next dev
# do this
sigillo run -- next dev
```
```diagram
┌────────────────┐
sigillo run -- next dev │ App Worker │
│ │ (sigillo.dev) │
│ 1. fetch secrets │ │
│──────────────────────────────────────▶│ decrypt │
│ { DB_URL, API_KEY, ... } │ AES-256-GCM │
│◀──────────────────────────────────────│ │
│ └────────────────┘
│ 2. spawn child with env vars
│
▼
┌──────────────┐
│ next dev │
│ (child) │
└──────┬───────┘
│
│ 3. stdout / stderr
▼
┌───────────────┐
│ redaction │ high-entropy values replaced with *
│ filter │ secrets never reach your terminal
└──────┬────────┘
│
▼
terminal
(safe output)
```
Secrets are **automatically redacted** from process output so they never leak into agent context windows, CI logs, or terminal history.
**Open-source alternative** to [Doppler](https://doppler.com) and [Infisical](https://infisical.com).
## Why Sigillo?
### Why not Doppler or Infisical?
- **Self-hosted**: runs on your own Cloudflare account. No centralized point of failure, no vendor lock-in. Your secrets never leave infrastructure you control.
- **Free**: no per-seat pricing, no usage limits. Deploy it once, use it forever.
- **Open source**: MIT licensed. Read the code, audit it, extend it.
### Why teams need this
- **No more `.env` files**: secrets live in the cloud and are easy to share across machines. No more "can you send me the .env?" on Slack.
- **Single source of truth**: stop duplicating secrets across platforms. In CI, you only need the Sigillo token. Use built-in scripts to sync secrets to Cloudflare, Vercel, Docker, and more.
- **Collaborative secrets**: share secrets between team members through organizations with role-based access, instead of brittle `.env` files or pasting keys in DMs.
- **Multi-environment management**: manage dev, staging, and production secrets in one place. Switch between environments with `-c production`.
### Why agents need this
- **Don't let agents read your secrets**: agents should never see your raw secret values. Instead of giving agents access to `.env` files, use `sigillo run` to inject secrets into processes without exposing them.
- **Automatic output redaction**: `sigillo run` replaces secret values in stdout/stderr with `*`, so secrets never enter your chat context window. Even if an agent runs `printenv`, it won't see the real values in the output.
## Install skill for AI agents
```bash
npx -y skills add remorses/sigillo -g -y
```
This installs [skills](https://skills.sh) for AI coding agents like Claude Code, Cursor, Windsurf, and others.
## Install
**curl** (downloads the native binary to `~/.sigillo/bin`):
```bash
curl -fsSL https://sigillo.dev/install.sh | bash
```
**npm**:
```bash
npm i -g sigillo
```
**Run without installing** via npx or bunx:
```bash
npx sigillo run -- next dev
bunx sigillo run -- next dev
```
## Quick start
**1. Add your secrets** at [sigillo.dev](https://sigillo.dev) (or your self-hosted instance). Create a project, add environments, and paste in your secrets from the web UI.
**2. Login from the terminal** (opens a browser for device flow authentication):
```bash
sigillo login
```
**3. Link your project** (picks the default project and environment for this directory):
```bash
sigillo setup
```
This saves the project and environment for the current directory in `~/.sigillo/config.json` (not in the repo). Run it in the project root if you have a single project, or in each subfolder of a monorepo. Since the config is local to your machine, you need to run `sigillo setup` again after cloning the repo on a new machine. Alternatively, skip setup entirely and always pass `--project` and `--env` (or `-c`) flags.
**4. Run your app** with secrets injected as environment variables:
```bash
sigillo run -- next dev
```
That's it. No `.env` files, no copy-pasting keys. Go back to [sigillo.dev](https://sigillo.dev) any time to add, edit, or rotate secrets. The next `sigillo run` picks them up automatically.
Migrating from Doppler? See the [Doppler migration guide](https://github.com/remorses/sigillo/blob/main/docs/doppler-migration.md).
## Setting up a new project
The Quick Start above assumes you already have a project with secrets. This section walks through creating everything from scratch, either from the CLI or the [dashboard](https://sigillo.dev).
Sigillo organizes secrets into a simple hierarchy:
```diagram
Organization (my-company)
│
├── Project (api)
│ ├── dev
│ │ ├── DATABASE_URL = postgres://localhost/mydb
│ │ ├── API_KEY = sk-dev-xxx
│ │ └── AUTH_SECRET = random-dev-key
│ ├── preview
│ │ ├── DATABASE_URL = postgres://preview-host/mydb
│ │ └── API_KEY = sk-preview-xxx
│ └── prod
│ ├── DATABASE_URL = postgres://prod-host/mydb
│ └── API_KEY = sk-live-xxx
│
└── Project (web)
├── dev
│ └── NEXT_PUBLIC_API_URL = http://localhost:3001
└── prod
└── NEXT_PUBLIC_API_URL = https://api.example.com
```
Each **organization** contains multiple **projects**. Each project has **environments** (dev, preview, prod by default). Secrets are scoped to a single environment.
### Create an organization
Organizations group projects and team members together. You need one before creating any project.
**CLI:**
```bash
sigillo orgs create --name my-company
```
**Dashboard:** Go to [sigillo.dev](https://sigillo.dev) and click "Create Organization" from the sidebar.
### Create a project
A project holds secrets for one app or service. Creating a project automatically gives you three environments: **dev**, **preview**, and **prod**.
```bash
sigillo orgs # find your org ID
sigillo projects create --org