# Mobile Demo Record

Run apps/mobile on the iOS simulator against the local stack, drive it with Maestro...

- Repository: https://github.com/ParadevAI/Paradev (15823 stars)
- Category: Mobile
- License: see repository
- Last updated: 2026-11-01
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add ParadevAI/Paradev --skill mobile-demo-record -g -a claude-code -y`
Codex: `npx skills add ParadevAI/Paradev --skill mobile-demo-record -g -a codex -y`
Cursor: `npx skills add ParadevAI/Paradev --skill mobile-demo-record -g -a cursor -y`
Gemini CLI: `npx skills add ParadevAI/Paradev --skill mobile-demo-record -g -a gemini-cli -y`
Claude Code plugin marketplace: `/plugin marketplace add ParadevAI/Paradev`

## Description

Run apps/mobile on the iOS simulator against the local stack, drive it with Maestro, and capture clean screen recordings. Use when asked to record, film, screenshot, or demo the mobile app, or to verify a mobile change in the real app.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# Recording the mobile app

There is no CDP for mobile. The equivalent is the iOS simulator, booted headless, driven by
Maestro, recorded with `simctl`. Nothing here opens a window on the user's display.

## Rules

1. **Real app state only.** Record real sessions, real pull requests, real pages. No mockups,
   no DOM-style fakery. Seed the data the story needs, then delete it.
2. **No real data in frame.** Use the dev account (`admin@local.test`) and a demo org with demo
   projects. Read every frame of the contact sheet for names, emails, repo names, and tokens
   before sharing anything.
3. **One take per story.** A host that has connected once is no longer "never connected", a
   read page is no longer unread. Reset or reseed state before each take.
4. **Report what you recorded against**: worktree, API port, simulator UDID, app build date.

## Stack

Start each in its own Paradev terminal
(`superset terminals create --local --workspace $SUPERSET_WORKSPACE_ID --command "..."`;
without `--local` the call silently returns nothing). Ports come from `.superset/ports.json`
and the root `.env`.

| Service | Command | Trap |
| --- | --- | --- |
| API | `cd apps/api && bun run dev` | A 500 "password authentication failed" means the worktree's Neon branch was cleaned up. Recreate it and rewrite the "# Workspace Database" lines in `.env`. |
| Relay | `cd apps/relay && while true; do CI=1 WRANGLER_SEND_METRICS=false node_modules/.bin/wrangler dev --port $RELAY_PORT --var NEXT_PUBLIC_API_URL:http://localhost:$API_PORT --local; done` | wrangler dev dies with an empty error whenever a client aborts mid-request, which every app relaunch does. Hence the loop. |
| Metro | `cd apps/mobile && CI=1 bunx expo start --dev-client --port 8081` | `CI=1` disables file watching: restart Metro after code edits. Pre-warm the first bundle by curling the `launchAsset.url` from `curl -H 'expo-platform: ios' localhost:8081`, or the dev client times out. |

The rest: https://github.com/ParadevAI/Paradev/blob/HEAD/.agents/skills/mobile-demo-record/SKILL.md
