Prthole

Run Claude Code on your computer. Answer it from your phone.

Porthole puts every Claude Code session on your Mac or Linux computer on your Android phone, so you can answer, approve and type into each one over your own Tailscale network.

Needs Android 10 or later, a Mac or Linux computer running Claude Code in tmux, and Tailscale on both. There is no account to make.

The film

Left Running

A computer left running, a question it can't answer alone, and a walk in the park that doesn't have to end early. One minute, hand-drawn, with sound.

Claude Code keeps working at home while its person takes the dog to the park. When it has a question, the phone buzzes; one tap answers it, and the work carries on until they are home.

Setup

How it works

Two pieces: portholed, a small daemon on the computer where Claude Code runs, and the Porthole app on your phone. They talk over your tailnet and nothing else.

  1. Install the daemon

    On a Mac with Homebrew, on Linux with the installer from the repository. portholed runs as a background service (launchd on a Mac, systemd on Linux) and adds a Claude Code hook for approvals.

    brew install shrimpscript/tap/porthole ./tools/install.sh
  2. Pair the phone

    The computer prints a QR code and a 6-digit code. Scan it or type it into Porthole. The code works once, for five minutes.

    portholed pair
  3. Supervise

    Start Claude Code with porthole instead of claude: it runs inside tmux, where the phone can type into it. Every session on the computer shows up on the phone.

    porthole

On the phone

What you can do from the phone

The scenes below show Porthole as it looks on the phone and, where it matters, the same session on the computer. The buttons under a scene step through it.

Sessions

Every session, with the ones waiting on you first

One row for each Claude Code running on the computer, grouped into Needs you, Live and Recent. A working row says what the session is doing and for how long. When a turn ends, a dot marks the row until you look. Open it for the feed: your prompts, Claude's replies, and every tool call with how long it took.

  • A session stopped on a question or a permission prompt goes to the top, saying what it wants.
  • Each row names its tmux session, so two sessions in one folder stay apart.
  • More than one computer in the same list, with one that cannot be reached kept apart.

Approvals

Allow or deny, with the command in full

When Claude Code asks permission to run a tool, the request reaches the phone with the command exactly as it will run, and how long is left to answer. A request you leave unanswered goes back to the prompt at the desk.

  • Nothing is approved for you, and there is no “always allow”.
  • It works through a Claude Code permission hook. portholed uninstall-hooks removes it; everything else keeps working.

Changes

What changed

The git status and diff of the session's folder, file by file, with lines added and removed. The daemon runs only read-only git commands, and only in that folder.

Since you left

Where you left off

A session that carried on while you were away marks where you left off: 3 turns since you left, 4h ago, with what happened below the line. Its details hold the context window, tokens, and switches for model, effort and permission mode.

Terminal

The terminal at the desk, on the phone

The Terminal tab is the session's tmux window itself, at the desk's width, so vim looks like vim. Opening it on the phone never resizes the window at the desk.

  • A key row for Claude Code: Esc Tab ⇧Tab for permission modes, Ctrl Alt ^C, and the / @ ! menus.
  • Bigger text scrolls sideways instead of rewrapping.

Notifications

Notifications that say what happened

While a turn runs, a notification keeps time and says what the session is doing. When it ends, it says how long it worked and offers Reply, which sends the session's next prompt straight from the shade.

  • A question for you, or a usage limit, notifies at once.
  • Mute one session and it stays in the list without notifying.

Builds

Install what Claude Code builds

Working on an Android app? Publish a build on the computer and your phone offers it in a banner. Install downloads it from your computer, over your tailnet, and hands it to Android's installer, which asks first.

portholed publish app/build/outputs/apk/release/app-release.apk 1.4.0 shopping-list
  • The build stays listed under Settings > Other apps on the computer.
Builds from your projects, in the docs

Failsafe

A way back when the daemon stops

