Steer
For people who code with AI agents

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.

amber — agent is working
red + buzz — needs your approval
green + buzz — done, waiting on you
palette restored when the session ends
Why this is a category now

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 primitives

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.

CommandEffect
open -g "steer://led/<hex>"Paint the light bar a static colour (bare six-digit hex — no #). Holds until the next state change.
open -g "steer://led/auto"Hand the light bar back to Steer's own palette.
open -g "steer://haptic/<pattern>"Pulse the pad: pulse, double, success, error, warning.

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.

Honest about the edges

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.

Join the launch list See everything Steer does