Figment.so
Mac hostingWebsite hostingGuidesHow to usePricing

Access Xcode GUI Over VNC on a Remote Mac

xcodebuild handles most CI work, but a few Xcode features have no command-line equivalent: Instruments' Time Profiler timeline, the Memory Graph Debugger, SwiftUI Previews, and the Devices & Simulators window all require the full IDE. When those are your bottleneck, a VNC session to a remote Mac closes the gap without putting Apple hardware on your desk. This guide walks through enabling macOS Screen Sharing from a shell, tuning VNC for Xcode work, and picking the right Figment plan for the job.

Which Figment Plan Fits Graphical Xcode Work

For graphical Xcode work on Apple silicon runtimes — Metal profiling, visionOS simulator, SwiftUI Previews that depend on arm64 frameworks — pick a Figment M-series Mac from $95/month. Physical M-series availability is confirmed in the quote; request a configuration on /mac-hosting/start. For Intel toolchains the virtual Intel macOS environment at $29/month (2 vCPU, 8 GiB RAM, 80 GiB disk) runs supported Intel Xcode releases and can cross-compile and sign arm64 targets; Apple says to use Xcode 26 or earlier on Intel processors. Xcode 27 and ARM-only execution require Apple silicon.

Access on the $29 virtual Intel macOS is through its browser console, which gives you a full desktop and terminal in the browser. VNC into that VM from a third-party client is not the intended flow; the Screen Sharing recipe below is aimed at physical i3 ($49, request-based) and M-series ($95+, request-based) Macs where Screen Sharing is exposed through the network.

Which Xcode Features Actually Need the GUI

Before you install a VNC client, check whether your work is genuinely graphical:

FeatureCLI equivalentNeeds GUI
Build & run unit testsxcodebuild testNo
Archive and exportxcodebuild archive + xcodebuild -exportArchiveNo
Code coverage reportxcrun llvm-cov / SlatherNo for reports; yes for interactive browser
Instruments: Time Profilerxctrace record (record only)Yes for the trace UI
Memory Graph DebuggerNoneYes
SwiftUI PreviewsNoneYes
Devices & Simulators windowxcrun simctlNo for management; yes for visual launch
Scheme editorNoneYes
TestFlight / App Store uploadxcrun altool, Transporter, Fastlane pilotNo
Notarizationxcrun notarytoolNo
Core Data model editorNoneYes

If your work is entirely in the "No" column, the browser console or SSH to a physical Mac is faster and cheaper than a VNC pipe.

Enabling Screen Sharing From a Shell

On a physical rented Mac, run the following with administrator privileges. kickstart lives inside ARDAgent.app and is Apple's long-standing command-line entry point for Remote Management; see the Apple Remote Desktop guide for the UI equivalent.

# Enable macOS Remote Management (which exposes Screen Sharing on TCP 5900)
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart \
  -activate \
  -configure \
  -access -on \
  -clientopts -setvnclegacy -vnclegacy yes \
  -clientopts -setvncpw -vncpw "CHANGEME1" \
  -restart -agent \
  -privs -all

The setvnclegacy yes option enables the legacy VNC authentication path used by third-party clients. That password field is capped at 8 characters by the protocol. Prefer ARD authentication (a local macOS user) and an SSH tunnel for anything beyond a quick session; see the security notes below.

Verify the service:

sudo launchctl list | grep -i screen
# Expected row: com.apple.screensharing

Disable when you are done:

sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart \
  -deactivate -configure -access -off

If kickstart returns an error on a newer macOS build, enable Screen Sharing once from System Settings → General → Sharing → Screen Sharing, then keep automating with launchctl.

Connecting From Windows With TigerVNC

TigerVNC is a maintained open-source VNC client; the current stable Windows installer is on the project's GitHub releases page (1.16.2, March 2025, as of this writing — check for a newer tag).

  1. Open TigerVNC Viewer.
  2. In the VNC server field, enter <remote-mac-ip>:5900. Figment lists the assigned IP for physical plans in the plan details shared after provisioning.
  3. Click Connect and enter the password you set with -setvncpw.
  4. Launch Xcode from the Dock or Spotlight on the remote desktop.

