Blog/Ports & VNC

Check what Claude Code and Codex built from your phone: Ports and VNC

2026-07-23

In a terminal you see what the agent reports: the layout is fixed, the diff reads fine, the build passed. You don’t see the page or the app itself. On a laptop you would check the browser or the simulator; this post covers doing the same from a phone. It assumes the agent already runs in tmux and you get a notification when it finishes.

ServerCC has two tools for this, and both use the SSH connection you already have. Ports opens an HTTP service listening on the server in an in-app browser, through an SSH tunnel. VNC shows the machine’s screen.

Ports: open a 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 can stay bound to the server’s localhost. No firewall change, reverse proxy, or ngrok URL is needed; the phone only needs SSH access to the machine.

The browser is set up for checking layouts. A Page View switch flips between Mobile Site and Desktop Site, landscape is available even though the rest of the app is portrait-only, and reload shows whatever the agent just changed. It runs on its own SSH connection, so a heavy page load doesn’t stall the terminal session. The tunnel only speaks plain http://, which is what dev servers use.

VNC: for results that aren’t web pages

Some agent output has no URL: an iOS app in a simulator, a desktop app, a matplotlib window, a browser with devtools open. 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.

Pinch to zoom down to actual pixels, and tap to click. A row above the keyboard adds the keys a touch keyboard lacks: Esc, Tab, arrow keys, and sticky Ctrl / Shift / Alt / ⌘ for shortcuts. Two quality modes trade color depth for bandwidth, so it stays usable on cellular.

Example: check an iOS change in the simulator

A Mac at home is building an iOS app, and you are out. Claude Code has just reworked the settings screen and says everything lines up. In the terminal, you ask it to rebuild, reinstall, and relaunch in the simulator. On the Mac that 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 in the middle. Zoom into the navigation bar and check the spacing at pixel level. Tap through the flow as you would on a device. Type into the search field and see how the layout behaves with the keyboard up. If a row’s padding is off, switch to the terminal, tell Claude which row, wait for the rebuild, and switch back to VNC. The terminal and VNC are two screens in the same app.

Example: check a local web UI without deploying

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

The page renders at an actual phone width with touch input, so you can check the mobile breakpoint directly. Then switch Page View to Desktop Site and rotate to landscape to see the wide layout. After the agent’s next change, tap reload. The site is never exposed: all traffic goes through the SSH connection.

Which one to use

If it renders in a browser, use Ports: text is sharper and scrolling is native. For a simulator, a native app, devtools, or anything else that only exists on screen, use VNC. Details are in the Ports and VNC Remote Desktop docs. To set up the whole workflow, start with Claude Code on iPhone.