This repo is public. Anything committed, even for a second and then deleted, is public forever (forks, clones, caches). So secrets never enter the repo, encrypted or not.
- On each laptop, in
.envat the repo root. It is gitignored. Copy.env.example, fill it in, thenchmod 600 .env.makeloads it;make keysshows which are set without printing them. - The approval key's private key lives only on the device (
~/.drawkey/private.pemon the Pi, flash on the ESP32). Only its public key goes inconfig/contract.yaml.
Only the four collaborators get keys, and only by a private channel: a direct message (Signal, iMessage, Discord DM) or a shared password-manager vault. Never in: this repo, issues, PRs, commit messages, the shared spec doc, a team channel with non-members, screenshots, or an AI chat.
.gitignorecovers.env,.env.*,*.pem,*.key,.drawkey/,wifi_secrets.h.- Pre-commit hook refuses commits that add secret files or key-shaped strings.
Every collaborator runs
make hooksonce per clone. Never usegit commit --no-verifyhere. - GitHub push protection rejects pushes that contain a recognized key.
- Revoke it at the provider immediately (Anthropic Console, Vercel, Nessie, CRS). That is the fix. Deleting the commit is not.
- Make a new key, update
.env, DM it to the team. - Tell the team which key leaked and where.
Revoke or rotate every key used here (Anthropic, AI Gateway, Nessie, CRS).