Your AI agents, from anywhere.
Steer, approve, and interrupt Claude Code, Codex, and Gemini CLI from your phone. End-to-end encrypted. Your keys. Your code. Nothing in between.
╔══ PHONE ═══════════════════╗ ╔══ DESKTOP ════════════════════════╗ ║ ║ ║ ║ ║ * myapp ║ ║ $ steer ║ ║ Claude Code Active ║ <----> ║ + Paired with iPhone 15 ║ ║ ║ E2E ║ + Watching ~/projects/myapp ║ ║ ┌────────────────────┐ ║ encrypt ║ ║ ║ │ Analyzing auth.ts..│ ║ ║ ┌──────────────────────────┐ ║ ║ │ Found 3 issues. │ ║ ║ │ Analyzing auth.ts... │ ║ ║ │ ░░░░░░░░░░░░░ 100% │ ║ ║ │ Found 3 issues: │ ║ ║ └────────────────────┘ ║ ║ │ │ ║ ║ ║ ║ │ 1. Null check line 42 │ ║ ║ ╔════════════════════╗ ║ ║ │ 2. Unused import: lodash │ ║ ║ ║ [ S T O P ] ║ ║ ║ │ 3. Type assert w/o guard │ ║ ║ ╚════════════════════╝ ║ ║ └──────────────────────────┘ ║ ║ ┌────────────────────┐ ║ ║ ║ ║ │ Type a message... │ ║ ║ Fix all three? (y/n) _ ║ ║ └────────────────────┘ ║ ║ ║ ╚════════════════════════════╝ ╚═══════════════════════════════════╝
╔══ PHONE ══════════════╗
║ ║
║ * myapp Active ║
║ ║
║ Analyzing auth.ts ║
║ Found 3 issues. ║
║ ░░░░░░░░░░░░░ 100% ║
║ ║
║ ╔════════════════╗ ║
║ ║ [ S T O P ] ║ ║
║ ╚════════════════╝ ║
║ ┌────────────────┐ ║
║ Type a message.. ║
║ └────────────────┘ ║
╚════════════════════════╝
| E2E
| encrypted
v
╔══ DESKTOP ═════════════╗
║ $ steer ║
║ + Paired ║
║ + Watching myapp ║
╚════════════════════════╝ AI agents don't wait for you.
You step away. Your agent hits a permission prompt. It waits. You don't know. Twenty minutes later you're back, staring at a frozen terminal, realizing your agent needed a single "yes" to keep going.
Or worse — it's doing something destructive and you can't stop it because your laptop is in the other room.
Steer fixes this. One tap to approve. One tap to stop. From anywhere.
Three steps. Under a minute.
Install the CLI
$ npm i -g @steer/cli
$ cd ~/your-project
$ steer
┌──────────────────┐
│ ▓▓▓▓ ▓▓▓▓ ▓▓▓▓ │
│ ▓▓▓▓ ▓▓▓▓ │
│ ▓▓▓▓ QR ▓▓▓▓ │
│ ▓▓▓▓ ▓▓▓▓ │
│ ▓▓▓▓ ▓▓▓▓ ▓▓▓▓ │
└──────────────────┘
Scan with Steer app Scan the QR
Keys exchanged via
Noise IK protocol.
┌───────┐ ┌───────┐
│ [KEY] │─│ [KEY] │
└───────┘ └───────┘
phone desktop
░░░░░░░░░░░░░░░░░░░
Zero-knowledge.
One round-trip. You're in control
╔═════════════════════╗ ║ ║ ║ * myapp Active ║ ║ ║ ║ Agent is working ║ ║ on auth.ts... ║ ║ ║ ║ ╔═════════════╗ ║ ║ ║ [ S T O P ] ║ ║ ║ ╚═════════════╝ ║ ║ ║ ╚═════════════════════╝
Stop anything, instantly.
One tap sends SIGINT. Hold for SIGKILL. Your agent obeys in under 200ms, even on a cellular connection. No SSH. No tmux. No laptop required.
╔════════════════════════╗ ║ ║ ║ ╔══════════════╗ ║ ║ ║ [ S T O P ] ║ ║ ║ ╚══════════════╝ ║ ║ ║ ║ tap : SIGINT ║ ║ hold : SIGKILL ║ ║ 2x : terminate ║ ║ ║ ║ Response: <200ms ║ ╚════════════════════════╝
Permission prompts, in your pocket.
When Claude Code wants to run rm -rf build/ or edit a sensitive file, you get a push notification. Review the command, see the risk level, and approve or deny without touching your laptop.
╔═════════════════════════╗ ║ (!) Permission Request ║ ║ ───────────────────── ║ ║ ║ ║ Claude wants to run: ║ ║ rm -rf ./build/ ║ ║ ║ ║ Risk: ▓▓▓▓▓▓░░ HIGH ║ ║ ║ ║ [+ Allow] [x Deny] ║ ╚═════════════════════════╝
Your code never touches our servers.
Noise Protocol IK handshake. ChaCha20-Poly1305 encryption. Keys generated and stored in your phone's Secure Enclave. We relay opaque encrypted blobs. We can't read them. Nobody can — except your paired devices.
phone ── relay ── desktop
| | |
| ┌────┐ | ┌────┐ |
| │▓▓▓▓│─┼─│▓▓▓▓│ |
| └────┘ | └────┘ |
| | |
keys opaque keys
here blobs here
only Everything you need. Nothing you don't.
Diff Viewer
Review code changes with syntax highlighting before approving. Side-by-side on tablet.
Cost Dashboard
Track tokens, costs, and spending trends across all sessions. Set budget alerts.
Slash Commands
/clear, /compact, /status, /cost, /git diff — plus your own custom commands.
Background Service
Install a background listener on your machine. Start new sessions from your phone without touching the keyboard.
Multi-Agent
Claude Code, Codex, Gemini CLI, or any CLI tool. Switch agents mid-session.
Session History
Browse past sessions, see token counts and costs. Continue where you left off.
Smart Notifications
Only get notified for what matters: permission prompts, errors, completion. Not noise.
Universal Links
Sign in by tapping the link in your email. No codes to copy. Magic link opens the app directly.
QR Pairing
Scan a QR code to pair your phone with your desktop. Cryptographic keys exchanged instantly. No accounts needed.
We can't read your code. By design.
╔══════════════════════════════════════════════════════════════╗ ║ ║ ║ WHAT THE SERVER SEES WHAT YOUR DEVICES SEE ║ ║ ════════════════════ ═══════════════════════ ║ ║ ║ ║ - Session ID (UUID) - Full terminal output ║ ║ - Timestamp of activity - File diffs with color ║ ║ - Encrypted blob size - Permission prompt details ║ ║ - Source: mobile/desktop - Project paths and names ║ ║ - Agent type and config ║ ║ That's it. - Cost data and tokens ║ ║ No code. No paths. - Every keystroke you send ║ ║ No prompts. No diffs. ║ ║ No file names. Decrypted only on your ║ ║ devices. ║ ║ ║ ╚══════════════════════════════════════════════════════════════╝
Every byte between your phone and desktop is encrypted with ChaCha20-Poly1305 before it leaves either device. The Cloudflare relay that connects them handles routing — not reading. Your encryption keys live in hardware (Secure Enclave on iOS, Keystore on Android) and never leave the device.
If we get hacked, attackers get encrypted blobs and session metadata. Your code, your prompts, your diffs — all unreadable without your keys.
Read the full security whitepaper →How Steer compares.
╔═════════════════════╤═══════════╤═══════════╤═══════════╤═══════════╗
║ │ Steer │ Happy │ Kibbler │ SSH+tmux ║
║ │ │ Coder │ │ ║
╠═════════════════════╪═══════════╪═══════════╪═══════════╪═══════════╣
║ Interrupt agent │ ✓ <200ms │ ✗ │ ✗ │ ~2s ║
║ E2E encrypted │ ✓ Noise │ ✗ │ ✗ │ ✓ SSH ║
║ Hardware keys │ ✓ │ ✗ │ ✗ │ ✗ ║
║ Permission prompts │ ✓ │ ✓ │ ✓ │ ✗ ║
║ Diff viewer │ ✓ │ ✗ │ ✓ │ ✗ ║
║ Cost tracking │ ✓ │ ✗ │ ✗ │ ✗ ║
║ Multi-agent │ ✓ │ ✗ │ ✓ │ ✓ ║
║ Daemon mode │ ✓ │ ✗ │ ✗ │ ✓ ║
║ Tablet layout │ ✓ │ ✗ │ ✗ │ ✗ ║
║ Works offline* │ queued │ ✗ │ ✗ │ ✗ ║
║ Recovery phrase │ ✓ │ ✗ │ ✗ │ n/a ║
║ Price (Pro) │ $9.99/mo │ $19.99/mo │ $3.99/mo │ free ║
╚═════════════════════╧═══════════╧═══════════╧═══════════╧═══════════╝
* queued: commands encrypted and queued until reconnect Start free. Upgrade when you need more.
Free
- 1 concurrent session
- Claude Code only
- Basic push notifications
- E2E encryption included
- Interrupt mechanism
Pro
- Unlimited sessions
- All agents (Claude Code, Codex, Gemini, custom)
- Cost dashboard & budget alerts
- Diff viewer for code changes
- Smart notifications
- Custom slash commands
- Background service (remote start from phone)
- Session history & cost tracking
Team
- Everything in Pro
- Shared session observation
- Audit logs
- SSO / SAML
- Role-based access control
- Priority support
All plans include end-to-end encryption, the interrupt mechanism, and QR pairing. Your code never touches our servers on any plan.
That's it. You're in control.
╔════════════════════════════════════════════════╗ ║ ║ ║ $ npm i -g @steer/cli ║ ║ ║ ║ Then scan the QR with the Steer app. ║ ║ That's it. You're in control. ║ ║ ║ ╚════════════════════════════════════════════════╝