If portholed stops answering, the phone says so and offers what does not depend on it: a shell over SSH (Tailscale SSH, or on a Mac the phone's own key), and a restart of the daemon in one tap. The same shell is in Settings for when you need it on purpose.

  • portholed doctor on the computer checks Tailscale, tmux, Claude Code, the service, key expiry, SSH, sleep and disk.

Also in the app

  • Start or resumeA stopped session offers Resume or New session, in any folder Claude Code has been used in.
  • Switch Claude accountsSign the computer's Claude Code in to another account from the phone, through Claude's own sign-in, and restart running sessions on it.
  • Dev-server previewOpen a dev server running on the computer in the phone's browser, shared through the daemon over your tailnet.
  • Screen captureA screenshot or a short clip of the computer's screen, only when you ask, waking screens that have gone to sleep: built in on a Mac, with grim and wf-recorder on Wayland.
  • Agents at workA card for each subagent Claude starts, with its task, model and progress, and a sheet of every agent in the session.
  • Commands as cardsSlash commands show what they did: the effort level on a meter, the model, and /context as a breakdown of the window.
  • Steady on a bad connectionA drop leaves the session and your typing as they were; drafts and recent feeds are kept on the phone, and a message stays in its box until it was typed.
  • Quick replies and commandsOne-tap replies when Claude is idle, Claude Code's slash commands with descriptions, files named with @, and photos or any other file attached.
  • Widget and tileA home-screen widget lists the sessions; a quick-settings tile counts them.
  • Session detailsContext window, tokens and activity per session, with model, effort and permission switches and a mute.

Privacy

Privacy and security

Porthole has no servers. Your sessions travel between your phone and your computer, and nowhere else.

A phone paired with Porthole can act as you on that computer: run commands, read and write files, answer and approve. That is the product, not a side effect. Pair only your own phone, and revoke it if you lose it.

No account
Nothing to sign up for, no sign-in, no analytics. Nothing you do in the app reaches ShrimpScript, because there is nowhere for it to go.
No relay
The phone talks to your computer over your tailnet, a WireGuard connection between devices you own. Tailscale's servers relay it, still encrypted, only when a direct path cannot be made.
Tailnet only
portholed listens on the computer's Tailscale addresses, never the local network, and identifies every caller through Tailscale's WhoIs.
Paired at the desk
A new phone needs a 6-digit code printed on the computer: single-use, five minutes, ten attempts. portholed revoke cuts a phone off at once, whether or not it cooperates.
Browsers refused
Any connection that carries a browser's Origin header is refused, so a web page open on the paired phone cannot drive the daemon.
Approvals are yours
Nothing is approved automatically. A request the phone does not answer in time goes back to the prompt at the desk.
One request to GitHub
At most once a day the app asks api.github.com for Porthole's latest release. It carries nothing about you beyond the IP address any web request carries. Settings > Updates turns it off.

Install

Install

The app on the phone, the daemon on the computer, then pair them.

On the phone

Download porthole.apk from the latest GitHub release and open it. Android asks once to allow installs from your browser. You also need the Tailscale app, signed in to the same tailnet as the computer.

On the computer

A Mac with macOS 13 or later, or Linux with systemd user services; either with Tailscale and Claude Code.

On a Mac

Install the Tailscale app and sign in, and turn on Remote Login (System Settings > General > Sharing) for the failsafe. Then, with Homebrew:

$ brew install shrimpscript/tap/porthole
$ portholed setup                 # the service and the approval hook
$ portholed doctor
$ portholed pair

On Linux

With tmux from your package manager and Tailscale signed in with Tailscale SSH on (sudo tailscale up --ssh):

$ git clone https://github.com/ShrimpScript/porthole
$ cd porthole
$ ./tools/install.sh --dry-run    # read what it will do
$ ./tools/install.sh
$ sudo loginctl enable-linger $USER
$ portholed doctor
$ portholed pair

Deliberately not a curl | sh one-liner: either way installs a service that runs commands as you. The installer builds with Go if you have it; otherwise, or with --prebuilt, it downloads the release binary and checks it against SHA256SUMS, as Homebrew does.

Every step, in the docs

Updates come from GitHub

Porthole checks its GitHub releases at most once a day and shows a banner when there is a newer version. Update downloads porthole.apk over HTTPS, and Android installs it only if it is signed with the same key as the app you have.

  • Settings > Updates has Check now and a switch to stop checking.
  • The only other install banner is for builds you publish from your own computer.

Get Porthole

Free for Android. The daemon is on GitHub.

No account and no servers of ours: your sessions go from your computer to your phone over your own tailnet, and nowhere else.