Changelog
The app and the daemon share a version number and are released together. Newest first.
A restart asked for twice
4 October 2026fixes
- A session restart that was called off, then asked for again straight away, was answered "waiting" without being set going. It now starts again.
Switch Claude accounts
4 October 2026feature
- The computer's Claude account, in Settings. Settings › Claude Code shows which Claude account Claude Code on the computer is signed in to, and its plan, with Switch account and Sign out. The usage-limit card offers Switch Claude account.
- Signing in from the phone. Switch account runs Claude Code's own sign-in on the computer and opens Claude's sign-in page in the phone's browser. Copy the code the page shows and come back: Porthole picks it up and finishes, or paste it. Nothing opens on the computer, and Porthole keeps no copy.
- Sessions follow. Sessions already running are offered a restart on the new account: each comes back in its own pane on the same conversation, one busy with a turn restarts when it finishes (or not, if you cancel it), and one waiting out a usage limit stops waiting.
- Mac and Linux alike. Needs portholed 0.40.0.
A failsafe shell you can type into
4 October 2026fixes
- The failsafe shell opens at once. fish 4 asks the terminal what it is when it starts, and draws nothing and takes no typing until it hears back; Porthole's terminal never answered, so the failsafe shell stayed blank for ten seconds and then printed a warning. It now answers what a real terminal does: what kind of terminal it is, and where the cursor is. Questions about its capabilities are no longer drawn as text.
A calmer feed
3 October 2026feature
- The work folds into one line. Every tool call and every result used to be a row of its own, so a busy turn was a wall of small grey lines and the answer was hard to find. Now each stretch of work between Claude's words is one line, as in Claude's own app: "Ran 2 commands, edited a file", with the lines the edits added and removed and how many steps failed. Tap it for every step in order, each with its time or its lines and a failed step with its error, and a step for its command and full output. The lines are Claude Code's own count of each edit. While a step runs it is a line of its own, with the turning screw and its time.
- Narration and the answer look different. What Claude says on the way, between pieces of work, is quieter and set off by a line. The answer at the end of a turn is full strength, with Copy, Listen and Share beneath it. Listen reads it aloud with the phone's own voice, offline, skipping code. New replies fade in from the top down.
- A turn shows what it changed. A turn that edited files ends with a Diff chip with its lines added and removed; tap it for everything uncommitted in the folder, file by file.
- One message box. The text on top, and beneath it attach, the model and effort (tap for the switches) and send. Typing
/opens the commands; the slash button is gone. - More room for the feed. The Feed and Terminal row is now a terminal button in the session's header, and the header's chip says how full the context window is.
- Clearer session list. Each session's state (asking you, waiting for you, what it is running) has a line of its own, in colour, and the branch, tmux session and model sit quieter beneath it.
Questions you can answer, screenshots that work
3 October 2026fixesfeature
- Fix: Claude's questions could show with nothing to tap. A session's tmux window could be left one row tall, with nobody attached at the desk, and Claude Code then drew its question picker into that one line, so the phone found no choices to offer. The daemon now gives such a window a readable size while nobody is at the desk, and puts tmux's own sizing back, so your terminal still sizes it when you sit down. If a question still cannot be read from the screen, the phone shows it with a button to answer it in the terminal, instead of nothing.
- Fix: screenshots failed whenever you were away. Sleeping screens draw nothing, and the capture waited for a frame that never came. A screenshot or a clip now wakes the screens that are asleep, takes the picture, and puts them back to sleep a few seconds later, unless the mouse moved meanwhile because someone sat down. The caption says when it did. Failures are logged on the computer. Hyprland and sway on Linux; on a Mac the display wakes and sleeps again on its own timer.
- Fix: the website button. A dev server shared from the phone is now opened at the computer's tailnet address, which needs no name lookup in the phone's browser, and a share also answers to the computer's short MagicDNS name, which it used to refuse. Each step is logged on the computer. Checked end to end with a real dev server.
- Fix: links ended in
**. When Claude writes a link in bold, the closing stars are no longer read as part of the address. - Sent files look like files. A message with pictures or files shows them beside its bubble, pictures as thumbnails and other files as named chips, instead of the paths the daemon adds and the
[Image #1]tokens and paste tags Claude Code writes. A picture Claude Code attached from your message sits small on your side of the feed. - Quick replies in Settings. With every quick reply deleted, a pencil used to sit alone above the message box. Now the row goes, and Settings has a Quick replies entry to edit them or bring them back.
- Live view removed. "Watch the screen" was a loop of screenshots, slow and with the same problem with sleeping screens. A real remote desktop is planned as its own release.
A long message with pictures is sent, not left at the desk
3 October 2026fixes
- Fix: a long message with pictures could be left unsent in Claude Code's box at the desk. Claude Code attaches pictures named in a message one by one, and an Enter that arrives while it does is lost. The daemon pressed Enter at once, so the message sat in the box at the desk unsent, while the phone was told it had gone and let go of it. Now the daemon types the message as one paste, waits a moment longer for one with files, and watches for Claude Code to record it. If the message is still in the box, it presses Enter again (only then, so a stray Enter never answers anything else). If Claude Code still has not taken it, the phone is told, and the message and its files come back to the box. Checked against a real Claude Code with three pictures. Mac and Linux alike.
Steady through a bad connection
3 October 2026featurefixes
- A dropped connection no longer takes the screen with it. Until now a drop of a few seconds replaced the session with the failure card, threw away what you were typing, and on the way back reloaded the feed from scratch, so it flashed blank and jumped to the bottom. Now the feed, where you had scrolled to, an open sheet and the message you are typing all stay. A bar says Reconnecting… after a second or two, and after a few tries offers Options, the failure card's tools. When the computer answers, what happened meanwhile is added below what you were reading. The session list stays too, its rows reading "as last seen". The full failure card is kept for a computer that refuses the phone, or when there is nothing to show.
- The message box keeps taking typing. It used to lock the moment the connection dropped, closing the keyboard mid-word. Now only Send waits for the computer.
- Drafts are kept. Each session's unsent message is saved on the phone as you type. A drop, the app closing or the phone restarting no longer loses it.
- A message stays in the box until it is typed. The box holds it, greyed, until the computer says it typed it into the session, which is a moment on a good connection. If it is refused, the reason shows and the text stays to send again. If the connection goes before the answer, the feed decides when it comes back: shown there means it was typed, missing means it stays in the box. Nothing is re-sent on its own. Text-only messages used to vanish when a send failed.
- Sessions open at once, even offline. The phone keeps the last 200 rows of the 20 sessions you opened most recently, and the session list, in its private storage. A session opens from its copy straight away and catches up when the computer answers. With no connection, the copy is there to read, and the bar says when it was saved. Forgetting a computer deletes its copies. The privacy page lists exactly what is kept.
- Mac and Linux alike. The daemon now answers every message the phone names, not only those with files.
Commands as cards
3 October 2026featurefixes
- A slash command shows what it did. A command run in the session, at the desk or from the phone, was one grey line saying you ran it. It is now a card.
/effortshows the level on a five-step meter, the CLI's description of it, and whether it is now the default for new sessions./modelshows the model by name,/renamethe new name./contextshows the window to scale, the share held back for autocompact, and what fills it, largest first, with deferred tools named apart because they are not loaded yet. Any other command shows the CLI's reply, in red when it came as an error; a skill Claude Code loads by itself is a quiet line, not a card. A compaction and a/clearare lines across the feed, and a compaction says how many tokens it freed. Mac and Linux alike. - Session details answers
/model,/effort,/cost,/statsand/status. Typed on their own, or picked from the slash menu, they open the sheet with its switches and numbers instead of a menu on the computer's screen. With an argument, such as/effort high, they are typed into the session as before./contextno longer switches to the terminal: its answer lands in the feed, and in a new By category section of the sheet, which can measure again. The effort switch gainsmax. - Fix: text Claude Code writes for itself showed as your messages. A skill's instructions, the summary a compaction leaves, and the
/contexttable appeared as if you had sent them. They are no longer in the feed. - Fix:
/compactshowed as a message. It is now the command's card while the CLI compacts, with the working strip running, then the line that says how much it freed. - Fix: a message typed while Claude was busy could show twice. It showed as queued, and when Claude Code took it, it appeared again below while the queued bubble stayed until the session was reopened. The delivered message, or the command's card, now takes the bubble's place.
See the agents Claude starts
2 October 2026featurefixes
- Subagents, live. When Claude hands work to an agent, the feed shows a card for it: what it was asked to do, what kind of agent it is and on which model, and, read from the agent's own transcript on the computer, how many tools it has used, what it is doing now and for how long. When an agent finishes, fails or is stopped, its card says so. The working strip counts the agents at work. Background agents that keep going after Claude's turn has ended get a strip of their own. Tap either for a sheet of every agent in the session, with each agent's own agents under it. The sessions list shows how many agents each session has at work. Mac and Linux alike.
- Fix: delegated work had no name. Claude Code now calls its subagent tool Agent rather than Task, and the feed only knew the old name, so those rows showed no description.
A screw for a spinner
28 September 2026feature
- The working icon is a turning screw. While Claude works, a small three-bladed screw, the ship's propeller, turns beside it. It is drawn in three dimensions: a blade brightens as it turns to face you and dims as it goes edge-on, with a faint trail behind each one. When a turn ends, the screw stands still beside "Worked for…". It replaces the copy of Claude Code's star spinner, in the list, the working strip, the feed and the composer. With animations off, it stays still.
Needs you, for permissions too
28 September 2026featurefixes
- A session stopped on a permission prompt is under Needs you. Until now only a question put a session there. Now so does anything Claude Code itself reports it is stopped on you for: a permission prompt, a tool asking for input, a sandboxed command asking for the network. The row moves to the top with the amber ring and says what it wants ("waiting for you: Bash: git push --force origin main"). It stays there for as long as it waits, including after the approval card on the phone has timed out and gone back to the desk. A menu left open at the desk, such as
/model, does not count. Mac and Linux alike. - Fix: a long command ran off the approval card. The command sat on one line that scrolled sideways, so its end, usually the part that matters, was out of view. It now wraps, so all of it is on the card.
Send a file from the phone
27 September 2026featurefixes
- Attach any file, not only photos. The paperclip beside the message box offers a photo or a file: a PDF, a log, a spreadsheet, a zip, from the phone or anywhere the system's file picker reaches, up to 10 MB in all per message. The computer saves it in
~/.config/porthole/uploads, never in the project, under its own name, and the message tells Claude where it is. Files go in pieces, so a large one on a slow connection still arrives whole, and a message whose files did not go comes back to the message box. The computer keeps what the phone sent for two weeks. Mac and Linux alike. - Fix: a photo sent from the phone dropped the connection. The daemon accepted messages of at most 32 KB, and a photo is ten times that, so the phone was disconnected and the photo never arrived. It now takes them, and a message that cannot be sent says so instead of vanishing.
- Rename a session. In a session's details, the pencil beside its name renames it with Claude Code's own
/rename, so the new name is the one at the desk and inclaude --resumetoo. A name given with/rename, at the desk or from the phone, now always comes before the titles Claude Code makes up.
Name a file with @
27 September 2026featurefixes
- @ in the message box lists the session's files. Type @ and the files in the session's folder appear above the box, the most recently changed first; keep typing to narrow them by name or by a piece of the path. A tap puts the path in the message, and Claude Code reads that file along with it, as it does when you type @ at the desk. In a git repository the list is git's own: tracked files, and new ones that are not ignored. Elsewhere it is the folder's files a few levels down, leaving out hidden ones. Only the names reach the phone. Mac and Linux alike.
- Fix: typing after a picked command went into its name. Pick /model from the list and type its argument, and the letters landed in the middle of the command (
/moxdel). A command or file picked from a list now leaves the cursor at the end of the message.
Trusting a folder from the phone
27 September 2026feature
- Trust a new folder from the phone. The first time Claude Code runs in a folder, it asks whether you trust it, before the session shows up anywhere. A New session started from the phone now brings that question to the phone: Trust this folder opens the session; Cancel quits Claude Code and removes the tmux session made for it. Mac and Linux alike.
- A Mac asks about your folders at setup. On a Mac, a Claude Code the daemon starts uses Desktop, Documents and Downloads as portholed, and macOS asks before it may.
portholed setupnow has those questions come up while you are at the Mac, andportholed doctorsays which folders are allowed. After an upgrade, runportholed setupat the Mac again: to macOS each version is a new program.
A Mac or a Linux computer, from the first screen
27 September 2026featurefixes
- Set up a Mac or a Linux computer. What you'll need now asks which computer runs Claude Code, and Set up the computer shows that computer's steps only, with a switch between the two: the Tailscale app and Remote Login, Homebrew and
portholed setupon a Mac; Tailscale SSH, the installer and linger on Linux. Tailscale on the computer is part of the setup now, so it is not skipped when Tailscale is already on the phone. The docs, this site and the README split the same way. - Fix: the terminal crept upwards. With no one at the desk, the phone's tmux client lost a row to tmux's status bar, tmux shrank the window to it, and the daemon followed - a row every two seconds. With someone at the desk, tmux panned the window by a row instead. The phone's side has no status bar now; the desk keeps its own.
- The terminal's last row sits at the bottom, just above the keys: in fit mode the grid is drawn from the bottom of the view, and zoomed in it opens at the bottom and stays there until you drag up to read.
A new session from the phone
26 September 2026featurefixes
- New session. The + at the top of the session list lists every folder Claude Code has been used in on your computers, most recent first, with a field for any other folder. Pick one and Claude Code starts there in a tmux session of its own, named after the folder, and opens on the phone as soon as it is up. A second one in the same folder gets its own session. The same on a Mac and on Linux.
- Fix: the terminal on a Mac showed underscores in place of every character outside ASCII, which is all of Claude Code's frame. tmux decides what a client can show from the locale, and a launchd agent has none; the phone's terminal now always asks for UTF-8, and the agent gets the locale of the shell that installed it. Run
portholed service installonce on a Mac to pick up the second half.
Porthole on a Mac
26 September 2026feature
- The daemon runs on macOS. macOS 13 or later, Apple silicon or Intel, with the Tailscale app from the App Store or Tailscale's website. It runs as a launchd agent that starts when you log in and restarts if it fails, finds Tailscale however it was installed, and sees your sessions, tmux and dev servers the way it does on Linux.
- Homebrew.
brew install shrimpscript/tap/porthole, thenportholed setup, which starts the background service and adds the approval hook in one step. It works on Linux too. Upgrades keep the service pointing at the current version. - The failsafe on a Mac signs in with the phone's own key. The Tailscale app on a Mac has no SSH server, so the failsafe goes through Remote Login instead. In Settings > If Porthole cannot connect, Add this phone's key makes an Ed25519 key on the phone, kept encrypted under a key in Android's Keystore, and the daemon adds it to
~/.ssh/authorized_keys, usable only from the phone's tailnet addresses and with no forwarding. Remove this phone's key andportholed revoketake it out. The same works on Linux computers that use their own sshd. - Restart over SSH knows the computer. The failsafe's restart uses launchd on a Mac and systemd on Linux, from any login shell, and starts the daemon on its own if the service manager refuses.
- Screenshots and clips of a Mac's screen, with the system's own
screencapture. macOS asks once, at the Mac, to allow it. - A Mac stays awake while it is needed. While a session is working or a phone is connected, portholed keeps the Mac from sleeping, on the power adapter only, and lets it sleep again after.
portholed doctorchecks a Mac's own settings: whether it logs in by itself after a reboot, its sleep setting, Remote Login, and how many phone keys the failsafe has. Every check it runs now has a time limit.- New commands:
portholed setup,portholed service install|restart|status|uninstallandportholed version.
Updating a Linux computer: run the installer again, so the service may write ~/.ssh for the failsafe key, then restart it:
$ git pull
$ ./tools/install.sh
$ portholed service restart
The first public release
26 September 2026featurefixes
- The source is on GitHub. The repository is public at github.com/ShrimpScript/porthole. Each release there carries
porthole.apk, the daemon for Linux on amd64 and arm64, andSHA256SUMS. From 0.27.0 they carry the daemon for macOS as well. - Porthole updates from its GitHub releases. At most once a day, and when you tap Check now in Settings > Updates, the app asks GitHub for the latest release. A newer one shows a banner with Not now and Update. The APK downloads from GitHub over HTTPS, and Android installs it only if it is signed with the same key as the Porthole you have. A switch in Settings > Updates turns the check off; the privacy policy says exactly what the check sends.
- Builds from your projects keep their banner.
portholed publishon the computer still offers an Android build of a project you are working on to your phone, with Install, and lists it under Settings > Other apps on the computer. The command now needs the app name:portholed publish app-release.apk 1.4.0 shopping-list. Porthole's own builds on the computer are no longer offered; Porthole updates only from its releases, so every install runs the same signed APK. - The daemon without Go. On a computer without Go,
./tools/install.shdownloads the release'sportholedfor linux amd64 or arm64 and checks it against the release'sSHA256SUMSbefore installing it. A mismatch stops the install.--prebuiltasks for the release binary even where Go is installed. portholestarts Claude Code where the phone can reach it. Run it instead ofclaudein a project's folder: it starts Claude Code inside tmux, in a session named after the folder, or brings back the one already open there. Arguments go toclaude. The installer adds the name.- Fix: Allow and Deny from the phone now reach Claude Code. The approval hook answered in a shape current Claude Code does not accept, so it asked at the desk as if the phone had never replied.
- Fix: terminals stay on the right session and stay live. A terminal is now bound to the session it was opened for, reopens itself after the connection drops instead of freezing on its last frame, follows the window when it is resized at the desk, and draws the character runs and sequences tmux sends that it used to drop.
- The terminal scrolls back and goes full screen. Drag with one finger to walk the window's history (tmux's own scrollback); a chip brings you back to live. A full-screen button hides the header and the system bars.
- The failsafe is a plain shell that fits the phone. It is sized to the screen, has its own scrollback and full screen, and runs with
PORTHOLE_FAILSAFE=1set, so a shell profile that attaches to tmux on every SSH login can leave it alone. - Fix: Start and Resume from the phone work after the computer reboots, before anyone has opened tmux at the desk.
- Fix: a local slash command such as
/modelor/effort, or a!shell command, no longer leaves a session showing as working forever. - Fix: the working clock in the session list counts from the start of the turn again; it no longer restarts at every tool call.
- The composer makes room while you type. Typing folds the photo and slash buttons into one +, so the field is wider. Quick replies go away once something is typed, and the field grows to five lines, then scrolls.
- Licences. Settings > Licences lists the fonts and libraries in the app.
- A new site and docs. The app and the computer are drawn as they look, and the docs now cover getting started, updates, builds from your projects and every
portholedcommand.
Coming from 0.25.0: earlier versions do not check GitHub, so install this one from the release page. Releases after it arrive as the update banner. On the computer, in the folder you cloned, pull, run the installer again (with --prebuilt if Go is not installed) and restart the service:
$ git pull
$ ./tools/install.sh
$ systemctl --user restart portholed
Coming back to a session
21 September 2026feature
- Since you left. A session that ran on while you were away opens on the line where you stopped reading, with how many turns it got through and how long you were gone. Everything below the line is new.
- Mute one session. A loop that finishes a turn every four minutes can be silenced from its details sheet without being hidden: it still appears in the list and in Needs you. Settings says how many are muted and unmutes them all.
Being far from the computer
21 September 2026feature
- The failsafe SSH shell is now in Settings as well as on the failure card, so the login can be tried before anything breaks.
- Settings reports whether Android has the app in battery optimisation, which decides whether a connection survives in your pocket.
- A drop of more than two minutes ends with a notification when the computer answers again.
portholed doctorchecks node-key expiry for the computer and each paired phone, whether Tailscale SSH is on, whether the daemon survives a reboot with no one logged in, whether the machine has slept, and free disk.
Two crashes, one symptom
21 September 2026fixes
- The launch animation could throw when Android reclaimed the splash icon early, closing the app as it opened. It is decoration and can no longer close anything.
- One session resumed in two terminal panes was listed twice, which the list refuses. The daemon now returns one row per session, newest pane winning, and the app removes duplicates as well.
- Crash reporting: the app keeps its last crash, says so in a notification, and hands it to the computer on the next connection.
More than one computer
14 September 2026feature
- Pair a second computer from Settings. Sessions from both appear in one list, named by machine, with unreachable ones kept apart rather than hidden.
- Notifications, the widget and the approval card all work across machines.
Switches
14 September 2026feature
- Model, reasoning effort and permission mode from the session's details sheet, using the CLI's own commands, with the current values read from the transcript and the screen.
- The docs site and the privacy policy.
Checking a computer
14 September 2026feature
portholed doctor: tmux, Tailscale, Claude Code, the session registry, transcripts, git, screen capture, the service and published builds, each with what to do when it is not right.- A release script that builds, tests, signs and publishes both halves from one command.
What changed, and three-word replies
14 September 2026feature
- A Changes sheet per session: what git sees, file by file, as a real diff on the phone.
- Quick replies above the composer when a turn just finished, editable by long-press.
- Copy and share any tool output.
Questions by tap
14 September 2026feature
- When Claude Code asks a multiple-choice question, the choices appear as buttons exactly as they stand on the computer's screen; one tap presses the key. Single, multi-select and several questions in a row.
- A Needs you section at the top of the list for sessions waiting on an answer.
One feed per session
13 September 2026feature
- Each running Claude Code is matched to its own transcript through the CLI's session registry, so two sessions in the same directory - or the same session resumed elsewhere - never share a feed.