
Serve Sim
Drive the iOS Simulator from your coding agent—tap, home, rotate, inject camera feeds, stream the display, and exercise notification UI—without hand-typing fragile pixel gestures.
Overview
serve-sim is an agent skill for the Ship phase that automates iOS Simulator interactions through the `npx serve-sim` CLI for agent-driven mobile QA.
Install
npx skills add https://github.com/evanbacon/serve-sim --skill serve-simWhat is this skill?
- Normalized tap coordinates via `npx serve-sim tap 0.5 0.5`—not raw pixel gesture begin/end pairs
- Background the app with `button home` or Face ID–appropriate `swipe_home` after interactions
- Camera injection on macOS 14+ with `--file`, mirror control, `camera status -q`, and `--stop-webcam` teardown
- Orientation changes with `npx serve-sim rotate landscape_left` (and related orientations)
- Remote viewing via simulator stream plus notification-center gestures from eval scenarios
- 3 documented eval scenarios (tap-then-home, camera-injection-rotate, stream-and-pull-notification-center)
- macOS major version 14+ required for camera injection flows
Adoption & trust: 1 installs on skills.sh; 1.6k GitHub stars; 3/3 security scanners passed (skills.sh audits); trending (+100% hot-view momentum).
What problem does it solve?
You need your agent to exercise real simulator gestures, camera injection, and orientation changes without guessing pixel coordinates or skipping macOS version guards.
Who is it for?
Indie iOS builders on macOS who already use simulators and want agents to run scripted interaction checks during feature work or pre-release smoke tests.
Skip if: Android-only projects, Windows/Linux-only dev environments without a local iOS Simulator, or teams that refuse shell access for `npx` CLI automation.
When should I use this skill?
User asks to control iOS Simulator, test camera flows, tap/rotate/background apps, or stream simulator output via serve-sim.
What do I get? / Deliverables
Your agent runs verified serve-sim command sequences—tap, home, camera inject with teardown, rotate, stream, and notification pulls—so mobile test steps are reproducible in chat-driven workflows.
- Executed serve-sim command sequences
- Verified simulator state before/after camera injection
Recommended Skills
Journey fit
Simulator-driven flows are classic pre-release QA: reproducing taps, orientation, and camera paths before you ship a build to TestFlight or the store. Testing subphase is where automated simulator commands replace manual device babysitting during feature and regression checks.
How it compares
Use this as a focused simulator driver skill—not as a full Detox/Appium replacement or a cloud device farm integration.
Common Questions / FAQ
Who is serve-sim for?
serve-sim is for solo and indie mobile developers on macOS who ship iOS apps and want coding agents to control the Simulator with normalized commands instead of manual tapping.
When should I use serve-sim?
Use serve-sim during Ship testing when you need agent-verified taps, home/background transitions, camera feed injection, rotation, remote streaming, or notification-center drags on a booted iPhone simulator.
Is serve-sim safe to install?
Review the Security Audits panel on this Prism page for install risk and file hash context; treat simulator streaming and shell commands as privileged operations on your Mac.
SKILL.md
READMESKILL.md - Serve Sim
{ "skill_name": "serve-sim", "evals": [ { "id": 1, "name": "tap-then-home", "prompt": "I'm running an iPhone 16 Pro simulator. Please tap the center of the screen and then send the app to background.", "expected_behavior": [ "Verifies a simulator is booted before issuing commands.", "Uses `npx serve-sim tap 0.5 0.5` (NOT `gesture` with begin/end) for the tap.", "Uses `npx serve-sim button home` (or `swipe_home` on Face ID devices) to background the app.", "Does NOT pass pixel coordinates." ], "files": [] }, { "id": 2, "name": "camera-injection-rotate", "prompt": "Test the camera flow of my app com.acme.MyApp. Inject this image as the camera feed (~/Pictures/test.png), force mirror off so any text in the image reads correctly, then rotate to landscape_left.", "expected_behavior": [ "Checks macOS major version is 14+ before attempting camera injection.", "Runs `npx serve-sim camera com.acme.MyApp --file ~/Pictures/test.png --mirror off` (or `--no-mirror`).", "Runs `npx serve-sim rotate landscape_left`.", "Verifies helper state via `npx serve-sim camera status -q`.", "Tears down with `npx serve-sim camera --stop-webcam` when finished." ], "files": [] }, { "id": 3, "name": "stream-and-pull-notification-center", "prompt": "Stream my simulator so I can share the URL remotely. Then drag down from the top edge to open Notification Center.", "expected_behavior": [ "Runs `npx serve-sim --detach -q` and surfaces the returned URL to the user.", "Issues a gesture sequence (begin → move → end) with `edge: 2` (top), starting at low y (~0.02) and dragging down to y ~0.4.", "Each gesture call uses `npx serve-sim gesture '<json>'` with valid normalized coordinates.", "Does NOT use `tap` for this multi-step gesture." ], "files": [] }, { "id": 4, "name": "blended-layers-debug", "prompt": "I think my settings screen has too many blended layers — can you turn on the CoreAnimation blended overlay, grab a screenshot from the stream, and turn it off again?", "expected_behavior": [ "Runs `npx serve-sim ca-debug blended on` (alias accepted; `debug_color_blended` also valid).", "Captures a JPEG from `http://localhost:<port>/stream.mjpeg?raw=1` with a short curl timeout, or from the preview UI.", "Runs `npx serve-sim ca-debug blended off` after capture.", "Reports the path to the saved screenshot." ], "files": [] }, { "id": 5, "name": "ax-driven-tap", "prompt": "There's a Submit button somewhere on the current screen. Tap it without me telling you where it is.", "expected_behavior": [ "Fetches the accessibility tree from `/ax` on the stream server.", "Locates an element whose label matches 'Submit' (case-insensitive).", "Computes the element center, normalizes against `/config` width/height, and calls `npx serve-sim tap <nx> <ny>`.", "If no matching element is found, reports that — does not guess coordinates." ], "files": [] }, { "id": 6, "name": "preview-handoff", "prompt": "I've got my app running in the iPhone 16 Pro simulator. Stream it and show me the preview right here in this agent — don't make me open another window.", "expected_behavior": [ "Runs `npx serve-sim --detach -q` and parses the returned JSON to extract the `url` field.", "Surfaces the URL plainly in the response so the user has a manual fallback.", "Inspects available tools for a preview/URL-opening capability (`preview_start`, `mcp__Claude_Preview__preview_start`, `browser_open`, etc.) and calls it with the URL if found.", "If no such tool is available, explicitly tells the user that and instructs them to open the URL in their host's browser