From your first login to your first build

Connect. Migrate. Build.

This guide covers your first connection, environment migration, CI setup, and handover. Start with an SSH command to confirm the machine is reachable, then move your code, signing assets, and toolchain. You get a dedicated physical machine—not a virtual machine—with full access to the macOS desktop and command line.

Already placed an order? Check the instance status and connection details in your console. Never paste passwords, private keys, or signing certificates into public logs.

Step 1 · Verify your connection

Connect first. Migrate next.

Open the instance details in your console and check the node address, username, port, and initial password. Replace the address in the commands below with the actual value. If your instance uses a different port, use the one shown in its details.

SSH

Command line: make an interactive login

On your first connection, check the host fingerprint and accept it only after confirming it matches trusted instance details. Don’t disable host key checking just to skip the prompt.

ssh admin@<node address>

If your instance uses a non-default SSH port, add -p <port> to the command. After logging in, run these checks to confirm the current user, macOS version, and available disk space.

whoami
sw_vers
df -h
passwd

passwd interactively changes the current user’s password. Next, generate a dedicated ed25519 key on your local machine and append its public key to the node’s ~/.ssh/authorized_keys. Keep the private key on your own device or in a controlled key store.

ssh-keygen -t ed25519
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Run the permission commands on the node. Test key-based login in a second terminal before adjusting password authentication to match your team’s security policy. Make sure you don’t lock yourself out.

Check: log in with your key from a new terminal
VNC

Desktop: complete interactive setup

Use the Screen Sharing details in your instance information when you need to manage Keychain, check Xcode settings, or use the Simulator. The connection address and port may differ from SSH, so don’t assume they’re the same.

  1. Confirm the instance is ready, then get the Screen Sharing address, port, and user details from the console.
  2. Connect using the Screen Sharing app on your local Mac and sign in with the supplied account credentials.
  3. After reaching the desktop for the first time, change the initial password and check that the login keychain unlocks correctly.
  4. Open the Xcode version you need, accept the licence, install any required components, then verify the setup from the command line.
xcode-select -p
xcodebuild -version

If you connect to Screen Sharing through an SSH tunnel, use the forwarding and destination ports configured for your instance. Restrict access to trusted sources; don’t expose the desktop port to everyone.

A black screen doesn’t necessarily mean the node is offline. First check reachability over SSH, then check the graphical session, account permissions, and connection port. Don’t keep resetting the system to troubleshoot.

Check: desktop is visible and the Xcode version is correct
Step 2 · Migrate in dependency order

Local Mac → cloud Mac.

Move your data first, then your toolchain, then CI. Start with a project you can verify on its own rather than copying your entire home directory. The time estimates below are for the setup steps; repository size, network conditions, and dependency downloads affect the actual time.

01 / Data

Start with code and signing assets

Clone your repository from Git and check out the same commit as your local copy. For private repositories, use a restricted deployment key or a short-lived token. Don’t put long-lived credentials in the repository URL.

git clone <repository URL>
git rev-parse HEAD
rsync -av --progress ./Assets/ \
  admin@<node address>:~/work/Assets/

For code signing, export a .p12 file containing the private key from your local keychain. Encrypt it with a separate password when transferring it, then import it into the node’s keychain. Migrate provisioning profiles separately and check the certificate expiry, team, and target configuration.

Use rsync for incremental transfers of large assets. Don’t use a delete option on the first run. Check the destination directory first to avoid removing artifacts newly created on the node.

Allow 3–10 min · excludes large file transfers
02 / Toolchain

Restore versions, not caches

Export a Brewfile locally and transfer it to the node to restore your setup. Review the list first and remove unnecessary desktop apps and outdated dependencies to reduce the initial download.

brew bundle dump --file=Brewfile
brew bundle --file=Brewfile
xcodes list
xcodes install <required version>

Check which versions of Xcode, Ruby, and CocoaPods the project requires. When using xcodes to install a version, follow the applicable software licence and download requirements. After installation, run xcodebuild -version to verify the version actually in use.

For projects with a Gemfile, start with bundle exec pod install. For SPM, resolve dependencies using the lock file included with the project. Treat the first build as a cache warm-up, not as a measure of subsequent build times.

