Your coding agents, on your keyboard's F-row. Each agent gets a lane of lit keys that shows what it is doing — working, done, waiting for you — and one press on the lane's key brings that agent's window to the front.
You have Claude Code in one terminal, Codex in another, a third agent in its desktop app — and then you go do something else. Which one is sitting on a permission prompt right now? Agent F-Row answers that from across the room: a lane pulsing in its colour needs you, and pressing its key puts you in front of it.
- Windows only. Works with Claude Code and Codex, each running natively on Windows and inside WSL.
- The light is a Corsair keyboard through iCUE. Without one the window still shows everything; the keys and the light are the part you would be missing.
- Display only. It never sends anything to an agent and cannot approve, deny, or answer anything; its reply to every hook is empty. The agents talk to it over loopback on your machine, and nothing leaves it.
Twelve F-row keys, in 3, 4 or 6 lanes. Each lane has its own colour, and every state is that colour at some brightness and motion — a change of colour means trouble, and red means Error and nothing else.
| State | On the keys | Meaning |
|---|---|---|
| Connected | all keys, dim | alive, nothing run yet |
| Running | one light sweeping along the lane | working |
| Waiting | first key full, the rest double-pulsing | needs you — a permission prompt or a question |
| Done | first key full, the rest dim | the turn finished |
| Error | first key full, the rest dark red | the turn failed |
| Idle | first key dim, the rest off | nothing heard for a while |
| empty | off | no agent on this lane |
Idle is silence, not a verdict: Done and Connected dim to Idle after 30 minutes, Running after 2 hours, and Waiting and Error never — they are exactly what you left to come back to. A session leaves only when its agent ends or you dismiss it, so the board you left is the board you come back to.
The lanes, each with its state, the last thing the agent did, how long it has been like that, and a Focus button. Sessions beyond the lane count live off the keyboard — fully tracked, no key or light — and take the next lane that frees up. The ⏶⏷ arrows reorder lanes; nothing else ever moves a lane out from under you.
Saved agents. Press Save on a lane and the app remembers that agent and project folder, with that lane as its preferred one. Next time the agent starts it lands there if the lane is free, otherwise on another lane. The saved roster lists the ones that are not running, and is where you change a preference or forget it.
Press the lane's key (or click Focus) and the window the agent runs in comes forward — Windows Terminal with the right tab in front, the Claude or Codex desktop app, or an IDE. That is the only action in the product: no approvals, no key capture.
The tab it looks for is the lane's name, then the project folder — so naming a lane is a feature. If no tab matches, it says so and lists the tabs it found, rather than leaving you looking at the wrong agent.
Two limitations, stated in the window too: no agent reports when you answer a prompt, so a lane can read Waiting for a few seconds after you approved (it clears when that tool finishes); and Codex has no error event, so Error cannot be shown for it.
- Download
agent-frow-<version>-win64.zipfrom Releases, unzip it anywhere, and runagent-frow.exeonce. It installs itself to%LOCALAPPDATA%\agent-frow, registers its hook with every Claude Code and Codex it finds (Windows and WSL), and hands over to the installed copy; the unzipped folder can be deleted. - Restart your agents so they read their hooks. Codex also needs
/hooksrun inside it and the entry trusted — until then it looks installed and nothing happens. - For the keyboard: iCUE running with a Corsair board, and the F-row remapped to F13–F24 — in the default profile, or a profile switch silently takes the summon keys with it.
Upgrading is the same gesture with a newer zip. "Start with Windows" is a checkbox in the window. Windows will warn on first run: the zip is not code-signed.
The window's Settings section lists every agent found, whether its hook is registered, and when it was last heard from, with Install and Remove per agent.
- Lane count — 3 × 4, 4 × 3 or 6 × 2 keys — and each lane's name and colour.
- Brightness, and Color balance: a per-channel gain for keyboards whose LEDs do not match the screen. Tune it with a Preview pattern playing on the keys.
- Everything lives in
%LOCALAPPDATA%\agent-frow\settings.json, written atomically. A file that does not parse is refused and left alone, and the window says so.
Rust on Windows. cargo build --release, then
target\release\agent-frow.exe install — the app runs from %LOCALAPPDATA%,
and only install puts a build there. For lighting, unzip Corsair's iCUE SDK
(not committed; its own license) at <repo>/iCUESDK. dist.ps1 builds the
release zip.
How it all works — the hook, the state machine, lane placement, the lighting, focus — is in docs/how-it-works.md; the reasons behind each rule, measured against real sessions, are in docs/lessons.md.
Issues and pull requests are welcome. Before changing the state machine, focus, the hook, or the lighting, read docs/lessons.md — the constraints there were measured against real sessions, and in two cases the agent documentation is wrong. CI checks formatting, lints and tests the hook crate on Linux, and builds the whole workspace on Windows; the GUI only compiles on Windows. If a change touches summon keys, focus, or lighting, say what hardware you verified it on.
MIT — see LICENSE. The one exception is
iCUESDK.x64_2019.dll in release zips: that file is Corsair's proprietary iCUE
SDK redistributable, covered by
Corsair's EULA,
not by this project's license.
