Early prototype. Windows first.

Secrets your AI agents cannot read.

Keep .env files, keys and certificates in an encrypted local vault. Your code gets them when you run it. Your coding agent never does.

Get early access See how it works
Who is asking?
# Shell, started by your coding agent
$ candil run --env acme/prd -- npm start
AI agent detected (claude); agents may not read secrets in this environment
exit code 2
# Attempt logged. No code used up.
Recognizes the agents you already run: claude cursor codex

Three commands. No more .env files.

Import a file once and delete it. From then on, your values travel from the vault straight into your process. There is nothing in the project folder for an agent to open.

Works with what you have

Any command that reads environment variables works unchanged.

Encrypted from the first second

Every item is sealed on import and tied to its exact place in the vault.

# Once per project
$ candil import .env --to acme/dev
$ rm .env
# Each morning, with your phone
$ candil unlock acme
# All day
$ candil run --env acme/dev -- npm run dev

Yes, even with an open session.

Candil looks at the whole chain of processes behind every request. The operating system supplies that information, so a process cannot claim to be someone else. If an agent is anywhere in the chain, the answer is no.

Who is asking Development Production
You, in your terminal Allowed while your session is open A fresh code, every time
An AI agent Denied and logged Denied and logged

Codes come from the authenticator app you already use. Each one works once. An agent cannot generate one, and a denied agent request never burns yours.

Agent calls the MCP tool
list_secrets acme/dev
It gets back names
DATABASE_URL
STRIPE_SECRET_KEY
SESSION_SECRET
Values
No tool returns them

Your agent keeps working.

Agents can still see which variables a project expects, read the audit log and check vault status through a built-in MCP server. They write the code. You keep the keys.

The tool list is fixed. A response carrying a secret is refused before it is ever turned into a reply.

Every read leaves a trail.

Allowed or denied, each secret-level request is written to a hash-chained log. Change one line and the chain stops verifying.

Example activity
09:14 allowed powershell > candil run acme/dev/env
09:31 denied claude > bash > candil run acme/dev/env
11:02 needs code powershell > candil run acme/prd/env
11:02 allowed powershell > candil run acme/prd/env

Boring cryptography, on purpose.

XChaCha20-Poly1305

Envelope encryption with standard RustCrypto libraries. Nothing home-made.

Argon2id

Your recovery passphrase is stretched with a memory-hard function and never stored.

Local by default

The vault lives on your machine. A small Rust service is the only thing that opens it.

Coming next

Deploys to your servers over SSH with no plaintext copy on disk. A sealed folder for keys and data files. Shared vaults for teams, where the server never sees a value.

Free for side projects. Simple pricing for companies.

Personal

Free

The full vault, agent protection and audit log. For personal, non-commercial use, up to 3 users.

Startup

$30 USD per user per month

Everything in Personal, for commercial use. Up to 9 users. AI support.

Business

$500 USD per month

Everything in Startup, from 10 users up. One flat rate with no limit on users. Support from a real person.

Get early access Team sharing is on the roadmap.