Human steering layer for AI agents

Your agents ask.
You steer.

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

Rust gateway · Postgres · native macOS, iOS, Android · chat channels · Apache-2.0

inbox 0 waiting
    connected · cursor 0

    Three calls. Any harness.

    agentClaude Code, Codex, Cursor, SDK, MCP, curl
    POST /prompts
    steerydurable log · push · policy · audit
    SSE · APNs · FCM · chat
    youphone, desktop, Telegram, Slack
    POST /prompts/{id}/answerGET /prompts/{id}/wait returns → agent resumes

    What steering looks like

    Tap to approve

    Claude Code hits rm -rf build/. Your phone buzzes. Diff, cwd, reason. Approve, deny, or edit the command and approve.

    sync · PermissionRequest hook

    Answer at dinner

    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.

    async · resume token

    Choose, don't type

    Agents send options. You pick. Free text only when it matters. Each prompt is a form the agent designed.

    kinds · approve · choose · ask

    Steer unprompted

    Send direction mid-run: “stop touching migrations”. The agent reads it at its next turn, no question required.

    steer · agent-pulled

    Allow similar for 1h

    Approve once, set a scope and a clock. Matching requests auto-resolve. The clock is visible; you can revoke.

    policy · timeboxed

    Reply where you are

    Telegram, Slack, iMessage. A chat channel is just another client of the same log. Reply with a word.

    channels · one protocol

    Team steering

    Route by risk: low → auto, medium → team queue, high → named approver. Every answer carries who, where, when.

    routing · audit

    Local or cloud

    Same binary. docker compose up on a laptop or one container behind TLS. Pair a device with a QR.

    self-host · Rust + Postgres
    Claude CodeCodexCursorOpenAI AgentsLangGraphMCPcurl

    The whole protocol fits on a card

    # 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": "…" }