1 request needs you

Your agent is waiting. Answer it.

The permission prompt from your coding agent, on your phone, with the exact command or diff. Try it on the right.Try it below.

Live demo · nothing leaves this page

No answer by 3:00 and this terminal shows Claude Code’s own prompt, as it would without Reins.

Needs you

Claude Code · payments-api19s

Push to main with --force

Edit src/auth/session.ts

git push --force origin main
- if (expired) return null;
+ if (expired) {
+   return refresh(token);
+ }

Rewrites the branch on the remote

Press and hold, or hold Space. Pressing twice also works.

  • Straight from your phone to your machine. No Reins account.
  • No answer in three minutes? Your agent asks at your desk instead.
  • Free on two machines, for good.

Asks you before it runs:

  • Claude Code
  • Cursor
  • OpenCode
  • GitHub Copilot CLI
  • Amp
  • Pi
  • Qwen Code
  • Devin
+ 9 more

Your agent does not stop when you step away.

It reads, edits, installs and migrates. Then it reaches the one command you wanted to see first, and one of two things happens.

  1. It stalls.

    It asks. Nobody answers. The run sits on one prompt until you are back at your desk.

  2. Or it never asks.

    You started it with --dangerously-skip-permissions, so the question is gone. Fast, right up until the command you would have stopped.

Reins keeps the question and brings it to your phone.

Three steps, then it’s on.

  1. Install the daemon.

    One static binary for macOS, Linux and WSL2, with no runtime dependencies. It runs as your user.

    brew install enraio/tap/reins

    or

    curl -fsSL https://reins.enraio.com/install.sh | sh

    Or download a binary and check the SHA-256

  2. Run reins setup.

    It sets the daemon to start at login (with Homebrew, use brew services and --no-service), wires hooks into every supported agent it finds, and prints a pairing QR. reins doctor tells you which agents are wired.

  3. Scan it from the app.

    The QR carries the routes to your machine, its host-key fingerprints and a key minted for this pairing. Never a password. Treat it like a key.

Next time an agent reaches for git push --force, your phone asks first.

The full quickstart, the CLI reference and how each agent is wired are in the docs.

Enough context to make the call.

Not a vague notification. The agent, the folder, the exact command, the diff for an edit, and a warning when it can’t be undone.

Approve before it runs.

Every request arrives as a card that answers four questions before you decide. A command that can’t be undone takes a press-and-hold; an edit is one tap. Deny all clears the queue.

Who asked
Claude Code, in ~/src/payments-api, 19 seconds ago.
What changes
The exact command. For an edit, the diff, line by line.
Why it needs you
A force-push rewrites remote history, so it takes a hold, not a tap.
If you do nothing
After three minutes the agent shows its own prompt at your desk.

Seventeen agents can ask.

One reins install-hooks wires every agent below for approvals. Codex reports finished turns; you can watch and take over, but it cannot be asked for approval.

  • Claude Code
  • OpenCode
  • Pi
  • Cursor
  • Qwen Code
  • Qoder
  • Factory Droid
  • Kimi Code
  • GitHub Copilot CLI
  • Amp
  • Grok Build
  • Antigravity
  • Hermes
  • jcode
  • Devin
  • OMP
  • OmO

It cannot lock you out.

No daemon, no phone, or no answer within three minutes, and the agent shows the prompt it would have shown anyway. An unanswered approval is never a denial. If you want a command blocked, tap Deny.

What the Reins hook does when something fails
If Then
Daemon isn’t running The shim exits immediately. Your agent shows its normal prompt.
Daemon running, no phone attached Exits immediately, unless a push wake is in progress. It doesn’t burn the timeout on a phone that isn’t there.
Phone attached, nobody answers Waits up to three minutes (the hooks pass --timeout 180s), then exits. Normal prompt.
You tap after the shim gave up Ignored. A late tap is never a live approval.
Daemon crashes mid-decision The socket read fails and the shim exits. Normal prompt.
The push relay is down Push is skipped; the approval passes through to the desk prompt as usual.

What it looks like.

One real approval, start to finish, then the screens themselves: what needs you, what is running, and the machines.

Recorded, not mocked: Claude Code on a Mac, the app on an Android phone. The tests take a tap; the force-push takes a hold.
  • The Inbox screen: three requests waiting, the first from Claude Code in storefront, with Deny and Approve buttons.
    Inbox. What needs you first, and the machine that asked.
  • The Review screen for a database migration command, with a warning that it changes the schema and what Approve, Deny and Ignore each do.
    Review. The exact command, the risk, and what each answer does.
  • The Review screen for an edit to src/lib/cart/totals.ts, showing the diff line by line.
    An edit shows its diff before it lands.
  • A Claude Code session: the live transcript with tool calls, then the approval card inline and a message box.
    The live transcript, with the approval inline.
  • The Machines screen: two paired machines, the Free plan, and per-phone switches for alerts, voice input and Stay connected.
    Two machines, free. The phone settings are three switches.

