From local builds to cloud delivery

Queue overnight builds.
Let your work Mac clock off on time.

Build an iOS build farm with multiple dedicated physical Macs. Route different schemes to macOS runners for archiving, signing, and TestFlight uploads—without piling every job onto the same work computer.

ArmRDP Cloud Mac gives you a whole Mac mini, not a virtual machine. Choose from three configurations across 5 locations, starting at $21.1/day. Migrate one pipeline first, then scale based on your actual queue.

Overnight builds require your runner, signing, and upload setup to be in place first. Delivery time depends on your project, dependencies, and job queue.

Overnight delivery · Example job routing

One release pipeline, three build lanes.

Isolate jobs by scheme and collect artifacts by node.

  1. A
    Main app · Releaserunner-app → archive → codesign
    .ipa
  2. B
    Extensions & companion targetsrunner-extension → build → test
    .xcresult
  3. C
    Release candidate checksrunner-check → simulator → report
    Test report
Start with
One runner
Scale by
Adding runners
Illustrative workflow, not live data. Set job dependencies in the order your project requires. Upload to TestFlight after checks pass.
CI/CD teams

A pinned toolchain beats chasing environment issues.

Register a cloud Mac as a macOS self-hosted runner for GitLab or GitHub Actions. Keep managing your repository as usual, and route only macOS jobs to this physical node.

Make one build reproducible first

Record the full Xcode version, SDK, command-line tools path, and dependency lockfiles. Use xcodes to manage multiple Xcode versions, then set DEVELOPER_DIR for each job so projects don’t compete for one global selection.

Runner labels should identify the OS, toolchain, and purpose—for example, macos, xcode-pinned, and ios-release. Route release jobs only to trusted runners; don’t send unreviewed branches to an environment holding signing assets.

Start with one heavyweight build per machine. Check clean builds, cache hits, memory pressure, and disk growth before increasing concurrency or adding nodes. Machine count isn’t the only factor: caching and job design also affect queue times.

Check the environment, then archive
xcodebuild -version
xcode-select -p
xcrun --sdk iphoneos --show-sdk-version

xcodebuild \
  -workspace App.xcworkspace \
  -scheme App \
  -configuration Release \
  -archivePath artifacts/App.xcarchive \
  archive

Replace the App workspace and scheme with your project’s actual names. Store archives, build logs, and test results separately for each job; don’t let two jobs write to the same output directory.

App releases

Keep archiving, signing, and uploads in one traceable pipeline.

For App Store releases, link each build artifact to its commit, toolchain, and signing configuration. The cloud Mac provides the execution environment; your team remains in control of release access and review materials.

Archive & export

Keep the .xcarchive, export configuration, and dSYM files. Check the Release configuration, version number, and build number before exporting. Don’t keep only the final .ipa and discard the symbol files you’ll need to investigate crashes.

Check: Every artifact maps to a unique commit and build number.

Signing & credentials

Import distribution certificates and provisioning profiles through a controlled process, and use a dedicated Keychain for build jobs. If you use fastlane match, restrict repository access and store decryption materials in CI secrets—not in scripts.

Check: Non-interactive jobs can complete codesign.

Uploads & review assets

Submit artifacts with upload credentials authorized by your team. Use the graphical interface to check simulator screenshots and prepare review assets, then verify the target devices, language, and version. Uploading and passing review are separate steps.

Check: Archive upload results, assets, and logs together.

Restrict release jobs by branch and user. Expired certificates, mismatched provisioning profiles, and insufficient upload permissions need to be handled based on their respective logs; adding machine capacity won’t fix them.

macOS app development

Run jobs from the command line. Inspect details in the GUI.

Dedicated physical nodes run macOS natively, with Metal and simulators available for compatible development tasks. Use SSH for scripts and logs, and VNC screen sharing for Xcode, simulators, and UI checks. Each access method has its strengths.

Good candidates for remote runs

Builds with pinned versions, automated tests, simulator screenshots, and dependency installs can all run without tying up a local work computer. For interactive debugging, reproduce the issue in the GUI first, then script any steps you can repeat.

Check that the target OS, simulator runtime, and Xcode versions are compatible.

What to validate first

Remote display responsiveness depends on the network path, resolution, and encoding settings, so it won’t feel identical to a local monitor. For work involving external devices, specialized peripherals, or frequent interaction, run your actual workload on a daily plan before deciding to migrate.

AI experiments

Use 64GB of unified memory to test models in your workflow.

ArmRDP M4 Pro comes with an M4 Pro chip, 64GB of unified memory, and a 2TB SSD. Use a dedicated environment to load local models, compare quantized versions, and test inference APIs before deciding whether to invest further.

Test capacity before speed

Model file size isn’t the same as runtime memory use. Account for KV cache, context length, the inference framework, and other processes in addition to model weights. Start with a short context for your target model, record peak memory use and memory pressure, then increase request volume gradually.

Choose an inference framework that supports Apple silicon, and check compatibility with your specific operators and model format. Unified memory doesn’t guarantee that every model will run, and it doesn’t tell you how fast generation will be. Test with your own prompts, context, and output lengths.

Log at least four things for each experiment

  • Model name, version, and quantization format.
  • Context length, batch size, and peak memory use.
  • Initial load time and response time during steady-state operation.
  • Request samples, output quality, and failure logs.

Schedule inference experiments separately from production release builds where possible, so memory contention doesn’t skew results. Protect remote APIs with authentication and access controls; don’t expose listening ports publicly.

Migrate one pipeline first

Move the data, match the environment, then switch the runner.

Don’t migrate your entire release system in one go. Choose a scheme with clear dependencies that already builds reliably on your local machine. Use the local build as your baseline and work through these three checks.

  1. 01 · Data

    Move the repository and signing assets

    Clone the repository with read-only or least-privilege credentials, and check submodules, private dependencies, and large files. Manage certificates, provisioning profiles, and decryption keys separately; don’t commit sensitive files to the repository.

    • Confirm the pinned commit checks out completely.
    • Confirm build jobs can access required secrets under controlled permissions.
    • Store artifacts and backups outside the node.

    Ready when: The same commit and all its dependencies are available.

  2. 02 · Toolchain

    Document everything behind “works on my machine”

    Install and pin the project’s required Xcode version with xcodes. Save your Homebrew dependency list and package manager lockfiles, install the required simulator runtime, and record environment variables and executable paths.

    • Compare Xcode and SDK versions.
    • Run a clean build without a cache.
    • Keep DerivedData and caches isolated by project.

    Ready when: A manual run produces the expected artifacts.

  3. 03 · CI setup

    Register a runner and switch one release pipeline

    Register the runner, set its labels and repository permissions, then route your first pipeline to the cloud Mac. Once it succeeds, add signing and upload steps, then expand to other schemes and dedicated nodes.

    • Start with one job running at a time.
    • Keep logs, test reports, and symbol files.
    • Make sure you can switch back to your existing environment if a job fails.

    Ready when: Unattended jobs complete reliably and repeatably.

Keep your existing runner during migration until clean builds, signing, uploads, and retries have all been tested. Export any data you need before your rental ends; don’t use the node’s disk as your only archive.

Three configurations

Use build volume to choose a starting point; let real workloads decide.

These starting points are grouped by daily job volume, not by benchmark results or guaranteed build times. One full rebuild can take more resources than several incremental builds. Track run time, cache hits, and peak memory before deciding to upgrade or add another machine.

Daily build volume is a planning guide. All three configurations are dedicated physical machines; start by validating a single job.
Daily job volume Starting Mac & specs What to validate first Daily rental
1–5 runs
Occasional checks or one project to start
ArmRDP M4 Base
M4 / 16GB / 256GB
Start by completing an archive-and-signing cycle. Check dependency installs, DerivedData, and artifact storage against available disk space. $21.1/dayRent M4 Base
6–20 runs
Ongoing CI and frequent iterations
ArmRDP M4 Plus
M4 / 24GB / 512GB
Check memory pressure when builds and tests run together. Optimize caching before deciding whether you need multiple runners. $41.4/dayRent M4 Plus
21+ runs
Multiple targets or heavier workloads
ArmRDP M4 Pro
M4 Pro / 64GB / 2TB
Check resource needs for large projects or model experiments. If queueing is the bottleneck, split independent jobs across multiple nodes. $59.5/dayRent M4 Pro

Factor in location and rental period

All three configurations are available across 5 locations: Singapore, Tokyo, Seoul, Hong Kong, and the US West Coast. For interactive work, compare the connection from your team to each location. For unattended builds, also check the paths to your repository, dependency sources, and artifact storage. Current availability is shown in the portal.

Start with a daily plan while validating your setup, then compare weekly, monthly, and quarterly rates once your release schedule is established. Payments are accepted via USDT-TRC20 and Visa / Mastercard / Amex (through Stripe), with all charges in USD. Available payment gateways are confirmed by the backend.

Rent for a day and test a real pipeline.

Bring one scheme, a signing configuration, and clear acceptance criteria. Once archiving, signing, and delivery work end to end, add nodes for more jobs.