Connect to Your Cloud Mac via VNC and SSH

Once your credentials email lands, you should be in your remote desktop within 5 minutes. This page covers graphical access, command-line access, latency data, and security hardening in one pass — just follow it in order.

Access Overview

Three Ways to Connect — Pick by Use Case

Every Mac mini ships with both VNC (5900) and SSH (22) enabled by default, with credentials sent in the same encrypted email. Tailscale is optional — install and manage it yourself.

VNC Graphical Desktop

See the full macOS desktop. Ideal for installing certificates, working in Xcode's GUI, or editing 4K video — anything that needs a mouse. Recommended bandwidth: 10Mbps+.

SSH Command Line

Your main channel for running build scripts, registering CI runners, and syncing files with rsync. Not latency-sensitive — works fine even on 2G — and our recommended default for daily use.

Tailscale Networking (Optional)

Pull your cloud Mac into your private network with a direct internal IP — no public ports exposed. You have full admin rights, and it's a one-line brew install.

MethodProtocol / PortGood forNot ideal forLatency sensitivity
VNCRFB / 5900Graphical work, installing certificates, simulator interaction, video editingLong-running automated tasksHigh — keep under 120ms
SSHSSH / 22Scripts, CI runners, file sync, long tmux sessionsOne-off setups that require the GUILow — usable even at 300ms
TailscaleWireGuard / UDPMulti-device access, tunnel base once public ports are closedMinimal setups that don't want extra softwareDepends on the underlying link
VNC Setup

Connecting via VNC: Two Routes, Three Minutes

Route A: macOS's Built-In Screen Sharing

If you're also on a Mac locally, there's nothing to install. In Finder, press ⌘K (Go → Connect to Server), enter the address from your credentials email in the format below, then type in your VNC password.

Route B: RealVNC Viewer (Windows / Linux)

When creating a new connection, enter nodeIP:5900, set Encryption to Prefer on, and start with Picture quality on Automatic — then fine-tune using the table below once connected. Set Scaling to 100% to avoid blurry text from double-scaling.

If you're prompted to confirm a fingerprint on first connect, check it against the host fingerprint at the bottom of your credentials email before accepting. Five wrong password attempts trigger a 60-second lockout — that's the default anti-brute-force policy, not a malfunction.

local — screen sharing
# Finder ⌘K, or open directly from Terminal
$ open vnc://203.0.113.10:5900
# Adjust resolution per session (run on the remote host)
$ displayplacer "id:main res:1920x1080 hz:60"
✓ connected: mini-tokyo-07 (M4, 24GB)

Choosing a Quality Preset

VNC responsiveness comes down to three variables: resolution × color depth × compression quality. Rule of thumb — lower resolution first, then color depth, and only touch compression quality last. Compression artifacts hurt code readability more than lower resolution does.

PresetResolutionColor depthJPEG qualityEst. bandwidthBest network
Smoothness first1280×72016-bit4/93–5 Mbps4G hotspot, transoceanic links
Balanced (default)1920×108016-bit6/98–12 MbpsHome broadband, nearby node
Quality first2560×144024-bit9/920–35 MbpsGigabit wired + latency under 60ms

Dropping color depth from 24-bit to 16-bit saves roughly 40% bandwidth with almost no visible difference for coding — switch back to 24-bit when color grading.

SSH Practice

SSH in Practice: Keys, File Transfer, Long-Running Jobs

If you uploaded an SSH public key at checkout, your machine ships ready for key-only access. If not, no problem — log in with the initial password from your email first, then disable password login using the first terminal block below.

key-only login
# Local: push your public key up (password auth for this one time)
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@203.0.113.10
# Remote: disable password login
$ sudo sed -i '' 's/^#\{0,1\}PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
$ sudo launchctl kickstart -k system/com.openssh.sshd
✓ Key-based authentication only from now on
rsync / sshfs file transfer
# Incrementally upload a project directory (resumable)
$ rsync -avzP --exclude .git ./MyApp admin@203.0.113.10:~/work/
# Mount the remote directory locally (requires macFUSE)
$ sshfs admin@203.0.113.10:/Users/admin/work ~/remote-work
# Unmount when done
$ umount ~/remote-work
tmux for long-running jobs
# Start a session to run a full archive build
$ tmux new -s build
$ xcodebuild archive -scheme MyApp -destination 'generic/platform=iOS'
# Press Ctrl-b d to detach — it keeps running even if you disconnect
# Reattach later
$ tmux attach -t build

Three Engineering Habits

  • Always run long tasks inside tmux. An SSH disconnect doesn't kill the job as long as it's running inside tmux — anything running bare in the foreground dies with the session.
  • Move large files with rsync, not VNC clipboard drag-and-drop. rsync checksums and resumes; drag-and-drop does neither — especially painful with 50GB of assets.
  • Give your node an alias in ~/.ssh/config locally and add ServerAliveInterval 30 — then ssh tokyo gets you there instantly, and it also fixes NAT-timeout disconnects.
Latency Data

Real-World Node Latency Benchmarks

Check this table before picking a node: figures are median ICMP ping in milliseconds — lower means more responsive. Rule of thumb: under 60ms feels nearly local for dragging windows, 60–120ms is fine for daily development, and above 150ms you should stick to SSH-only or headless mode.