Your phone talks to your machine.

Nothing of ours sits in between. Most remote-control tools for coding agents put a server between your phone and your machine, then encrypt so the server can’t read your work. That’s the right answer if you have a server. Reins doesn’t. Your phone bootstraps over SSH to your own machine, verifies its host key against the fingerprints from pairing, and holds an encrypted, resumable connection to the daemon from then on. There is no account to breach and no service that has to stay up for approvals to work.

Where your session travels Two diagrams. Relay-based tools: your phone connects to a relay server, which connects to your machine, so the session passes through the server, encrypted. Reins: your phone connects to your machine directly, and the middle, where a relay would sit, is empty. Relay-based tools phone → relay → your machine phone relay a server machine encrypted so the server can’t read it Reins phone → your machine phone machine nothing of ours in between

What does touch a server

Wake-up push
Optional, Android today. The notification says only “An agent needs you”. The relay stores nothing; the approval itself still travels over your paired connection.
Reins Pro purchases
Google Play and RevenueCat see an anonymous ID and your purchase. Nothing about your machines or sessions.
Dictation
Your phone’s own speech service, so Apple or Google transcribe it. Type if that matters.

Tailscale or a VPN, if you use one, is in your network path. The daemon also announces itself on your LAN over mDNS so the app can find it; --advertise=false turns that off. Details on the privacy page.

Check it yourself

  1. lsof -nP -iTCP -sTCP:LISTEN | grep reins

    The loopback listener for the local shims (127.0.0.1:7777) and the transport port your paired phone dials (:7778 unless you changed --transport-listen), and the pairing port (:7779 unless you changed --pair-listen). Anything else is worth an email.

  2. lsof -nP -i | grep reins

    Inbound connections from your phone. Outbound only to the push relay while it wakes a phone, and to any webhook URL you configured yourself.

  3. sudo tcpdump -i any -n 'not port 22 and not host 127.0.0.1'

    Run it while you use the app with other apps quiet. Traffic tied to Reins should be the transport flow to your phone, mDNS on your LAN, and the push relay only while a phone is being woken. Compare that with what you see.

The full security write-up

Removing the middleman costs something. Here is what.

If one of these is the thing between you and using it, say so: hello@enraio.com. It’s the most useful signal we can get right now.

  1. Your machine has to be reachable.

    Same network works out of the box. Anywhere else needs Tailscale or a VPN, and that is a second thing to install. A relay-based tool doesn’t have this constraint.

  2. On iPhone, notifications need the app alive, for now.

    Android phones are woken through the push relay even when Reins is closed. iPhone push needs Apple’s service and isn’t wired up yet, so alerts arrive while the app is open or backgrounded, and a pending approval shows on the lock screen as a Live Activity.

  3. No history while your machine is off.

    Reins reads transcripts off your disk. Laptop closed, nothing to read.

  4. Replying needs herdr, tmux or zellij.

    Typing from the phone goes into the terminal where the agent runs; a bare terminal has no API for that. Answering a question card needs herdr. Approvals and the live feed work regardless.

  5. The chat transcript is Claude Code only, today.

    Other agents show their status and a terminal.

Free on two machines. Pro when you want a third.

Free

Always. No trial, no time limit.

  • Two paired machines, with one Inbox that names the machine that asked
  • All eighteen supported agents, with approvals on seventeen
  • Push notifications (Android today; iPhone when APNs lands)
  • The terminal, with shells that survive drops
  • The default key bar
  • SSH key, password and jump-host login
  • Biometric lock
  • Dictation

Pro

  • $5.99 a month
  • $59.99 a year
  • $159.99 once

Everything in Free, plus:

  • More than two paired machines
  • Agents board: every session by state, with its context budget
  • Diff viewer and file browser: the working tree hunk by hunk, files at any commit
  • Custom key panels
  • Terminal fonts and themes
  • Crop and mark up images before sending
  • Browser preview of a dev server

Pro is bought in the app, through Google Play on Android and the App Store on iPhone, as a monthly or yearly subscription or one payment for good. Prices are in US dollars; your store shows its own currency. No Reins account. If a subscription lapses, free keeps working and paired machines stay paired.