Allow 5–15 min · downloads not included
03 / CI setup

Build manually before registering a runner

First complete a build and signing step in an interactive session. Once the command line can create an archive, register a GitHub Actions self-hosted runner or GitLab Runner. This avoids troubleshooting the toolchain and job scheduling at the same time.

bundle exec fastlane match development --readonly
bundle exec fastlane gym

Use the signing type and specific lane configured for your project. Give CI restricted credentials and store keys in protected variables or a key store. Never put passwords in scripts.

Assign a dedicated label to a temporary runner and initially allow only trusted branches to use it. Confirm that the runner’s account can access the signing keychain and working directory, and that a non-interactive build won’t wait for a dialog.

Allow 3–8 min · assumes an existing pipeline

Migration is complete when: the same commit, Xcode version, and dependency lock files produce an archive on the node that you can retrieve. A successful dependency install alone doesn’t mean the environment is ready.

Provisioning · about 4 min

Stuck? Check the step you’re on.

It usually takes about 4 minutes from placing an order to having a node ready. This excludes transferring your code, downloading tools, and your first build. Check the console for the latest payment, allocation, and provisioning status.

  1. 01

    Review your order

    About 40 sec

    Choose a machine, rental period, and node, then check any add-ons and the total. If you get stuck, check required fields and on-page error messages. Don’t create the same order twice.

  2. 02

    Pay in USD

    About 60 sec

    We accept USDT-TRC20 and Visa / Mastercard / Amex via Stripe only. Charges are settled in USD. If payment is stuck, check the billing status; blockchain confirmation or card issuer verification may take additional time.

  3. 03

    Wait for node setup

    About 2 min

    Once payment is confirmed, we begin provisioning your dedicated physical node. If setup appears stuck, check the instance status and system messages. If your payment is complete but the status hasn’t changed for a long time, keep your order number and submit a support ticket.

  4. 04

    Check your delivery details

    Credentials email / console

    Check your inbox and spam folder, then compare the connection details with those in the console. Don’t reply to unfamiliar emails with your password. If you haven’t received a notification, first check whether the instance is ready.

  5. 05

    Verify your first login

    About 20 sec

    Connect over SSH first, then verify the desktop. If you get stuck, note the full error, time, and time zone, then use the troubleshooting checklist below to distinguish network, authentication, and session issues.

Before returning · save your data

The machine goes back.
Your work comes with you.

Your rental won’t renew automatically. To keep using the machine, renew it manually in the console before it expires and confirm the change. Don’t assume a running build will extend your rental period.

After return, the entire disk is securely erased. The node isn’t long-term backup storage. Copy your latest archives, debug symbols, and any necessary logs to storage you control, then verify that the files are readable. Deleting local files doesn’t revoke remote access.

Complete these 4 handover checks

  1. Export your build artifacts. Retrieve your .xcarchive, .ipa, dSYM, and any necessary build logs. Confirm the upload or download is complete.
  2. Remove temporary runners. Unregister the runner from your CI platform, stop the local runner process, and revoke deployment keys and temporary access tokens.
  3. Remove signing materials. Delete imported certificate private keys, provisioning profiles, and temporary configuration. Check pipeline logs for exposed keys or passwords.
  4. Check expiry and backups. Confirm the expiry time and time zone shown in the console, and leave enough time for your final build and artifact transfer.

For team projects, assign one person to complete the final handover check. Don’t rely on “I thought someone else downloaded it” as your only backup plan.

Common workflows · minimal working setups

Get one build working, then scale up to CI.

Both machine tiers use M4 dedicated physical machines: SDK Pack 16 comes with 16GB / 256GB, and SDK Pack 24 comes with 24GB / 512GB. Choose memory and storage based on your project’s needs. Don’t overload your first verification run with concurrent jobs.

Automated app builds

First check that the scheme is shared, signing is configured correctly, and the keychain is accessible. If the project has a Gemfile, use Bundler to pin the Fastlane version, then create an archive.

bundle install
bundle exec fastlane gym
bundle exec fastlane pilot upload \
  --ipa ./build/App.ipa

