Password manager for AIs. Store secrets in your OS keychain, inject them into child processes, and scrub output so AI coding assistants never see the actual values.
AI agents like Claude Code, Cursor, and Devin can see everything in your terminal. Peekachu keeps secrets out of their context by replacing real values with [REDACTED:NAME] in all process output.
npx peekachu run --env DB_PASSWORD -- node server.js
AI Agent peekachu Child Process
(sees nothing) (has secrets)
| | |
|--- run --env ... ---->| |
| |-- fetch from keychain |
| |-- inject env vars --->|
| | |--- runs
| |<-- stdout/stderr -----|
|<-- scrubbed output ---| |
| | |
[REDACTED:NAME] replaces secrets real values
# Store a secret (opens native OS dialog)
npx peekachu set DB_PASSWORD
# Run a command with the secret injected and output scrubbed
npx peekachu run --env DB_PASSWORD -- node server.js
# The AI sees: connection string: postgres://user:[REDACTED:DB_PASSWORD]@localhost/db
# The child process sees the real value in its environmentStore a secret in the OS keychain. On macOS, opens a native dialog with a hidden input field. Falls back to reading from /dev/tty (not stdin, which the AI may control).
peekachu set API_KEY
peekachu set DB_PASSWORDRun a command with secrets injected as environment variables. All stdout and stderr output is scrubbed — any occurrence of a secret value is replaced with [REDACTED:NAME].
# Single secret
peekachu run --env DB_PASSWORD -- node server.js
# Multiple secrets
peekachu run --env DB_PASSWORD --env API_KEY -- node server.jsCI mode. Instead of reading from the OS keychain, reads secrets from existing environment variables (as set by your CI runner). Output is still scrubbed.
# In CI/CD pipeline where secrets are already in env
peekachu run --ci --env DB_PASSWORD --env API_KEY -- npm testList the names of stored secrets. Never shows values.
peekachu list
# DB_PASSWORD
# API_KEYRemove a secret from the keychain.
peekachu delete API_KEYShow platform, provider, and runtime info.
peekachu status
# Platform: macos
# Provider: macOS Keychain (security CLI)
# Node: v22.0.0Secrets are scoped per project so the same secret name (e.g. DISCORD_WEBHOOK) can have different values in different projects.
- Secrets are stored in the keychain as
project/SECRET_NAME(e.g.website/DISCORD_WEBHOOK) - The default project is
default— secrets without a project go here - Peekachu auto-detects the project by looking for a
.peekachufile in the current directory (or parents)
# Create a .peekachu config in your project root
peekachu init myproject
# Or let it default to the directory name
peekachu initThis creates a .peekachu file:
{ "project": "myproject" }# Auto-detects project from .peekachu file (or falls back to "default")
peekachu set DISCORD_WEBHOOK
peekachu list
peekachu run --env DISCORD_WEBHOOK -- node bot.js
# Explicit project override
peekachu set --project website DISCORD_WEBHOOK
peekachu list --project website
peekachu run --project api --env DISCORD_WEBHOOK -- node bot.jsPeekachu includes a desktop GUI built with Electrobun for managing secrets visually.
- Project selector dropdown — switch between projects
- Secrets list — see all secret names for the selected project (values are never shown)
- Add secrets — name + password field
- Delete secrets — per-row delete with inline confirmation
- Status bar — platform and provider info
# From the repo root
npm run gui
# Or manually
cd gui
bun install
bun startRequires Bun to be installed.
Secrets set via the CLI show up in the GUI and vice versa — they share the same OS keychain storage.
-
Secrets are stored in the OS keychain — macOS Keychain (
securityCLI) or Linux Secret Service (secret-toolCLI). No config files, no.envfiles, no plaintext on disk. -
Secrets are injected as environment variables into the child process. The child reads them normally via
process.env. -
Output is scrubbed in real-time using a Transform stream with a sliding window buffer. Secrets split across chunk boundaries are still caught.
-
Signal forwarding — SIGINT, SIGTERM, and SIGHUP are forwarded to the child process. Exit codes are preserved.
| Platform | Keychain Provider | Secret Input |
|---|---|---|
| macOS | Keychain Access (security CLI) |
Native dialog (osascript) |
| Linux | GNOME Keyring / libsecret (secret-tool CLI) |
/dev/tty |
- Node.js 18+
- macOS or Linux
- No native addons — works with
npxout of the box - GUI requires Bun
This project was built with Claude Code.
MIT