A terminal on a headless box waiting on approval from a phone

A Toaster Can Log In Now, Apparently

You’re SSH’d into a box with no display. No X11, no Wayland, $DISPLAY unset, as browser-capable as a toaster. Claude Code, running against your LLM gateway, needs a fresh JWT, and the script backing its apiKeyHelper is about to try to webbrowser.open() a URL into a void where a browser should be. It doesn’t. It notices the void, shrugs, and prints a six-character code to your terminal instead — with instructions to go type it into a browser on some other device. Your phone. Your laptop. Whatever’s within arm’s reach that isn’t the toaster you’re SSH’d into. You do that, tap approve, and the headless box — the one that, and I cannot stress this enough, has no browser and never will — gets a real, human-approved OAuth login anyway. ...

August 7, 2026 · 10 min · Ken Kitts
A key being swapped for a short-lived token

I Gave Claude Code a Static API Key. Then I Took It Back.

I got Claude Code talking to my self-hosted gateway in about fifteen minutes. Mint a scoped API key, export ANTHROPIC_BASE_URL and ANTHROPIC_AUTH_TOKEN, done. It worked immediately, which should have been my first warning — security problems that work immediately are the ones that stick around. The key I minted was budget-capped and scoped to a few models, not the master key to the kingdom. Bounded risk, technically. But it lived in plaintext in ~/.claude/settings.json, which meant anyone who could read a file on my machine — a compromised dependency, a misconfigured backup, a cat fat-fingered into the wrong Slack channel — now had a usable credential for as long as I forgot to revoke it. I noted the risk, decided it was acceptable for now, and moved on with my life, the way you do with a smoke detector that’s beeping every ninety seconds and you just haven’t gotten around to the battery yet. ...

August 3, 2026 · 10 min · Ken Kitts