Tap to approve
Claude Code hits rm -rf build/. Your phone buzzes. Diff, cwd, reason. Approve, deny, or edit the command and approve.
Human steering layer for AI agents
One inbox for every approval, question, and direction request from every agent you run. Local or cloud. Sync or async. From any device, whenever you want.
$ curl -fsSL steery.ai/install | sh
curlPOST /promptsSSE · APNs · FCM · chatPOST /prompts/{id}/answer → GET /prompts/{id}/wait returns → agent resumeswait or takes a signed webhook. Same request.seq. Every client resumes from a cursor. Nothing is lost.Claude Code hits rm -rf build/. Your phone buzzes. Diff, cwd, reason. Approve, deny, or edit the command and approve.
A cloud agent needs a decision at 14:02. You answer at 20:15. It resumes with your answer. No re-run, no lost context.
Agents send options. You pick. Free text only when it matters. Each prompt is a form the agent designed.
Send direction mid-run: “stop touching migrations”. The agent reads it at its next turn, no question required.
Approve once, set a scope and a clock. Matching requests auto-resolve. The clock is visible; you can revoke.
Telegram, Slack, iMessage. A chat channel is just another client of the same log. Reply with a word.
Route by risk: low → auto, medium → team queue, high → named approver. Every answer carries who, where, when.
Same binary. docker compose up on a laptop or one container behind TLS. Pair a device with a QR.
# agent: ask, then block
POST /v1/prompts
{ "kind": "approve", "title": "Run rm -rf build/", "payload": { "command": "rm -rf build/" } }
→ 201 { "id": "01J9…", "seq": 4182 }
GET /v1/prompts/01J9…/wait?timeout=600
→ 200 { "decision": "allow", "by": "aram@iphone", "payload_sha256": "…" }
# you: tail everything, resume from where you were
GET /v1/stream Last-Event-ID: 4181
event: prompt.created id: 4182
event: prompt.answered id: 4183
POST /v1/prompts/01J9…/answer
{ "decision": "allow", "payload_sha256": "…" }