Replace the example path with the actual artifact path. Before using pilot to upload, configure the release API key required by your project and store it in a protected CI variable. Upload permissions and build success are separate checks.

Check: archive is retrievable and upload completes

Remote Mac development

Verify a standard SSH connection first, then configure VS Code Remote-SSH to use the same connection details. If the editor can’t connect, check the remote extension logs before changing system permissions.

Host sdk-build
  HostName <node address>
  User admin
  IdentityFile ~/.ssh/id_ed25519
  ServerAliveInterval 30

Save this in your local ~/.ssh/config. After connecting, check which machine your terminal is on and confirm the working directory. Use Screen Sharing for the Simulator and graphical debugging; SSH is enough for editing code and using Git.

Check: editing and building use the same workspace

GPU rendering and MLX inference

First confirm that your workload supports Apple Silicon and the required graphics backend, then set up an isolated Python environment. Leave room for model weights, application memory, and intermediate results.

python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install mlx
python -c "import mlx.core as mx; print(mx.default_device())"

Start with a small input to verify dependencies and device selection, then gradually increase resolution, batch size, or context length. Record the application version and parameters. Whether a specific model will run depends on its weight size and actual memory use.

Check: small task completes and resource use is manageable
Troubleshooting · change one thing at a time

Pinpoint the type of problem first.

Save the original error before making changes. The four issues below cover networking, desktop sessions, signing permissions, and storage. Reinstalling the environment usually isn’t the first step.

SSH timeout or authentication failure

Timeout: Check the address, port, instance status, and local network restrictions. Use ssh -v to see whether the connection is stalling before or during authentication.

Authentication failure: Check the username, key path, and authorized_keys permissions. If the fingerprint has changed, first confirm whether the node has been reprovisioned. Don’t immediately delete the known host entry.

Ticket details: full error, port, and time

Black screen in Screen Sharing

First check that the node is reachable over SSH, then verify the Screen Sharing port and login account. Check whether setup is still in progress or your local client has saved an old connection.

Quit the client and reconnect. If you’re using a tunnel, confirm that the forwarding process is still running. Don’t repeatedly restart the machine before exporting your artifacts.

Ticket details: client version and redacted screenshot

Keychain prompt blocking CI

Use a desktop session to confirm the signing private key has been imported and the certificate is valid. Check that the runner is using the same account that was used to configure signing.

Use a dedicated signing keychain for CI and configure unlock and access permissions according to your team’s policy. Test a non-interactive build first. Never print the keychain password to logs.

Ticket details: failed stage and signing error code

Low disk space

Run df -h first, then check DerivedData, archives, Simulator data, and container images. Only clear caches you know you can rebuild. Keep archives and debug symbols you haven’t exported yet.

If your project and assets consistently exceed your storage budget, choose the +1TB SSD or +2TB SSD add-on when placing an order. Confirm the options for an existing instance through a support ticket. Don’t assume an add-on expands storage immediately.

Ticket details: available space and largest directories
Further reading · start with your question

For the deeper dive, see our technical articles.

This page covers the complete workflow, from connecting to returning your machine. For in-depth guidance on container tools, dependency migration, secure connections, and choosing a rental, browse the technical articles directory and refer to the articles currently published there.

Start by identifying the problem

Toolchain: Installing isn’t the same as being able to build. Record your Xcode version, dependency manager, and lock files, then compare versions between your local machine and the node.

Security: Connecting doesn’t mean access is configured correctly. Use dedicated keys and restricted tokens for temporary nodes, remove runner registrations when returning the machine, and don’t reuse long-lived personal credentials.

Choosing a machine: One successful run doesn’t guarantee a good fit over time. Check peak memory use, disk growth, and concurrent jobs before choosing a machine and rental period.

Need an engineer to take a look?

Keep the details.
We’ll start with the error.

For an active rental, sign in to the console and submit a support ticket with your order number, node, time and time zone, reproduction steps, and redacted logs. For presales questions or login issues, email us at support@macsdk.com.

Response times are based on the ticket’s recorded status and reply progress. An automated acknowledgement isn’t a reply from our team. If the issue is affecting a build in progress, mention the impact in the subject and preserve the error details. Don’t include private keys, passwords, or complete signing files.