{
  "schemaVersion": "1.0",
  "item": {
    "slug": "mirroir",
    "name": "Mirroir",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/jfarcand/mirroir",
    "canonicalUrl": "https://clawhub.ai/jfarcand/mirroir",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/mirroir",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=mirroir",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/mirroir"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/mirroir",
    "agentPageUrl": "https://openagent3.xyz/skills/mirroir/agent",
    "manifestUrl": "https://openagent3.xyz/skills/mirroir/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/mirroir/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Mirroir — iPhone Control via iPhone Mirroring",
        "body": "Use mirroir to control a real iPhone through macOS iPhone Mirroring. Screenshot, tap, swipe, type, launch apps, record video, OCR the screen, and run multi-step automation scenarios — all from the terminal. Works with any app on screen, no source code or jailbreak required."
      },
      {
        "title": "When to Use",
        "body": "✅ USE this skill when:\n\nUser wants to interact with their iPhone (tap, swipe, type, navigate)\nSending an iMessage, WhatsApp, or any messaging app message on the iPhone\nAdding calendar events, reminders, or notes on the iPhone\nTesting a mobile app (Expo Go, TestFlight, App Store apps)\nTaking a screenshot of the iPhone screen\nRecording a video of an iPhone interaction\nReading what's on the iPhone screen (OCR)\nAutomating a multi-step iPhone workflow (login flows, app navigation)\nChecking iPhone settings or toggling network modes\nLaunching an app on the iPhone\nUser says \"on my phone\", \"on my iPhone\", \"on iOS\""
      },
      {
        "title": "When NOT to Use",
        "body": "❌ DON'T use this skill when:\n\nUser wants to send iMessage from macOS Messages.app → use imsg skill\nUser wants to manage Apple Reminders on macOS → use apple-reminders skill\nUser wants to manage Apple Notes on macOS → use apple-notes skill\nUser wants to automate macOS UI → use peekaboo skill\nUser wants to control a camera → use camsnap skill\nThe task can be done entirely on macOS without the iPhone\niPhone Mirroring is not connected (check with mirroir status first)"
      },
      {
        "title": "Requirements",
        "body": "macOS 15+ (Sequoia or later)\niPhone connected via iPhone Mirroring\nKarabiner-Elements (installed automatically by the mirroir installer)\nScreen Recording and Accessibility permissions granted"
      },
      {
        "title": "Setup",
        "body": "After installing, run the setup to configure the helper daemon and Karabiner:\n\n# One-line install (recommended)\n/bin/bash -c \"$(curl -fsSL https://mirroir.dev/get-mirroir.sh)\"\n\n# Or via Homebrew\nbrew tap jfarcand/tap && brew install iphone-mirroir-mcp\n\n# Or via npx\nnpx -y iphone-mirroir-mcp install\n\nApprove the Karabiner DriverKit extension if prompted: System Settings > General > Login Items & Extensions — enable all toggles under Karabiner-Elements."
      },
      {
        "title": "MCP Server Configuration",
        "body": "Mirroir is an MCP server. Configure it in your OpenClaw MCP settings:\n\n{\n  \"mirroir\": {\n    \"command\": \"npx\",\n    \"args\": [\"-y\", \"iphone-mirroir-mcp\"]\n  }\n}\n\nOr if installed via Homebrew, use the binary path directly:\n\n{\n  \"mirroir\": {\n    \"command\": \"iphone-mirroir-mcp\"\n  }\n}"
      },
      {
        "title": "Core Workflow",
        "body": "The typical workflow for any iPhone task:\n\nCheck status: mirroir status — verify iPhone Mirroring is connected\nSee the screen: mirroir describe_screen — OCR the screen to find tap targets\nAct: tap, swipe, type, launch apps based on what's visible\nVerify: take a screenshot or describe the screen again to confirm"
      },
      {
        "title": "Screen & Vision",
        "body": "screenshot — Capture the iPhone screen as PNG\ndescribe_screen — OCR the screen, returns text elements with exact tap coordinates plus a grid-overlaid screenshot\nget_orientation — Report portrait/landscape and window dimensions\nstatus — Connection state, window geometry, device readiness\ncheck_health — Full diagnostic: mirroring, helper, Karabiner, screen capture"
      },
      {
        "title": "Input",
        "body": "tap x y — Tap at coordinates\ndouble_tap x y — Two rapid taps (zoom, text selection)\nlong_press x y — Hold tap for context menus (default 500ms)\nswipe from_x from_y to_x to_y — Swipe between two points\ndrag from_x from_y to_x to_y — Slow drag for icons, sliders\ntype_text \"text\" — Type text via Karabiner virtual keyboard\npress_key key [modifiers] — Send special keys (return, escape, tab, arrows) with optional modifiers (command, shift, option, control)\nshake — Trigger shake gesture (Ctrl+Cmd+Z) for undo/dev menus"
      },
      {
        "title": "Navigation",
        "body": "launch_app \"AppName\" — Open app via Spotlight search\nopen_url \"https://...\" — Open URL in Safari\npress_home — Go to home screen\npress_app_switcher — Open app switcher\nspotlight — Open Spotlight search\nscroll_to \"label\" — Scroll until a text element becomes visible via OCR\nreset_app \"AppName\" — Force-quit app via App Switcher"
      },
      {
        "title": "Recording & Measurement",
        "body": "start_recording — Start video recording of the mirrored screen\nstop_recording — Stop recording and return the .mov file path\nmeasure action until [max_seconds] — Time a screen transition"
      },
      {
        "title": "Network & Scenarios",
        "body": "set_network mode — Toggle airplane/Wi-Fi/cellular via Settings\nlist_scenarios — List available YAML automation scenarios\nget_scenario \"name\" — Read a scenario file"
      },
      {
        "title": "Coordinates",
        "body": "Coordinates are in points relative to the mirroring window's top-left corner. Always use describe_screen first to get exact tap coordinates via OCR. The grid overlay helps target unlabeled icons (back arrows, gears, stars)."
      },
      {
        "title": "Send an iMessage on iPhone",
        "body": "1. launch_app \"Messages\"\n2. describe_screen → find \"New Message\" button coordinates\n3. tap [x] [y] on \"New Message\"\n4. type_text \"Alice\"\n5. describe_screen → find Alice in suggestions\n6. tap [x] [y] on Alice\n7. tap [x] [y] on the message field\n8. type_text \"Running 10 min late\"\n9. press_key return\n10. screenshot → confirm sent"
      },
      {
        "title": "Test a login flow",
        "body": "1. launch_app \"MyApp\"\n2. describe_screen → find Email field\n3. tap [x] [y] on Email\n4. type_text \"${TEST_EMAIL}\"\n5. tap [x] [y] on Password\n6. type_text \"${TEST_PASSWORD}\"\n7. tap [x] [y] on \"Sign In\"\n8. describe_screen → verify \"Welcome\" appears"
      },
      {
        "title": "Running late — check Waze ETA and notify the team on Slack",
        "body": "1. launch_app \"Waze\"\n2. describe_screen → read ETA to current destination (e.g. \"23 min\")\n3. press_home\n4. launch_app \"Slack\"\n5. describe_screen → find target channel\n6. tap [x] [y] on \"#standup\"\n7. tap [x] [y] on message field\n8. type_text \"Heads up — Waze says 23 min out, be there by 9:25\"\n9. press_key return\n10. screenshot → confirm sent"
      },
      {
        "title": "Record a bug reproduction",
        "body": "1. start_recording\n2. launch_app \"Settings\"\n3. scroll_to \"General\"\n4. tap [x] [y] on \"General\"\n5. scroll_to \"About\"\n6. tap [x] [y] on \"About\"\n7. stop_recording → returns path to .mov file"
      },
      {
        "title": "Scenarios (YAML Automation)",
        "body": "Mirroir supports YAML scenario files for multi-step automation flows. Scenarios describe intents, not coordinates — the AI reads the steps and executes them using the MCP tools above, adapting to what's actually on screen.\n\nname: Expo Go Login Flow\napp: Expo Go\ndescription: Test the login screen of an Expo Go app with valid credentials\n\nsteps:\n  - launch: \"Expo Go\"\n  - wait_for: \"${APP_SCREEN:-LoginDemo}\"\n  - tap: \"${APP_SCREEN:-LoginDemo}\"\n  - wait_for: \"Email\"\n  - tap: \"Email\"\n  - type: \"${TEST_EMAIL}\"\n  - tap: \"Password\"\n  - type: \"${TEST_PASSWORD}\"\n  - tap: \"Sign In\"\n  - assert_visible: \"Welcome\"\n  - screenshot: \"login_success\"\n\nThe step labels (launch, wait_for, tap, type, assert_visible, screenshot) are semantic intents — the AI interprets each one and calls the appropriate MCP tools (launch_app, describe_screen, tap, type_text, screenshot, etc.) to carry them out.\n\nUse list_scenarios to discover available scenarios and get_scenario to load them."
      },
      {
        "title": "Tips",
        "body": "Always call describe_screen before tapping — never guess coordinates.\nUse scroll_to \"label\" to find off-screen elements instead of manual swiping.\nAfter typing, iOS autocorrect may alter text — type carefully or disable autocorrect on the iPhone.\nUse reset_app before launch_app to ensure a fresh app state.\nFor keyboard shortcuts in apps, use press_key with modifiers (e.g., press_key n [command] for new message in Mail).\ndescribe_screen with skip_ocr: true returns only the grid screenshot, letting your vision model identify icons and images OCR can't read."
      },
      {
        "title": "Troubleshooting",
        "body": "\"iPhone Mirroring not found\" → Open iPhone Mirroring.app manually, ensure your iPhone is paired\nTaps not registering → Check Karabiner DriverKit extension is approved in System Settings\nScreenshot permission denied → Grant Screen Recording permission to your terminal\nHelper not running → Run npx iphone-mirroir-mcp setup to reinstall the helper daemon"
      }
    ],
    "body": "Mirroir — iPhone Control via iPhone Mirroring\n\nUse mirroir to control a real iPhone through macOS iPhone Mirroring. Screenshot, tap, swipe, type, launch apps, record video, OCR the screen, and run multi-step automation scenarios — all from the terminal. Works with any app on screen, no source code or jailbreak required.\n\nWhen to Use\n\n✅ USE this skill when:\n\nUser wants to interact with their iPhone (tap, swipe, type, navigate)\nSending an iMessage, WhatsApp, or any messaging app message on the iPhone\nAdding calendar events, reminders, or notes on the iPhone\nTesting a mobile app (Expo Go, TestFlight, App Store apps)\nTaking a screenshot of the iPhone screen\nRecording a video of an iPhone interaction\nReading what's on the iPhone screen (OCR)\nAutomating a multi-step iPhone workflow (login flows, app navigation)\nChecking iPhone settings or toggling network modes\nLaunching an app on the iPhone\nUser says \"on my phone\", \"on my iPhone\", \"on iOS\"\nWhen NOT to Use\n\n❌ DON'T use this skill when:\n\nUser wants to send iMessage from macOS Messages.app → use imsg skill\nUser wants to manage Apple Reminders on macOS → use apple-reminders skill\nUser wants to manage Apple Notes on macOS → use apple-notes skill\nUser wants to automate macOS UI → use peekaboo skill\nUser wants to control a camera → use camsnap skill\nThe task can be done entirely on macOS without the iPhone\niPhone Mirroring is not connected (check with mirroir status first)\nRequirements\nmacOS 15+ (Sequoia or later)\niPhone connected via iPhone Mirroring\nKarabiner-Elements (installed automatically by the mirroir installer)\nScreen Recording and Accessibility permissions granted\nSetup\n\nAfter installing, run the setup to configure the helper daemon and Karabiner:\n\n# One-line install (recommended)\n/bin/bash -c \"$(curl -fsSL https://mirroir.dev/get-mirroir.sh)\"\n\n# Or via Homebrew\nbrew tap jfarcand/tap && brew install iphone-mirroir-mcp\n\n# Or via npx\nnpx -y iphone-mirroir-mcp install\n\n\nApprove the Karabiner DriverKit extension if prompted: System Settings > General > Login Items & Extensions — enable all toggles under Karabiner-Elements.\n\nMCP Server Configuration\n\nMirroir is an MCP server. Configure it in your OpenClaw MCP settings:\n\n{\n  \"mirroir\": {\n    \"command\": \"npx\",\n    \"args\": [\"-y\", \"iphone-mirroir-mcp\"]\n  }\n}\n\n\nOr if installed via Homebrew, use the binary path directly:\n\n{\n  \"mirroir\": {\n    \"command\": \"iphone-mirroir-mcp\"\n  }\n}\n\nCore Workflow\n\nThe typical workflow for any iPhone task:\n\nCheck status: mirroir status — verify iPhone Mirroring is connected\nSee the screen: mirroir describe_screen — OCR the screen to find tap targets\nAct: tap, swipe, type, launch apps based on what's visible\nVerify: take a screenshot or describe the screen again to confirm\nAvailable Tools (26 total)\nScreen & Vision\nscreenshot — Capture the iPhone screen as PNG\ndescribe_screen — OCR the screen, returns text elements with exact tap coordinates plus a grid-overlaid screenshot\nget_orientation — Report portrait/landscape and window dimensions\nstatus — Connection state, window geometry, device readiness\ncheck_health — Full diagnostic: mirroring, helper, Karabiner, screen capture\nInput\ntap x y — Tap at coordinates\ndouble_tap x y — Two rapid taps (zoom, text selection)\nlong_press x y — Hold tap for context menus (default 500ms)\nswipe from_x from_y to_x to_y — Swipe between two points\ndrag from_x from_y to_x to_y — Slow drag for icons, sliders\ntype_text \"text\" — Type text via Karabiner virtual keyboard\npress_key key [modifiers] — Send special keys (return, escape, tab, arrows) with optional modifiers (command, shift, option, control)\nshake — Trigger shake gesture (Ctrl+Cmd+Z) for undo/dev menus\nNavigation\nlaunch_app \"AppName\" — Open app via Spotlight search\nopen_url \"https://...\" — Open URL in Safari\npress_home — Go to home screen\npress_app_switcher — Open app switcher\nspotlight — Open Spotlight search\nscroll_to \"label\" — Scroll until a text element becomes visible via OCR\nreset_app \"AppName\" — Force-quit app via App Switcher\nRecording & Measurement\nstart_recording — Start video recording of the mirrored screen\nstop_recording — Stop recording and return the .mov file path\nmeasure action until [max_seconds] — Time a screen transition\nNetwork & Scenarios\nset_network mode — Toggle airplane/Wi-Fi/cellular via Settings\nlist_scenarios — List available YAML automation scenarios\nget_scenario \"name\" — Read a scenario file\nCoordinates\n\nCoordinates are in points relative to the mirroring window's top-left corner. Always use describe_screen first to get exact tap coordinates via OCR. The grid overlay helps target unlabeled icons (back arrows, gears, stars).\n\nExamples\nSend an iMessage on iPhone\n1. launch_app \"Messages\"\n2. describe_screen → find \"New Message\" button coordinates\n3. tap [x] [y] on \"New Message\"\n4. type_text \"Alice\"\n5. describe_screen → find Alice in suggestions\n6. tap [x] [y] on Alice\n7. tap [x] [y] on the message field\n8. type_text \"Running 10 min late\"\n9. press_key return\n10. screenshot → confirm sent\n\nTest a login flow\n1. launch_app \"MyApp\"\n2. describe_screen → find Email field\n3. tap [x] [y] on Email\n4. type_text \"${TEST_EMAIL}\"\n5. tap [x] [y] on Password\n6. type_text \"${TEST_PASSWORD}\"\n7. tap [x] [y] on \"Sign In\"\n8. describe_screen → verify \"Welcome\" appears\n\nRunning late — check Waze ETA and notify the team on Slack\n1. launch_app \"Waze\"\n2. describe_screen → read ETA to current destination (e.g. \"23 min\")\n3. press_home\n4. launch_app \"Slack\"\n5. describe_screen → find target channel\n6. tap [x] [y] on \"#standup\"\n7. tap [x] [y] on message field\n8. type_text \"Heads up — Waze says 23 min out, be there by 9:25\"\n9. press_key return\n10. screenshot → confirm sent\n\nRecord a bug reproduction\n1. start_recording\n2. launch_app \"Settings\"\n3. scroll_to \"General\"\n4. tap [x] [y] on \"General\"\n5. scroll_to \"About\"\n6. tap [x] [y] on \"About\"\n7. stop_recording → returns path to .mov file\n\nScenarios (YAML Automation)\n\nMirroir supports YAML scenario files for multi-step automation flows. Scenarios describe intents, not coordinates — the AI reads the steps and executes them using the MCP tools above, adapting to what's actually on screen.\n\nname: Expo Go Login Flow\napp: Expo Go\ndescription: Test the login screen of an Expo Go app with valid credentials\n\nsteps:\n  - launch: \"Expo Go\"\n  - wait_for: \"${APP_SCREEN:-LoginDemo}\"\n  - tap: \"${APP_SCREEN:-LoginDemo}\"\n  - wait_for: \"Email\"\n  - tap: \"Email\"\n  - type: \"${TEST_EMAIL}\"\n  - tap: \"Password\"\n  - type: \"${TEST_PASSWORD}\"\n  - tap: \"Sign In\"\n  - assert_visible: \"Welcome\"\n  - screenshot: \"login_success\"\n\n\nThe step labels (launch, wait_for, tap, type, assert_visible, screenshot) are semantic intents — the AI interprets each one and calls the appropriate MCP tools (launch_app, describe_screen, tap, type_text, screenshot, etc.) to carry them out.\n\nUse list_scenarios to discover available scenarios and get_scenario to load them.\n\nTips\nAlways call describe_screen before tapping — never guess coordinates.\nUse scroll_to \"label\" to find off-screen elements instead of manual swiping.\nAfter typing, iOS autocorrect may alter text — type carefully or disable autocorrect on the iPhone.\nUse reset_app before launch_app to ensure a fresh app state.\nFor keyboard shortcuts in apps, use press_key with modifiers (e.g., press_key n [command] for new message in Mail).\ndescribe_screen with skip_ocr: true returns only the grid screenshot, letting your vision model identify icons and images OCR can't read.\nTroubleshooting\n\"iPhone Mirroring not found\" → Open iPhone Mirroring.app manually, ensure your iPhone is paired\nTaps not registering → Check Karabiner DriverKit extension is approved in System Settings\nScreenshot permission denied → Grant Screen Recording permission to your terminal\nHelper not running → Run npx iphone-mirroir-mcp setup to reinstall the helper daemon"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/jfarcand/mirroir",
    "publisherUrl": "https://clawhub.ai/jfarcand/mirroir",
    "owner": "jfarcand",
    "version": "0.13.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/mirroir",
    "downloadUrl": "https://openagent3.xyz/downloads/mirroir",
    "agentUrl": "https://openagent3.xyz/skills/mirroir/agent",
    "manifestUrl": "https://openagent3.xyz/skills/mirroir/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/mirroir/agent.md"
  }
}