Origin city→ Tokyo node→ Seoul node→ Silicon Valley nodeRecommendation
Beijing5246152Seoul first, Tokyo as backup
Shanghai3842148Tokyo first
Shenzhen4844158Either Seoul or Tokyo works
Tokyo234108Local, direct
Seoul332132Local, direct
Singapore6874168Tokyo slightly better; use Balanced preset for VNC
Los Angeles1021286Silicon Valley first
Test window Jul 24 – Jul 30, 2026, 4 time slots per day Sample size mtr -c 500 per city-to-node pair, median value used Carrier basis domestic (China) figures are a blended average across China Telecom 163 and China Mobile CMI backbone routes; overseas figures use local backbone ISPs

Want to test it yourself? Test IPs for each node and mtr usage are in the network self-check section of the Troubleshooting page, along with a template for filing a ticket with your traceroute.

Low Latency

Four Tips for Lower Latency

1. Pick your node by the benchmark table

Physical distance has no software fix. The gap between 40ms and 150ms in the table above can't be recovered with any compression setting. Users in Asia typically default to Singapore, Hong Kong, Tokyo, or Seoul; users in the Americas default to Silicon Valley.

2. Trade compression level for smoothness

On a mediocre connection, switch VNC to "Smoothness first": 16-bit color depth plus mid-range JPEG quality usually pulls frame rate from 12fps back up above 25fps, so scrolling code no longer smears.

3. Prefer wired, use 5GHz on Wi-Fi

2.4GHz Wi-Fi commonly jitters ±30ms; a wired connection can get you down to ±3ms. VNC is more sensitive to jitter than to raw latency — a 50ms average with high jitter feels worse than a steady 80ms.

4. Graphics on VNC, heavy lifting on SSH

Run compiling, packaging, and file transfers in the background over SSH, and reserve VNC for whatever truly needs a mouse click. If the screen isn't refreshing, bandwidth naturally goes to your data transfer instead.

Hardening

Security Hardening Checklist

This machine is your dedicated physical node, and hardening it is on you. Work through these five steps in order and your public attack surface is basically closed off.

  • Change the default SSH port. Change Port 22 in /etc/ssh/sshd_config to a high port (e.g., 2222) and automated scanner traffic drops by roughly 90%.
  • Disable password login, keys only. The two commands from the previous section make this permanent — the initial password is single-use.
  • Install fail2ban against brute-force attempts. brew install fail2ban, then enable the sshd jail — 5 failed attempts triggers a 10-minute ban by default, with zero impact on CI.
  • Don't expose VNC to the public internet — tunnel it over SSH. Once the tunnel from the command on the right is up, close port 5900 to the public internet in your console's firewall.
  • Keep certificates and keys in a separate keychain. Create and unlock a dedicated keychain for CI signing — don't mix it into your login keychain.
VNC over SSH tunnel
# Build a local tunnel: remote 5900 maps to local 5901
$ ssh -N -L 5901:localhost:5900 admin@203.0.113.10
# In another window, just connect to the local port
$ open vnc://localhost:5901
✓ All VNC traffic is now encrypted over SSH
Headless CI

Headless CI Mode: A Minimal Setup Without VNC

If this machine is purely a self-hosted runner, we recommend never opening a graphical session at all: less attack surface, less memory overhead, zero VNC bandwidth.

  • Turn off screen sharing entirely, keeping only SSH on its changed, key-only port — your public attack surface narrows to a single port.
  • Keep the runner alive with launchd: the GitHub Actions runner's built-in svc.sh generates a LaunchDaemon that starts on boot, restarts on crash, and reconnects automatically after a disconnect.
  • Unlock your keychain in the script ahead of time: run security unlock-keychain before the build so signing no longer depends on a GUI session popup.
  • A free reimage every cycle is your safety net: if the environment gets thoroughly messy, reimaging is faster than fixing it — persist your DerivedData cache per the CI Integration Guide.
headless runner minimal setup
# Disable screen sharing (can be re-enabled anytime)
$ sudo launchctl disable system/com.apple.screensharing
# Register and keep the GitHub Actions runner running
$ ./config.sh --url https://github.com/org/repo --token XXXX
$ sudo ./svc.sh install && sudo ./svc.sh start
# Unlock the signing keychain before building
$ security unlock-keychain -p "$KC_PASS" ci.keychain-db
✓ runner online, no GUI session
Troubleshooting

Connection Troubleshooting Quick Reference

Match your symptom below and try the one-line fix first. If it's still broken, file a ticket with what you observed and what you've tried — first response within 2 hours.

SymptomMost likely causeOne-line fix
VNC shows a black screenScreen sharing service crashedsudo launchctl kickstart -k system/com.apple.screensharing
VNC is choppy / dropping framesQuality preset exceeds your connection's capacitySwitch color depth to 16-bit, drop JPEG quality to 4/9, lower resolution to 1280×720
SSH connection times outStill connecting to port 22 after changing it, or blocked by a local firewallssh -p 2222 admin@203.0.113.10 -v to see where the handshake stalls
SSH rejects your keyLocal private key permissions too openchmod 600 ~/.ssh/id_ed25519
SSH keeps disconnectingNAT idle timeout killing the long-lived connectionprintf "ServerAliveInterval 30\n" >> ~/.ssh/config
Clipboard stops syncingRemote clipboard service hungRun killall pboard over SSH — the service restarts automatically
Tunnel can't reach 5901Tunnel process has exitedRerun ssh -N -L 5901:localhost:5900 admin@203.0.113.10

The full step-by-step walkthrough (including Xcode signing failures and keychain unlocking) is in the Troubleshooting Handbook

Credentials land in your inbox in 10 minutes — connect tonight

VNC/SSH credentials ship within 10 minutes of payment. Billed by the day, with refunds for unused days within 7 days.