Running into an issue? Check the guide first, then open a ticket

This page covers the troubleshooting commands for the three most common issue categories: connectivity, builds, and networking. About 80% of our support tickets get resolved this way in under 10 minutes — for everything else, incident tickets get a first response within 2 hours.

Support Channels

Support Channels & Response SLAs

There are only two channels for human support: console tickets and email. Both go straight to the on-call engineer — no scripted support layer in between.

Console Ticket

Best for: instance failures, refund requests, migration scheduling — anything tied to a specific machine. Path: Log in to the console → Tickets → New. The full process is logged, and you'll get an email whenever the status changes.

First response ≤ 2 hours

Log in to open a ticket

Support Email

Best for: can't log in to the console, account security concerns, invoices, and business inquiries. Email support@armmini.com — include your account email and instance ID to skip a round of back-and-forth.

First response ≤ 8 hours

Docs & Self-Help Guides

The troubleshooting guide on this page covers connectivity, builds, and networking; Remote Access has full VNC/SSH walkthroughs and a troubleshooting quick-reference; FAQ covers billing and permissions. Checking the docs first is usually faster than waiting on a response.

Response Commitments by Severity

SeverityTypical ScenarioTicket First ResponseProgress UpdatesRecommended Channel
P1Instance unreachable / node-level outage≤ 30 minEvery 60 minutesConsole ticket
P2Partial feature outage (e.g., VNC works but SSH doesn't)≤ 2 hoursEvery 4 hoursConsole ticket
P3Usage questions, configuration help≤ 4 hoursAs progress is madeTicket or email
P4Feedback, business inquiries & partnerships≤ 24 hoursAs progress is madeEmail

Our support team runs shifts across UTC+8 and UTC-8, and SLAs are counted in calendar hours — weekends and holidays included. We determine the severity level based on impact, so you don't need to tag it yourself.

Before You Open a Ticket, Have This Ready

Self Service

Self-Service Console: Four Actions, Zero Tickets

Reboots, reinstalls, and credential resets don't need a human in the loop. Power actions in the console go through an out-of-band channel, so they still work even if the system is completely frozen — one of the perks of a dedicated physical machine.

One-Click Reboot

Path: Console → Instance → Power → Reboot. This power-cycles the whole machine and takes about 90 seconds; disk data is untouched, but unsaved work will be lost. This is the first thing to try for VNC black screens or an unresponsive system.

Reinstall macOS

Path: Console → Instance → System → Reinstall. Choose your target macOS version from the list; a reinstall wipes the whole disk and takes 25–40 minutes, with new VNC/SSH credentials emailed to you afterward. One free reinstall is included per billing cycle.

Reset VNC Password

Path: Console → Instance → Access → Reset VNC Password. Takes effect immediately; the new password is shown on-screen only once, so save it right away. Use this if you've forgotten your password, suspect a leak, or are handing off the machine — it doesn't affect SSH access or data on the instance.

Update SSH Public Key

Path: Console → Instance → Access → SSH Public Key. Paste in a new key and it's written to authorized_keys within 60 seconds; you can also check a box to revoke the old key at the same time. Supports ed25519 and RSA (≥3072 bits), with up to 5 keys per instance.

Troubleshooting

Troubleshooting Guide: The Three Most Common Issues

Follow the steps in order — each one gives you output you can check against. If you're still stuck at the end, paste the output from the last step into a ticket and we'll pick up right where you left off.

VNC connects, but the screen is completely black

Symptom: The VNC client shows as connected, but the display is solid black or stuck on a gray screen, with no response to mouse or keyboard.

  1. First, log in via SSH to confirm the machine itself is online. If SSH doesn't work either, skip straight to a console reboot.
  2. Check whether the screen sharing service is running (command 1) — no output means it isn't running.
  3. Restart the sharing agent with kickstart (command 2), then reconnect via VNC after about 10 seconds.
  4. Disable display sleep (command 3) to prevent the screen from going black again after extended idle time.
  5. Still black: go to Console → Power → Reboot, then reconnect after 90 seconds. If that doesn't help either, open a P2 ticket.
fix-vnc-blackscreen
$ sudo launchctl list | grep -i screensharing
$ sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -restart -agent -console
Done.
$ sudo pmset -a displaysleep 0 sleep 0

SSH connection times out or is refused

Symptom: ssh hangs for a while before returning Operation timed out, or immediately returns Permission denied.

  1. First, ping the instance's public IP (command 1). If that fails, it's most likely a network path issue — head to Network Diagnostics.
  2. Confirm your private key file has 600 permissions (command 2) — if it's too permissive, ssh will silently refuse to use it.
  3. Add -vvv to see exactly where the handshake stalls (command 3): stuck at connect means the port isn't reachable, stuck at auth means a key problem.
  4. If you've modified the pf firewall on the instance, check whether port 22 got blocked (command 4); if you've locked yourself out with your own rules, log in via VNC first and run sudo pfctl -d to temporarily disable the rules before fixing them.
  5. If your key is gone for good: go to Console → Access → Update SSH Public Key — it takes effect within 60 seconds.
fix-ssh-timeout
$ ping -c 5 <instance-public-ip>
$ chmod 600 ~/.ssh/id_ed25519
$ ssh -vvv -o ConnectTimeout=10 dev@<instance-public-ip>
$ sudo pfctl -sr | grep 22

Xcode command-line codesigning fails

Symptom: xcodebuild fails in CI with errSecInternalComponent or User interaction is not allowed, but local GUI builds work fine.

  1. This is almost always caused by the keychain being locked in a GUI-less session. Start by unlocking the login keychain (command 1).
  2. Authorize command-line tools to access the signing private key (command 2) — otherwise every sign attempt waits on a prompt that will never appear.
  3. Verify that a signing identity actually exists (command 3) — output of 0 valid identities means the certificate wasn't imported or has expired.
  4. In your CI script, run commands 1 and 2 before xcodebuild, and pass the password in via an environment variable rather than hardcoding it in the repo.
fix-codesign
$ security unlock-keychain -p "$KEYCHAIN_PASS" ~/Library/Keychains/login.keychain-db
$ security set-key-partition-list -S apple-tool:,apple: -s -k "$KEYCHAIN_PASS" ~/Library/Keychains/login.keychain-db
$ security find-identity -v -p codesigning
1 valid identities found

More connectivity symptoms are covered in the troubleshooting quick-reference on the Remote Access page

CI Integration

CI Integration Guide: Register Your Instance as a Self-Hosted Runner

Download the arm64 macOS runner package from your CI platform's runner settings page, then run the following commands in an SSH session on your instance.

GitHub Actions runner

gha-runner-setup
$ mkdir ~/actions-runner && cd ~/actions-runner
$ tar xzf actions-runner-osx-arm64.tar.gz
$ ./config.sh --url <repo-or-org-url> --token <registration-token> --labels self-hosted,macos,arm64
$ ./svc.sh install && ./svc.sh start
√ runner service started

Install it as a launchd service with svc.sh instead of running run.sh in the foreground: it auto-reconnects after disconnects and comes back up automatically after an instance reboot — no extra keep-alive script needed. Registration tokens are only valid for an hour, so just regenerate one if it expires.

GitLab Runner

gitlab-runner-setup
$ brew install gitlab-runner
$ gitlab-runner register --executor shell --url <your-gitlab-url> --token <auth-token> --tag-list macos,xcode,arm64
$ brew services start gitlab-runner
Successfully started `gitlab-runner`

Set the executor to shell so builds run directly in the macOS user session with full access to the Xcode toolchain and simulators. We recommend keeping concurrency at 1: on Apple Silicon, one job that has all performance cores to itself finishes faster than two jobs fighting over them.

Three Keys to Keychain & Cache Persistence

Dedicated Build Keychain

Don't mix CI certificates into the login keychain. Create a separate build.keychain with a 21600-second (6-hour) timeout, and run an unlock at the start of every job — this eliminates signing prompt issues at the root.

Fixed DerivedData Path

Pass -derivedDataPath to xcodebuild pointing to a fixed directory outside the job's working tree. On a dedicated physical machine, the cache persists on disk across jobs, and incremental builds on large Swift projects come in 40–70% faster than full builds.

Pre-Built Simulators

Use xcrun simctl create to pre-build the device types you use most and leave them in place. UI tests skip the simulator cold-start, typically saving 60~90 seconds per job. Since the instance is never reclaimed, a one-time setup lasts indefinitely.

ci-cache-keychain
$ security create-keychain -p "$PASS" build.keychain
$ security set-keychain-settings -lut 21600 build.keychain
$ security unlock-keychain -p "$PASS" build.keychain
$ xcodebuild -scheme App -derivedDataPath ~/ci-cache/DerivedData build
Network Check

Network Diagnostics: Test the Path Before You Open a Ticket

Each of our five locations has a test endpoint sharing the same rack-level egress as your production instances, so testing it is effectively testing your instance. See the node latency table on the Remote Access page for reference figures by region.

NodeTest EndpointRegionNotes
Tokyoping.tyo.armmini.comEast AsiaShares egress with Tokyo instances — latency here reflects real-world experience
Seoulping.icn.armmini.comNortheast AsiaShares egress with Seoul instances
Silicon Valleyping.sjc.armmini.comUS West CoastShares egress with Silicon Valley instances
network-selfcheck
$ ping -c 20 ping.tyo.armmini.com
20 packets transmitted, 20 received, 0% loss
$ mtr -rwzbc 100 ping.tyo.armmini.com > mtr-report.txt
-r report mode, -c 100 samples 100 packets, about two minutes

How to Get a Network Ticket Resolved Fast

  1. Run mtr -rwzbc 100 locally against the matching node's test endpoint and save the report.
  2. SSH into your instance and run the same test in reverse, against your local public IP — a one-way report only shows half the path.
  3. In the ticket, note your ISP, connection type (home broadband/business line/cellular), and the time window of the issue.
  4. Paste both raw reports into the ticket and select severity P2.

We handle issues on our data center egress side the same day; packet loss on cross-network middle-mile paths needs a hop-by-hop check with upstream providers, which usually takes 1–2 business days to pin down, with progress updates posted continuously in the ticket.

Availability & Incidents

Availability & Incident Process

All nodes run 365 days a year with no service interruptions you'd need to schedule around; hardware swaps at the node level are handled with standby machines and don't eat into your usage time. When something does go wrong, here's the process — fully auditable from start to finish.

T+0

Monitoring alert fires, on-call SRE steps in. All five nodes are staffed 24/7 in rotating shifts.

T+10min

Impact scope confirmed; first incident email goes out to affected users: symptoms, scope, estimated recovery time.

In progress

Progress update emailed every 60 minutes until resolved — no "silent fix" here.

Recovery +24h

Downtime is calculated against the monthly 99.5% uptime commitment; any owed service credit is applied to your account automatically — no need to request it.

Recovery +72h

Postmortem published: root cause, full timeline, and follow-up actions, sent by email and posted to the console announcements.

What You Can Verify

Monthly uptime commitment99.5%
First incident email≤ 10 minutes
Update frequency during incidentEvery 60 minutes
Credit appliedWithin 24 hours of recovery
Postmortem reportWithin 72 hours of recovery

Specific credit tiers and exclusions (force majeure, user-caused issues) are covered in Section 5 of the Terms of Service. If you detect an outage on your end but haven't received an incident email from us, open a P1 ticket directly and we'll cross-check it against your monitoring data.

Migration

Migration Assistance: Free Hands-On Help, Cross-Node or From Anywhere Else

Switching nodes, or moving over from another provider or a local Mac to ArmMini — our engineers provide free one-on-one assistance. Here's exactly what's covered, so you know what to expect before you schedule.

What's Included, Free

  • Migration plan review: rsync/scp commands and time estimates based on your data volume and directory structure
  • CI runner re-registration: guidance on setting up runner config and tags on the new instance
  • Firewall rule replication: carrying over pf rules and port policies from the source instance to the new one
  • 24-hour post-migration monitoring window: migration-related issues get P2 priority during this period

What's Not Included

  • Re-licensing and activation of commercial software on the instance — please contact the software vendor directly;
  • No completion-time guarantee for data transfers over 500GB — this depends on actual measured link bandwidth;
  • For moving data out of ArmMini to a third-party environment, we only provide data export commands.
migrate-rsync
$ rsync -avzP --exclude 'Library/Caches' -e ssh ~/work/ dev@<new-instance-ip>:~/work/
-P supports resume on interruption; Tokyo→Seoul within-region tests show roughly 45~80MB/s
sent 182.4G  speedup is 1.31

How to Schedule

  1. Console → Tickets → New, choose "Migration Assistance" as the category;
  2. Submit at least 48 hours ahead, noting your source environment, target node, and data volume;
  3. For cross-node migrations, we recommend keeping the source instance active until verification is complete before canceling it; same-node upgrades can be prorated against remaining days — see the Plans page for details;
  4. During the scheduled window, the engineer will post each step in the ticket in real time, and you can pause at any point.

Still stuck after troubleshooting? Give us 2 hours

Paste the output from your last step into a ticket, and the on-call engineer will pick up right where you left off. Incident tickets get a first response within 2 hours — weekends and holidays included.