penname sits between your app — or your AI agents — and any model provider: OpenAI, Anthropic, or anything OpenAI-compatible. It swaps every real name, email, phone and ID number for a stable pen name on the way out, and restores it on the way back. The model never sees the real thing.
It reads your database and does the swapping — the only thing that ever touches a row, and it holds your master key. Neither leaves it.
Table and column names, what you marked sensitive, and token counts. Never a row, never a prompt, never your master key.
DETAIL_LOGGING=true prints every word the gateway sends to the model. The only other thing it talks to is penname.io, for your key, your column names and token counts.
pk_…
it shows. Free in early access — no payment now, and we'll tell you well before that changes.docker run -it -v ${PWD}/penname:/setup pennameio/gateway init
cd penname && docker compose up -d
It asks for your key and an optional read-only database URL, generates your master key,
and writes every config file for you.http://localhost:8088/v1
for OpenAI, http://localhost:8088 for Anthropic. Keep your provider
key, add the header X-Penname-Scope: user=<id>.The full guide, every setting and troubleshooting: penname.io/docs. What's new: changelog.
penname ships an MCP server. Claude Code, Codex, Cursor or the Claude / ChatGPT desktop app can read your schema, mark what's sensitive, and troubleshoot. The signup page hands you a ready prompt with your key in it — or add it directly:
# with your pk_ key
claude mcp add --transport http penname https://penname.io/mcp \
--header "Authorization: Bearer pk_your_key"