
Use VNC for anything that needs the macOS display — Xcode's organiser, Simulator, Sketch, System Settings. Use SSH for command-line builds, file transfers, and CI agent registration. For a persistent developer workstation, run SSH as the transport and tunnel VNC through it. The two protocols serve different layers of the same job.
VNC is the Remote Framebuffer protocol standardised in RFC 6143. It streams the host Mac's screen as a framebuffer and relays keyboard and mouse events back. You see the full macOS desktop — Finder, Dock, every GUI app — as the host renders it.
Capabilities that only work over VNC:
defaults write alone.VNC listens on TCP 5900 by default, with additional displays on 5901, 5902, and so on. Its built-in authentication is a DES challenge-response with the password truncated to 8 characters. RFC 6143 states this method "is known to be cryptographically weak and is not intended for use on untrusted networks" and recommends running the session over IPsec or SSH. Never expose 5900 directly to the internet.
SSH (see OpenBSD ssh(1)) opens an encrypted channel to a remote shell. Anything a terminal can do, SSH can do remotely with almost no overhead.
Capabilities that SSH does far better than VNC:
xcodebuild, fastlane, brew, and package installs run at line speed. A VNC session would add display rendering latency to every line of output.scp, rsync -az, and SFTP all layer over SSH. Push a 2 GB asset or sync a font library with one command; VNC clipboard paste is not designed for binary payloads.-L flag tunnels a local port to any port on the host through the encrypted channel, including VNC's 5900.| Metric | SSH (CLI only) | VNC (full desktop, ZRLE/TRLE) |
|---|---|---|
| Idle bandwidth | under 1 KB/s | 10–50 KB/s keep-alive |
| Active 1920×1080 UI work | n/a | 1–8 Mbps typical |
| Active 4K with video playback | n/a | 20–60 Mbps |
| Command output latency over 50 ms RTT | roughly 50–80 ms | 80–200 ms |
| Minimum useful uplink | 1 Mbps | 5 Mbps recommended |
The numbers above are rough planning figures, not benchmarks. VNC uses demand-driven updates: the client requests a framebuffer update and the host returns only the changed rectangles. ZRLE and TRLE encodings compress those further. Even so, a 4K display during active design work is expensive — switch the client to 256-colour or grayscale mode on a slow link and close video-playing tabs on the host. SSH's overhead for text-only workloads is negligible; your network RTT dominates.
The safe production pattern is SSH for transport, VNC for display. Open the tunnel first, then point your VNC client at localhost:
# Replace USER, HOST with your rental credentials
# -N: do not execute a remote shell
# -L: forward local port 5901 to the host's port 5900
ssh -N -L 5901:localhost:5900 USER@HOST
Leave that terminal running and connect your VNC client to localhost:5901. All VNC traffic travels inside the encrypted SSH channel, and 5900 on the host does not need to be reachable from the internet.
Add -f to send the tunnel to the background:
ssh -f -N -L 5901:localhost:5900 USER@HOST
To close the background tunnel: kill $(lsof -ti tcp:5901).
For convenience, add a Host block to ~/.ssh/config:
Host mymac
HostName HOST
User USER
LocalForward 5901 localhost:5900
ServerAliveInterval 60
Then ssh -N mymac opens the tunnel in one command. Flag behaviour is documented in the OpenBSD ssh(1) manual.
| Workflow | Protocol | One command to get started |
|---|---|---|
| Run Xcode GUI, Instruments, or Simulator | VNC inside an SSH tunnel | ssh -N -L 5901:localhost:5900 USER@HOST, then connect VNC to localhost:5901 |
CLI builds: xcodebuild, fastlane, brew | SSH | ssh USER@HOST |
| Upload or download large files, sync fonts | SSH via SFTP or rsync | rsync -az ./fonts/ USER@HOST:~/Library/Fonts/ |
| Admin tasks: install pkg, change settings | SSH plus sudo | ssh USER@HOST then sudo installer -pkg ./Thing.pkg -target / |
| Register a CI runner (GitHub Actions, Buildkite) | SSH to start the agent | ssh USER@HOST './actions-runner/run.sh' |
| Screen recording or live client demo | VNC (tunnel still recommended) | Connect VNC; record with QuickTime on the host |
| Persistent developer workstation | SSH tunnel plus VNC | Open tunnel with -f -N; connect VNC client to localhost:5901 |
macOS client (built-in):
ssh -N -L 5901:localhost:5900 USER@HOSTvnc://localhost:5901Windows client:
ssh -N -L 5901:localhost:5900 USER@HOSTlocalhost:5901.Linux client:
ssh -f -N -L 5901:localhost:5900 USER@HOSTvncviewer localhost:5901, or use Remmina with the address vnc://localhost:5901.Access path matters more than protocol preference when you choose a plan at Figment Mac hosting:
Start a request at /mac-hosting/start and mention which protocols you need enabled; we will match the host and OS image to your workflow before billing starts.
Related guides: