--- created: '2026-05-08' path: Sources/Homelab project: sshkm status: active tags: - python - automation - ansible type: project-plan updated: '2026-05-08' --- # sshkm — local SSH key manager ## Goal A small Python CLI that handles the day-to-day SSH key lifecycle (generate, register, deploy, list, remove) without the ceremony of a full CA. Solves the `~/.ssh/` graveyard problem today; designed to coexist with a future `step-ca` deployment rather than be replaced by it. ## Design principles - **Capability/authorization split.** Generation is local-only file I/O — safe for agents to drive. Deployment requires interactive auth (target server password / agent unlock) — human-only by design. - **Explicit state transitions.** A key is `floating`, `bound`, or `deployed`. Every transition is its own command. No silent rebinds. - **Plain text everything.** Markdown ledger, plain `~/.ssh/config` blocks, no SQLite, no daemon. Inspect with `cat`, edit at your own risk. - **Coexists with future CA.** This tool manages the long-lived keys that survive the cleanup; the CA project will replace human and host identities, leaving sshkm for the truly static service-key tier. ## Architecture - **Typer + Rich** for the CLI surface - **`ssh-keygen` / `ssh-copy-id`** as the heavy lifters (no paramiko, no shell-out reinvention) - **`~/.ssh/managed/`** as sshkm's territory: keys, ledger, never touches anything outside - **`~/.ssh/config`** gets `# managed-by-sshkm: