HN renders plain text — no markdown. The body and first-comment blocks below are plain text with blank-line paragraph breaks, exactly as HN wants them. URLs auto-link on HN, so paste them bare.
Show HN: Fleetkey – one control surface for every coding agent (Claude Code, Codex, OpenCode, GLM)
Hi HN. I run Claude Code, Codex, OpenCode, and GLM side by side, and the friction isn't the agents — it's me, mousing back to four terminals to hit "y", retype the same prompt, or check which one finished. So I built Fleetkey: one control surface that drives whichever agent window is in front of you. It doesn't know or care which harness is underneath. It's local-only — a daemon on ws://127.0.0.1:8787, loopback, no account, no telemetry. Today it does: - Four agent keys, each lit to show idle / running / waiting-on-you / done, so you can see your fleet at a glance instead of tabbing through windows. - Approve and Reject that actually fire the keystroke into the focused agent. Proven end to end: a click in the browser UI hits the daemon, which runs an osascript keystroke, and "y" lands in Claude Code. The other harnesses use the same path. - Talk — the part I actually wanted. Hold a key, speak your prompt, release; it transcribes with Whisper and types it into the focused window. I'd rather say "refactor the auth module and add a test for the expired-token branch" than type it. - Skill and a Reason dial are wired in the UI but return "coming soon" for now. Shipping with one real action and honesty about the rest. The comparison I keep coming back to: OpenAI's Codex Micro is $230, ships as single-vendor hardware, and only drives Codex. Fleetkey is free, runs on the keyboard you already own, and drives all four. I'm not anti-hardware — I want to build the panel too — but the software layer shouldn't wait for a factory. Honest status: - Software layer works on macOS today. It needs Accessibility (the same permission every macropad and automation tool asks for) to inject the keystroke. Nothing is hidden; the install says exactly why. - A DIY hardware kit is a pledge tier with no ship date. I won't promise one until backers justify a parts order — a missed indie-hardware date is the fastest way to lose this crowd. - A finished unit is "maybe, later." Demo gif, install, and the open contract spec: [LINK] I'll be in the comments for the next few hours. The question I actually want answered: what would make this worth opening every day in your setup?
Expanding on the how-it-works for anyone who wants to poke at it:
The contract is three keys — {action, harness, payload}. Five actions (approve, reject, skill, talk, dial), four harnesses (claude-code, codex, opencode, zcode), four states (idle, running, waiting, done). The browser UI is just a client over a local WebSocket; the daemon translates actions into real keystrokes in the focused window via osascript. State flows back the other way so the LEDs reflect what each agent is actually doing.
Why local-only and no telemetry: this tool types into your agent sessions. The cheapest way to make that trustworthy is to not have a server. The daemon binds to 127.0.0.1 only. No account because there's nothing to log into.
Why "talk to your agents" is the wedge for me: the long prompt is the unit of work with these tools, and I can speak a 40-word instruction faster and more naturally than I can type it. Push-to-talk means the laptop keyboard stays for editing and the voice channel is for steering. Whisper runs through Groq; if you don't set a key the daemon returns a clear error instead of failing silently.
On the Codex Micro framing — not throwing shade, it's a beautiful object and single-agent hardware makes sense for a single-agent workflow. The bet with Fleetkey is that serious setups don't stay single-agent for long. You reach for different harnesses by task, by cost, or by which one is free this month, and a surface that follows you across them beats four remotes.
macOS first because that's where the osascript path is cleanest. Linux/Windows need a different injection method — happy to talk tradeoffs (ydotool, AutoHotkey) if that's your stack.
Source + contract: [LINK]
Codex Micro is $230 and drives one agent. Fleetkey is free, drives all four — and you can talk to it.
Every line below is grounded in what's actually built — the locked contract, the working daemon, the proven end-to-end action. Pull from these when answering.
| Axis | Codex Micro | Fleetkey |
|---|---|---|
| Price | $230 | Free software; DIY kit $20–40 pledge later |
| Agents | Codex only | Claude Code, Codex, OpenCode, GLM |
| Hardware | Required — buy the device | None — any keyboard/macropad you own |
| Voice | — | Push-to-talk → Whisper → types into focused agent |
| Setup | Pair a proprietary device | Run a local daemon, open localhost |
| Telemetry | — | None — binds to 127.0.0.1, no account |
{action, harness, payload}. Five actions: approve · reject · skill · talk · dial. Four harnesses: claude-code · codex · opencode · zcode. Four states: idle · running · waiting · done.ws://127.0.0.1:8787, loopback only. Actions translate to real keystrokes in the focused window via osascript. State pushed back to the UI on connect.APPR → WebSocket → daemon → osascript → y lands in the focused Claude Code window. Verified with frontmost-app focus reacquire. This is the one action on video.audio/webm;opus), POSTs to /transcribe, daemon forwards to Groq Whisper, transcript types into the focused window. No key → clear no_groq_key error, no silent fail.“It's just a key mapper.” → It's a key mapper plus live per-agent state (idle/running/waiting/done) reflected back, plus cross-harness, plus local-only. Karabiner doesn't give you the LED grid. “macOS only?” → macOS first (osascript is cleanest); Linux/Windows via ydotool / AutoHotkey is the next port. “Accessibility permission?” → Yes, same one every macropad/automation tool needs; stated up front, not hidden.
Launching early on HN is worse than launching late; the first impression is permanent. These come straight from the launch strategy.
{action, harness, payload}, 5 actions / 4 harnesses / 4 states — done, v1.0.ws://127.0.0.1:8787.