Before connecting, open Options → Compression:

  • Encoding: Tight
  • Color level: Medium (16-bit) — Xcode's chrome is mostly static, so the perceived quality cost is small
  • JPEG quality: start at 6; raise it if code text looks smeary

Connecting From Linux With Remmina or vncviewer

On Ubuntu or Debian:

sudo apt install remmina remmina-plugin-vnc
# or the TigerVNC client
sudo apt install tigervnc-viewer
vncviewer <remote-mac-ip>:5900

In Remmina, create a VNC connection, set the server address, and choose Image quality: Medium to start. Remmina's quality slider maps to bit depth; 16-bit is a reasonable starting point for Xcode over a 50 Mbit/s or better link.

Resolution and Color-Depth Worksheet

macOS Screen Sharing streams the Mac's actual framebuffer. Headless Macs often start at a low virtual resolution; raise it with displayplacer:

# Inspect current displays and modes
system_profiler SPDisplaysDataType

# Install and set a 1440x900 virtual mode (works on physical Macs with no attached display)
brew install jakehilborn/jakehilborn/displayplacer
displayplacer list
displayplacer "res:1440x900 hz:60 scaling:off origin:(0,0) degree:0"

Starting matrix for typical broadband VNC over the public internet (measure, do not assume):

DownlinkResolutionColor depthWhere it hurts
10–25 Mbit/s1280×80016-bitInstruments timeline redraw
25–100 Mbit/s1440×90016-bit or 24-bitStill readable during scroll
100+ Mbit/s1920×108024-bitLag concentrated in animated views

A Memory Graph session is dominated by click-through interactions and benefits more from bit depth than frame rate. Instruments trace views redraw continuously; cutting color depth usually helps more than cutting resolution.

Keeping the Session Usable and Safe

Reconnect behaviour. TigerVNC Viewer on Windows exposes Options → Connection → Reconnect on disconnect with a configurable retry interval; Remmina exposes the same under its connection profile. Neither replaces a real session guard — if the Mac reboots you will need to reauthenticate.

SSH tunnel, when available. Instead of exposing TCP 5900, forward through SSH on a physical Mac that has inbound SSH enabled in the quote:

# Local machine: tunnel local 5901 to the Mac's 5900 over SSH
ssh -L 5901:localhost:5900 user@<remote-mac-ip> -N

Then point the viewer at localhost:5901. The tunnel keeps VNC authentication off the open internet and gives you the account's full key-based access controls.

Rotate and shut off. Change the VNC password per session on shared hosts, and run the kickstart -deactivate command when you finish. Do not leave port 5900 reachable from the public internet; the legacy VNC password is 8 characters and brute-forceable.

Cost Context for a Graphical Workload

If your job is one Xcode scheme per day with occasional Instruments runs, the $29 virtual Intel macOS plus the browser console removes the GUI step entirely — no VNC client needed. If you need Metal/arm64 execution in Instruments, request an M-series plan on /mac-hosting/start; entry is $95/month, exact chip, RAM, disk and availability are confirmed in the quote. Compare against MacStadium's published Mac mini pricing and CloudMac's pricing before committing — CloudMac's homepage also lists a $999/year M4 offer that works out to about $83.25/month, which undercuts 12 × $95 at Figment's current entry rate; Figment's trade-off at the $249 Managed Build Mac tier is the included CI setup, backups, monitoring and 30 minutes of monthly support bundled with one M-series Mac.

Use the browser console for terminal work, and VNC when you specifically need the graphical IDE. Start a quote on /mac-hosting/start or see all plans at /mac-hosting.

Related guides:


Subscribe for Figma design and website publishing guides.


Figment.so

Contact

Twitter

Website pricing

Compute index

About

Privacy

Terms