v0.13.0 · macOS + Windows + Linux · MIT
a cross-platform secrets workflow that keeps plaintext out of normal agent output.
Stores keys in the macOS Keychain, Windows Credential Manager, or Linux Secret Service — with an encrypted-file fallback on headless servers. Normal commands route values to explicit sinks instead of returning them in tool output. v0.9.0 adds opt-in project-scoped delivery with explicit entry assignments. Free, open source, reviewed-release install.
claude.ai/code
demo · 30 s · placeholder
the diff
the leak vs the fix
The leak isn't where the key is stored — it's where the agent can see it. Storage vaults like 1Password CLI / doppler / vault all make the value flow through the agent's context window the moment you ask for it. keys-keeper gives the agent a different verb.
.env directly. The resulting file is an exposure sink: any agent or process allowed to read it can recover the value.
the design
command surface, by design
The shipped Claude skill markdown enumerates the intended command surface. Normal commands avoid printing plaintext; keys reveal has a caller-controlled environment guard to prevent accidents. This is transcript hygiene, not isolation from arbitrary same-user shell code.
keys add NAME --from-clipboard / --from-file / --stdin
keys list / info / audit
keys copy NAME
pbcopy; auto-clears in 30 s with SHA-256 check so it doesn't wipe unrelated content.keys inject NAME --file F --as ENV
ENV=value without printing it. Any process that can read the file can still recover the value.keys resolve PATH
__KEYS:name__ placeholders in-place. Works on .env.template, deploy scripts, anything text.keys ssh NAME
ssh -i <tempfile>, shreds the tempfile on exit.keys reveal NAME
KEYS_KEEPER_ALLOW_REVEAL=1 is in env. This prevents accidental use, but a shell-capable caller can set the variable itself.The shipped skill markdown tells Claude: "You MUST NOT runkeys reveal. You CAN usekeys copy / inject / resolve / ssh." That contract reduces accidental transcript exposure; it does not constrain a malicious or prompt-injected same-user agent.
and a local admin
so you can browse 50+ keys without losing your mind
Run keys serve and a localhost-only admin opens at 127.0.0.1:7777. Token in the URL, stripped via history.replaceState, then a session cookie. No cloud, no account, no telemetry. Five screens, terminal-density.
/paste Bulk import
SOURCE
PREVIEW · 4 entries · 0 errors
top entries · last 7 d
daily activity · last 30 d
Settings
how it fits together
two-layer storage. one process. zero network.
Secrets live in your OS credential store — macOS Keychain (Touch-ID protected) or Windows Credential Manager (DPAPI-bound to your login). Metadata (names, tags, refs, audit log) lives in ~/.config/keys-keeper/ or %APPDATA%\keys-keeper\ as boring JSON you can back up or diff. The CLI mediates both. The admin is the same process exposing localhost HTTP.
install in 2 minutes
two lines in Claude Code. reviewed updates.
The Claude Code plugin adds the skill. Personal and project background sync use the OS scheduler. Its fallback updater is disabled by default; Claude's native marketplace auto-update is an independent setting. Disable native auto-update as well when you require reviewed manual updates. The CLI itself installs via pipx. For Cursor, Aider, Codex CLI, or Cline — one keys init <target> emits the matching rule file.
Run these as two separate slash commands in Claude Code — paste step 1, press Enter, then paste step 2. (Claude Code runs one slash command at a time.)
/plugin marketplace add kyzdes/claude-skills
/plugin install keys-keeper@claude-skills
Installs the immutable v0.13.0 release tag.
pipx install 'git+https://github.com/kyzdes/keys-keeper-skill.git@v0.13.0'
// after pipx install, run inside your project: keys init cursor # .cursor/rules/keys-keeper.mdc keys init aider # CONVENTIONS.md (then `aider --read CONVENTIONS.md`) keys init codex # AGENTS.md (also read by Cursor / Amp / Jules) keys init cline # .clinerules/00-keys-keeper.md keys init generic # prints to stdout — pipe wherever your agent reads rules
requires Python 3.10+ on macOS, Windows, or Linux. On a headless Linux server set KEYS_KEEPER_MASTER_KEY for the encrypted-file backend.
brew install pipx && pipx ensurepath. Windows: python -m pip install --user pipx && python -m pipx ensurepath — one line, restart your shell.
roadmap
open source · accepting PRs
Owner is one developer with a day job. The list below is what's planned but not yet shipped — pull-request bingo welcome.
- MCP stdio server (
keys mcp) — typed-tool surface for any MCP-compatible client (Cursor / Cline / Codex have native MCP) - Touch-ID-gated reveal in admin with auto-wipe from DOM after 10 s
- CSV export from /audit (already CLI-only via
keys audit > file.csv) - Bulk-paste parser extension for ssh_key / server / domain (currently clean only for api_key)
- Light theme polish — CSS tokens exist; not all surfaces tested
- Cmd+K action palette beyond navigation — "copy openrouter" as a one-shot
PRs welcome. Start at github.com/kyzdes/keys-keeper-skill/issues — or just open one with the rough idea.
now shipping
what landed since v0.5.
Connect your own computers or deliver selected entries to project workers. Snapshots are encrypted on the device before upload.
personal sync
Connect your own computers through your private VPS. The relay stores encrypted snapshots and signed records; decryption stays on enrolled computers. Open Settings → My computers to begin.
project delivery
Assign selected entries to a project scope. Enrolled workers can read assigned entries and submit new ones; existing-entry edits and deletions remain on the main computer.
honest limitations
what keys-keeper is not.
If any of these is a dealbreaker, that's fine — none of them are theoretically hard, they're just not done yet. Tracking on the roadmap above.
headless Linux needs a master key
Desktop Linux uses the OS keyring via secret-tool. A headless server has no keyring daemon, so the encrypted-file backend needs KEYS_KEEPER_MASTER_KEY in the environment to unlock. An agent inheriting that environment is not isolated from the vault.
not a shared team vault
Project scopes deliver explicitly selected entries to approved worker profiles. Folders, tags, and project names never grant access, and workers do not edit the master catalog.
bulk paste = api_key
Other types via + New form in the admin for now.
caller_path is best-effort
From ps -o command=. Forensics-level, not court evidence.
threat model
what this defends against. and what it doesn't.
If you're considering keys-keeper, you should know the boundaries. Vague claims help no one — here's the explicit shape of the protection.
reduces
Accidental plaintext in normal tool output and transcripts when an agent follows the generated rules, long-lived clipboard residue, and ad-hoc manual secret handling.
does not defend against
A malicious or prompt-injected agent with arbitrary shell access as the same OS user, any process that can read a selected file or clipboard sink, an inherited master key, direct credential-store access, compromised updates, root, or malware.