Questions engineers ask first

How is Reins different from Claude Code’s built-in Remote Control?

Remote Control runs through Anthropic’s infrastructure and is tied to an Anthropic subscription. Reins connects your phone to your own machine, is free on two machines, lets seventeen agents ask for approval instead of one, and gives you a real shell on the host. The cost is that your machine has to be reachable from the phone (the trade, in full).

How is Reins different from Happy Coder, Moshi or another relay-based tool?

A relay-based tool routes your session through a server and encrypts it so the server cannot read it. Reins removes the middle instead: the phone talks to your machine directly, so there is nothing in between to protect. A relay has real advantages: it reaches your laptop from anywhere with no network setup, and it can show history while your machine is off. Check each product’s own documentation for how it connects.

Is this just SSH port forwarding with extra steps?

At the network level, mostly yes, and that is the point: SSH does the part it is proven at, the bootstrap with a checked host key. The work is in the steps: hooks across seventeen agents, a shim that fails open, QR pairing that verifies the host key, a connection that survives a switch from Wi-Fi to cellular, and a shell that is still there after the tunnel drops.

If there’s no relay, how does my phone reach my machine over cellular?

It dials your machine directly, so the machine has to be reachable from wherever the phone is. On the same network that works out of the box. Away from it, put both on Tailscale or a VPN: the phone picks up the new route on its next connect, and uses whichever route answers. The connection survives a switch from Wi-Fi to cellular, so a session keeps going when you leave the house.

Which coding agents can ask for approval from my phone?

Seventeen: Claude Code, OpenCode, Pi, Cursor, Qwen Code, Qoder, Factory Droid, Kimi Code, GitHub Copilot CLI, Amp, Grok Build, Antigravity, Hermes, jcode, Devin, OMP and OmO. Codex is supported, but its hook runs after a turn rather than before a command, so Reins reports its finished turns and you can watch and take over in the terminal; it cannot ask you to approve. The live chat transcript is Claude Code only; other agents show status and a terminal. reins doctor tells you which agents on your machine are wired.

What happens if I don’t answer an approval?

After three minutes (the installed hooks pass --timeout 180s, long enough for a push to wake a sleeping phone) the hook gives up and the agent shows the permission prompt it would have shown anyway, at your desk. A tap that arrives after that is ignored. An unanswered approval is never a denial; if you want a command blocked, tap Deny. The fail-open table covers every case.

What happens when my phone is in my pocket and the app is suspended?

On Android, with alerts on, the daemon sends one push that says only “An agent needs you” and holds the approval for up to 45 seconds while the phone reconnects. If the phone does not come back, that costs one hold, and approvals then pass straight to your desk prompt for ten minutes. “Stay connected” (Machine, then This phone) keeps the link open instead, at the cost of a permanent quiet notification. iPhone has no closed-app push yet because it needs Apple’s push service: alerts arrive while the app is open or backgrounded, and a pending approval shows as a Live Activity on the lock screen. More in Staying reachable.

What does Reins send to you?

Nothing about your work: no telemetry, no analytics, no crash reporting, no phone-home. Two optional things touch a server: the wake-up push, which carries only “An agent needs you”, and buying Pro, which goes through the App Store or Google Play and RevenueCat. Dictation uses your phone’s own speech service, so Apple or Google transcribe it. Tailscale or a VPN, if you use one, is in your network path, and the daemon announces itself on your LAN over mDNS unless you pass --advertise=false. The privacy page has the full list.

Can my phone type into my computer?

Yes, while chat send is on, which is the default: replying types into the terminal your agent runs in, and every session has a real shell. That makes a paired phone as privileged as a shell on the host, so pair only your own devices. Run the daemon with reins serve --allow-chat-send=false to keep approvals and the live feed and remove typing. More on the security page.

Do I need an account? Is there a trial?

No account, and nothing to trial: free has no time limit. Reins is free on two machines with every agent, push, the terminal and biometric lock. Pro adds more than two machines and a few extra tools, for $5.99 a month, $59.99 a year or $159.99 once, in your store’s own currency (Free and Pro).

Is the Reins source code public?

No. The source is proprietary. The install script, the signed binaries and their SHA-256 checksums are public at github.com/enraio/reins. In place of trust, the security page lists commands that show what the daemon listens on and connects to.

Is Reins in the App Store and Google Play?

Yes, both: download it on the App Store for iPhone, or get it on Google Play for Android.

Leave the desk. Keep the prompt.

Get the app

Then the daemon

brew install enraio/tap/reins

Then reins setup, and scan the QR from the app.