Blog/Ports & VNC

Seeing what Claude Code and Codex actually build: Ports and VNC from your phone

2026-07-23

Running Claude Code or Codex from a phone stopped being the hard part a while ago — SSH in, keep the run in tmux, get a push when it finishes. What a terminal alone still doesn’t solve is checking the result. The agent reports the layout is fixed, the diff reads fine, the build is green. Whether the thing looks right is a different question, and on a laptop you’d answer it by glancing at the browser or the simulator. In a plain SSH client there is nothing to glance at — you take the model’s word for it.

ServerCC has two tools for looking, both riding the SSH connection you already have. Ports opens any HTTP service listening on the server in an in-app browser, through an SSH tunnel. VNC shows you the machine’s screen. Between them they cover most of what an agent produces.

Ports: the dev server, without deploying it

Ports lists every TCP port the server is listening on, with the owning process next to it — node on 5173, python on 8000. Tap one and ServerCC sets up an SSH local forward and opens the page in an in-app browser. The service never needs to be reachable from the internet: it can stay bound to the server’s localhost, with no firewall change, no reverse proxy, no throwaway ngrok URL. If your phone can SSH to the box, it can see the page.

The browser is built for layout checking rather than casual reading: a Page View switch flips between Mobile Site and Desktop Site, landscape unlocks even though the app itself is portrait-only, and reload pulls whatever the agent just changed. It also runs on its own SSH connection, so a heavy page load never stalls the terminal session next door. One constraint to know: the tunnel speaks plain http://, which is what dev servers serve anyway.

VNC: when the result isn’t a web page

Plenty of agent output has no URL: an iOS app in a simulator, a desktop app, a matplotlib window, a browser you want open with devtools. For those, ServerCC’s built-in VNC client connects to macOS Screen Sharing (ARD) or any standard VNC server — through the SSH tunnel, directly, or over Tailscale.

It’s a real remote desktop session, not a screenshot stream you squint at. Pinch to zoom into actual pixels, tap to click, and a keyboard accessory row fills in what a touch keyboard is missing — Esc, Tab, arrow keys, and sticky Ctrl / Shift / Alt / ⌘ for shortcuts. Two quality modes trade color depth against bandwidth, so it stays usable on cellular.

Example: iOS work, checked against the simulator

A Mac at home is building an iOS app; you are not at home. Claude Code has just reworked the settings screen, and its summary claims everything lines up. You ask it — right in the terminal — to rebuild, reinstall, and relaunch in the simulator, which on the Mac side comes down to:

xcodebuild -scheme MyApp \
  -destination 'platform=iOS Simulator,name=iPhone 16' build
xcrun simctl install booted path/to/MyApp.app
xcrun simctl launch booted com.example.myapp

Then open VNC. The Mac’s screen comes up with the simulator front and center. Zoom into the navigation bar and check the spacing at real pixel size; tap through the flow the way you would on a device; type into the search field and watch how the layout behaves with the keyboard up. When you find the row whose padding is off, go back to the terminal, tell Claude which one, watch the rebuild — then flip to VNC again. The terminal and the desktop live in the same app, so one round of this loop fits inside a supermarket checkout line.

Example: web work, without publishing anything

The other common case: Claude is building a web UI, and the dev server sits on :5173, bound to localhost on the dev box. Nothing is deployed; there is no staging URL to send yourself. Open Ports and the list already shows node · 5173. Tap it, and the site renders in the in-app browser through the tunnel.

Checking the mobile breakpoint here is honest by construction — you are looking at a real phone-width viewport with real touch targets, not a desktop window dragged narrow. Then switch Page View to Desktop Site and rotate to landscape for the wide layout. When the agent lands another change, hit reload. The site stays private the whole time: the only thing that ever touched the network is the SSH connection.

Which one, when

If it renders in a browser, use Ports — text is sharper, scrolling is native, and the mobile check is real. For everything else — a simulator, a native app, devtools, anything that only exists on a screen — use VNC. Details for both are in the docs: Ports and VNC Remote Desktop. And if you are setting up the whole workflow from scratch, start with Claude Code on iPhone.