Every agent needs a sidekick to hold the phone — remote Xcode + cloud iOS/Android/TV for coding agents (CLI/skill/MCP, self-hostable)
Install
npx skillscat add imbios/sidekick/skill Install via the SkillsCat registry.
SKILL.md
Sidekick agent skill — drop into ~/.claude/skills/sidekick/ or .claude/skills/
Any agent that can run shell commands can use Sidekick. MCP optional.
Your cloud sandbox has no Xcode or emulator. Use sidekick for all mobile work.
Auth (one time)
- Get a key from console Settings → API keys (scoped to your default org, created at signup).
sidekick login(paste it) orexport SIDEKICK_TOKEN=sk_live_....sidekick orgshows your org.- New machine:
sidekick agent-setupinstalls this skill into ~/.claude/skills, then registers MCP:claude mcp add sidekick -- sidekick mcp. No MCP client? The CLI alone covers every verb below. - Fastest live device:
sidekick devboots a sim and prints its share URL (add--jsonfor scripts).
Build iOS (no Mac needed)
sidekick xcode build . --scheme MyApp— syncs code, streams xcodebuild logs. Iterate on errors.- Warm cache is automatic (DerivedData + S3 asset storage). Upload
.apponce, reuse.
Drive iOS simulator
sidekick ios create --device "iPhone 16, iOS 18.2"→ returns id (provisioning). Pollsidekick ios get <id>untilrunning, thenwebrtc_urlappears. Share webrtc_url as preview link on PR.sidekick ios ax-tree <id>first, thensidekick ios act <id> --tap @e5/--type "hi"/--swipe up. Batch file for ms precision:--batch actions.json. Poll the returnedaction_idsvia the API untildone(the daemon posts each result).sidekick ios screenshot <id> --out shot.png,sidekick ios logs <id> --tail 100for crashes.sidekick ios record <id>to start,sidekick ios record <id> --stop --out demo.mp4→ mp4 demo video for PR.
Drive Android
- No Mac needed, ever: emus run on Linux KVM hosts (
emu-hostboots AVDs per claim, self-host viadocker-compose.selfhost.yml). sidekick android create --profile Pixel_7→ id (provisioning). Pollsidekick android get <id>untilrunning, then adb tunnel on localhost:5555:adb-proxy --emu <id>(uses SIDEKICK_TOKEN). Then plainadb install app.apk,maestro test flow.yaml, Appium, scrcpy all work.- Same verbs:
android ui-tree(@e refs from the on-device dump),android screenshot --out shot.png,android logs --tail 100, preview link. - Media + posture over the tunnel:
android record --out demo.mp4 --duration 30s,android netcap --out cap.pcap --duration 30s,android rotate 90,android posture half-open(foldables only). - Pin work to a fleet region:
android create --region asia-northeast1(hosts join with--region; unpinned work goes anywhere).
Rules
- Always build before creating a simulator. Always
ui-treebefore acting (refs go stale after each screen change). - Plain-English tests:
sidekick test nl --emu <id> "tap the Send button" "expect Inbox visible"— verbs ground against the live tree, failures name candidates. - Screenshot when checking look (tree has no color/stacking). Logs when app crashes.
- Stop sessions when done:
sidekick ios delete <id>/sidekick android delete <id>— streaming minutes bill until stopped. - If asked only to "implement X", still verify on device and post preview link + video.