The agent peripheral you already own.
A DualSense on your desk is an RGB light, a haptic engine, and an approve button pointed at your hands. Steer routes all three to the shell — so the pad becomes a status light for a coding agent, a nudge when it needs you, and a trigger you squeeze to say yes. No window to watch. No extra hardware.
The idea is real enough that OpenAI sells hardware for it: the Codex Micro (with Work Louder) is six RGB keys, a joystick, and accept/reject buttons for AI coding — for US$230. A DualSense has all of that, plus a haptic engine and adaptive triggers, and it's probably already in a drawer within reach. This page is that device, for Claude Code, at the cost of the controller you own.
Three plain URLs. That's the whole surface.
Everything runs on the documented steer:// automation surface — no SDK, no daemon. Anything that can run a shell command can drive it: Claude Code hooks, git hooks, CI wrappers, Makefiles, Hammerspoon.
Always -g so open never steals focus from your terminal. Fire-and-forget: URLs never block and never return an error. If Steer isn't running, launching one starts it.
Wire it into Claude Code
Merge this into the "hooks" key of ~/.claude/settings.json (or a project's .claude/settings.json). Verified against Claude Code 2.1.x.
{
"hooks": {
"UserPromptSubmit": [
{ "hooks": [ { "type": "command", "command": "open -g 'steer://led/FF8800'" } ] }
],
"Notification": [
{ "matcher": "permission_prompt",
"hooks": [ { "type": "command", "command": "open -g 'steer://led/FF0033'; open -g 'steer://haptic/warning'" } ] },
{ "matcher": "idle_prompt",
"hooks": [ { "type": "command", "command": "open -g 'steer://haptic/double'" } ] }
],
"Stop": [
{ "hooks": [ { "type": "command", "command": "open -g 'steer://led/00CC44'; open -g 'steer://haptic/success'" } ] }
],
"SessionEnd": [
{ "hooks": [ { "type": "command", "command": "open -g 'steer://led/auto'" } ] }
]
}
}
The colours are just hex — change them to taste. Amber while it works, red-and-a-buzz when a tool call wants approval, green-and-a-buzz when it's done, palette restored when you're finished.
What it is, and what it isn't.
The light bar needs a light bar
The status-light half uses the DualSense, DualSense Edge, or DualShock 4 light bar. Xbox, Switch Pro, and MFi pads have no app-controllable LED, so steer://led quietly no-ops there — but the haptic half works on every controller.
One light bar, many sessions
Hooks fire per session, so two parallel agents share one light. It shines for the workflow you're watching — it isn't a multiplexed dashboard, and it doesn't pretend to be.
Optional, and built on the open surface
None of this is a separate product. It's the same documented automation surface every Steer user has — you're just pointing it at your agent. Steer is a full controller-to-Mac input app first; this is one thing it happens to do beautifully.