Remote For Xirp

See and steer your coding agents from your phone.

A mobile web app for Xirp, the agent desktop app from Spotify. The sessions running on your Mac — Claude Code, Codex, Gemini, or whatever else Xirp is driving — can be watched and answered from an iPhone or Android without going back to the desk. It runs on your own network, not through anyone's cloud.

What it looks like

Screenshots from a phone. The machine, project and session names are made up; the layout, spacing and colours are the real thing.

The machines screen: one Mac online, five agents running, and a button to add a machine by scanning a pairing code.
Machines — several Macs, if you have them.
A machine's projects, each with a count of sessions, how many are running, and how many branches they cover.
Projects on that machine.
Sessions in one project, each showing its branch, agent, context used, cost so far and last activity.
Sessions, with branch, agent, context and cost.
A session transcript rendered as chat, with the agent's reply, a code block, a collapsed tool-call chip and a message box.
The transcript, as chat — and a box to answer it.
A session's changed files, split into what the branch changed against main and what is not committed yet, with a link to the open pull request.
What it changed, committed and not.
A syntax-coloured unified diff of one Python file, with added and removed lines and a hunk header.
The diff for one file.
The same session transcript in dark mode, with the same layout and a dark background.
Dark, when your phone is dark.

Install

curl -fsSL https://raw.githubusercontent.com/AboveColin/remote-for-xirp/main/install.sh | sh

That drops a universal binary into ~/.local/bin and stops. Nothing starts listening because you piped a script into a shell — starting it is one explicit command, which prints a QR code to scan with your phone:

xirp-remote interfaces              # which address can a phone reach?
xirp-remote install --generate-key # start it, and print a QR code

What it does

Machines, then projects, then sessions

Several machines running Xirp, each with its projects and their sessions.

Chat, transcript, or the real tmux pane

The pane is the actual one, so slash commands, model pickers and permission prompts work without this app knowing they exist.

Review the diff

What a session changed, uncommitted and against its base branch, with the file diff and a link to the branch's pull request.

Notifications

Web Push with the app closed: when an agent finishes a turn, when a session ends or fails, and when one wants an answer. The first of those is the status Xirp sets only when nobody is at the desk.

Live, not polled

The bridge follows the daemon's own broadcasts and streams what changed, so a session that finishes shows up in about a second. A poll stays underneath for a phone that slept through it.

Answer a permission prompt

Xirp holds a request for half a second, then its own dialog takes over. So the app reads the numbered menu the agent drew in its terminal and offers those numbers as buttons. It shows nothing when it cannot see a menu.

Send it a screenshot

Written to a temp folder on the Mac, with the path put in the agent's input unsent, so you still say what to do with it. Nothing lands in your repository.

Saved prompts

The prompts you keep in Xirp on the desktop, one tap away. Tapping one fills the composer and stops there, so sending stays deliberate.

Start, fork, hand over

Start a session with a project, agent and model. Fork one that went the wrong way, or hand it to a different agent.

Pair by QR

The access key travels in the URL fragment, so it never reaches a server log, and the page clears it from the address bar.

Light and dark

Follows the phone, with an override in Settings. The terminal stays dark in both: the agent chose its ANSI colours for a dark background.

What you need

What it deliberately will not do

It reaches 35 of the daemon's 223 request types and listens to 9 of its broadcasts. No git writes, no terminal attach, no session deletion, no settings changes. Approving a permission prompt through the API is still absent, because the daemon holds a request for about half a second before its own dialog takes over, which no human beats. What the app does instead is answer that dialog: it reads the numbered menu the agent drew and types the number, and shows nothing when it cannot see one.

Questions

Does it work on Windows or Linux?

No. The host has to be macOS, because the Xirp daemon's access token exists only in the desktop app's process environment, which only the same user on the same machine can read.

Does my session data go through a cloud service?

No. The binary runs on your own Mac and serves the app over your own network. There is no account and no third-party relay. Web Push notifications are the one exception: their payloads are end-to-end encrypted per RFC 8291 before they reach the browser vendor's push service.

Can I approve permission prompts from my phone?

No, and it is left out on purpose. The daemon holds a permission request open for about half a second before falling through to the agent's own dialog, which is too short for any polling client to catch. Use the real tmux pane view, where the agent's own prompt appears and can be answered.

Do slash commands work?

Yes, in the terminal view. It shows the session's actual tmux pane, so slash commands, model pickers and any other interactive prompt work without this app needing to know they exist.

Does installing it start a server on my machine?

No. The installer places a binary and stops. Starting the service is a separate explicit command, xirp-remote install, which also prints the QR code for pairing.

Is this made by Spotify or by the Xirp developers?

No. Xirp is a Spotify product; this is an unaffiliated third-party app that talks to the Xirp daemon's local API on your own machine. It is not made, endorsed or supported by Spotify, and it is MIT licensed.

What is Xirp?

Xirp is a desktop app from Spotify for running coding agents — Claude Code, Codex, Gemini and others — in parallel git worktrees on macOS. It exposes a local WebSocket API on the machine it runs on, which is what this app talks to. This does not replace it: Xirp has to be installed and running.