Titanwarden
Open-source secret broker for AI agents

Your agents can use every secret.
They can read none.

An agent names the secret and the command. The broker starts the command with the value injected. The agent never holds it, so it never leaks it.

Python. One encrypted SQLite file. Sealed on every restart. Audited before anything moves. By Titanium Computing, built for our own fleet first.

  agent pane · tw 0.1

  
The problem

One get is one leak.

Transcripts

Agents keep everything

A password manager hands the value to whoever asks. For an agent, "whoever asks" means the terminal, the transcript, the log, and the next tool call. It never forgets.

Shared unlock

One session, every agent

Unlock once and every pane on the machine rides the same session. One careless worker exposes the whole vault.

No receipt

Nobody knows who used what

Rotation is guesswork when you cannot answer "who touched this key last" and "what breaks if I rotate it".

How it works

Use, never see.

01 · Name it

The agent asks by name

tw run --env TOKEN=infra/github -- gh pr create. A path and a command. No value in the request, none in the reply.

02 · Check it

The broker checks, then logs

Who is calling, from which process, with which grant. The audit row commits first. If it cannot be written, nothing moves.

03 · Inject it

The command runs with the value

Injected by environment, pipe or stdin into a child the broker starts. Output flows back through a redactor. The agent sees the work, not the key.

Why a broker, not a vault

Same secrets. Different direction.

Password manager, used by an agent

Read, then paste

  • The protocol returns plaintext on request.
  • Identity is a shared session, not a named caller.
  • Use is invisible: no row says which agent used which key for what.
  • Rotation means hunting for every copy.
Titanwarden

Run, never read

  • The agent protocol has no operation that returns a value. Not hidden, absent.
  • Every call maps to one named principal and is checked against the calling process.
  • Every delivery is a hash-chained audit row written before the value moves.
  • Who touched it, who depends on it: one command each.
Sealed by default

Only one state moves a value.

Sealed

Every start, restart, crash or deploy. Keys are not in memory. A human unseals.

Unsealed

The passphrase was typed. Agents can run with secrets. Everything is logged.

Frozen

Agent operations latched off by an operator. Deleting a file does not clear it.

Lockdown

Panic seal or a failed audit check. Keys dropped. A passphrase clears it.

Under the hood: AES-256-GCM per value, a memory-only master key, Argon2id for the passphrase, one data key per version, every ciphertext bound to its row. Standard parts from one maintained library, no custom cryptography.

Honest limits

We label every promise.

Boundary means the protocol makes it impossible. Guardrail means it stops accidents. Today the broker and the agents share one OS user, so Titanwarden stops accidents and records honest use; it is not yet a wall against a deliberately hostile local process. Output redaction is a guardrail: it catches known encodings, not every transform.

The next version runs the broker as its own user with a separate exec runner, and adds auto-unseal so routine restarts need no human. We would rather tell you this on the front page than in a postmortem.

Install

Two minutes, then one ceremony.

macOS or Linux, Python 3.12 or newer, and SSH from a device you trust. The first setup is deliberately human-only.

# get it
git clone <the titanwarden repo> && cd titanwarden
uv sync --frozen
scripts/install.sh            # home, release, tw + twadmin on PATH, broker + watch + backup jobs

# the human ceremony, over SSH from your own device
twadmin init                  # passphrase twice (30+ characters); the recovery key prints once
twadmin unseal
tw status                     # unsealed, ready for agents