{"id":49411192,"url":"https://github.com/nativescript/simdeck","last_synced_at":"2026-05-30T07:01:03.761Z","repository":{"id":354516984,"uuid":"1217713968","full_name":"NativeScript/SimDeck","owner":"NativeScript","description":"SimDeck is a developer tool built for streamlining mobile app development for coding agents. Drive iOS Simulators and Android emulators from the CLI using agents, browser, and automated tests on macOS.","archived":false,"fork":false,"pushed_at":"2026-05-26T02:31:33.000Z","size":108366,"stargazers_count":33,"open_issues_count":2,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-26T02:31:40.885Z","etag":null,"topics":["android","flutter","ios","jetpack-compose","nativescript","react-native","swiftui","typescript"],"latest_commit_sha":null,"homepage":"https://simdeck.sh","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NativeScript.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":"NativeScript","open_collective":"nativescript"}},"created_at":"2026-04-22T06:31:41.000Z","updated_at":"2026-05-26T02:31:37.000Z","dependencies_parsed_at":null,"dependency_job_id":"e9bdc69a-414a-4141-9a79-59627870d83d","html_url":"https://github.com/NativeScript/SimDeck","commit_stats":null,"previous_names":["nativescript/simdeck"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/NativeScript/SimDeck","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NativeScript%2FSimDeck","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NativeScript%2FSimDeck/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NativeScript%2FSimDeck/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NativeScript%2FSimDeck/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NativeScript","download_url":"https://codeload.github.com/NativeScript/SimDeck/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NativeScript%2FSimDeck/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33682998,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","flutter","ios","jetpack-compose","nativescript","react-native","swiftui","typescript"],"created_at":"2026-04-29T01:00:19.441Z","updated_at":"2026-05-30T07:01:03.755Z","avatar_url":"https://github.com/NativeScript.png","language":"Rust","funding_links":["https://github.com/sponsors/NativeScript","https://opencollective.com/nativescript"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg width=\"180\" src=\"./packages/client/public/simdeck.png\"\u003e\n\n  \u003ch1 align=\"center\"\u003eSimDeck\u003c/h1\u003e\n\n  \u003cp align=\"center\"\u003e\n    SimDeck is a developer tool built for streamlining mobile app development using agents.\n    Drive iOS Simulators and Android emulators from your favorite IDE \u0026 CLI.\n  \u003c/p\u003e\n\u003c/p\u003e\n\n\u003chr/\u003e\n\n![Codex Screenshot](./assets/codex-screenshot.png)\n\n## Try it out\n\n```sh\nnpx simdeck\n```\n\nOpen the URL in your IDE of choice, for example in-app browser in Codex.\n\nInstall the CLI globally for agentic-use:\n\n```sh\nnpm i -g simdeck@latest\n```\n\nAfter installing the CLI, install the Codex skill so agents know the stable\nSimDeck workflow:\n\n```sh\nnpx skills add NativeScript/SimDeck --skill simdeck -g\n```\n\nFor VS Code, install the [`nativescript.simdeck-vscode`](https://marketplace.visualstudio.com/items?itemName=NativeScript.simdeck-vscode) extension to open the simulator\nview inside the editor.\n\n## Features\n\n- Supports streaming both iOS simulators and Android emulators\n- Full simulator control \u0026 inspection using private iOS accessibility APIs and Android UIAutomator - available using `simdeck` CLI\n- Real-time screen `describe` command using accessibility view tree - available in token-efficient format for agents\n- Profiling built-in: CPU, memory, disk writes, network throughput, hang signals, and stack sampling\n- CoreSimulator chrome asset rendering for device bezels\n- NativeScript, React Native, Flutter, UIKit and SwiftUI runtime inspector plugins to debug app's view hierarchy live\n- `simdeck/test` for fast JS-based app tests that can query accessibility state and drive simulator controls\n\n## Documentation\n\nFull documentation lives at [simdeck.sh](https://simdeck.sh/), with guides, the CLI reference, the REST API, the video pipeline, and the inspector protocols.\n\nFor hosted pull request simulator sessions, use the GitHub Actions integration\ndocumented in the [GitHub Actions guide](https://simdeck.sh/guide/github-actions).\n\n## Quick start\n\n```sh\nsimdeck\n```\n\nTo focus a specific simulator by name or UDID, pass it as the only argument:\n\n```sh\nsimdeck \"iPhone 17 Pro Max\"\n```\n\nUse `simdeck --open` to open the browser automatically, `simdeck -p 4311` to\nuse a non-default port, and `simdeck -a` to register the service for login\nautostart.\n\nThe served loopback browser UI receives the generated API access token automatically.\nLAN clients should pair with the printed code before receiving the API cookie.\n\nFor pairing with SimDeck iOS app:\n\n```sh\nsimdeck pair\n```\n\nThis starts or refreshes the LaunchAgent-backed SimDeck service, prints\nlocal, LAN, and Tailscale URLs when available, and shows a QR code with a\n`simdeck://pair` link. The QR contains the pairing code plus all detected\nnon-loopback addresses, so pairing once can save both the LAN and Tailscale\nroutes with the same service token.\nNormal service restarts preserve that token so paired clients stay connected.\nUse `simdeck service reset` only when you want to rotate the service token and\nrestart the LaunchAgent.\nThe service uses port 4310 unless you pass `-p` or `--port`.\nUse `simdeck service kill` when you want to stop every SimDeck service process,\nincluding services started from another checkout or installed binary.\n\nCLI commands automatically use the same warm service:\n\n```sh\nsimdeck list\nsimdeck use \u003cudid\u003e\nsimdeck tap 0.5 0.5 --normalized\nsimdeck tap \"Continue\"\nsimdeck describe --format agent --max-depth 2 --interactive\nsimdeck press @e3\nsimdeck snapshot --format agent --max-depth 2 -i\nsimdeck --device \u003cother-udid\u003e describe --format agent --max-depth 2\n```\n\n## CLI\n\n```sh\nsimdeck list\nsimdeck use \u003cudid\u003e\nsimdeck boot \u003cudid\u003e\nsimdeck shutdown\nsimdeck erase\nsimdeck install /path/to/App.app\nsimdeck install /path/to/App.ipa\nsimdeck install android:\u003cavd-name\u003e /path/to/app.apk\nsimdeck uninstall com.example.App\nsimdeck open-url https://example.com\nsimdeck launch com.apple.Preferences\nsimdeck toggle-appearance\nsimdeck pasteboard set \"hello\"\nsimdeck pasteboard get\nsimdeck screenshot --output screen.png\nsimdeck screenshot --with-bezel --output screen-bezel.png\nsimdeck record --seconds 5 --output screen-recording.mp4\nsimdeck stream --frames 120 \u003e stream.h264\nsimdeck describe\nsimdeck describe --format agent --max-depth 4\nsimdeck describe --format agent --max-depth 4 --interactive\nsimdeck snapshot --format agent --max-depth 4 -i\nsimdeck describe --point 120,240\nsimdeck wait-for --label \"Welcome\" --timeout-ms 5000\nsimdeck wait --label \"Welcome\" --timeout-ms 5000\nsimdeck assert --id login.button --source auto --max-depth 8\nsimdeck tap 120 240\nsimdeck tap --label \"Continue\" --wait-timeout-ms 5000\nsimdeck tap --id com.apple.settings.screenTime --expect-id BackButton\nsimdeck tap \"Continue\"\nsimdeck press @e3\nsimdeck back\nsimdeck swipe 200 700 200 200\nsimdeck gesture scroll-down\nsimdeck pinch --start-distance 160 --end-distance 80\nsimdeck rotate-gesture --radius 100 --degrees 90\nsimdeck touch 0.5 0.5 --phase began --normalized\nsimdeck touch 120 240 --down --up --delay-ms 800\nsimdeck key enter\nsimdeck key-sequence --keycodes h,e,l,l,o\nsimdeck key-combo --modifiers cmd --key a\nsimdeck type \"hello\"\nsimdeck type --file message.txt\nsimdeck button lock --duration-ms 1000\nsimdeck button volume-up\nsimdeck button action --duration-ms 1000\nsimdeck button digital-crown\nsimdeck crown --delta 50\nsimdeck button left-side-button\nsimdeck batch --step \"tap --label Continue --expect-label Done\" --step \"type 'hello'\" --step \"back\"\nsimdeck dismiss-keyboard\nsimdeck button software-keyboard\nsimdeck home\nsimdeck app-switcher\nsimdeck rotate-left\nsimdeck rotate-right\nsimdeck chrome-profile\nsimdeck logs --seconds 30 --limit 200\nsimdeck processes\nsimdeck stats --watch\nsimdeck sample --seconds 3\n```\n\n`simdeck list` defaults to compact JSON for agent-friendly device selection.\nUse `simdeck list --format json` for the full inventory with paths and display\nmetadata.\n\n`simdeck use \u003cudid\u003e` stores a default simulator for the current project\ndirectory. Most device commands accept `[\u003cudid\u003e]`; when it is omitted, SimDeck\nuses `--device`, `SIMDECK_DEVICE`, `SIMDECK_UDID`, the saved project default,\nor the only booted simulator, in that order.\n\n## JS/TS Tests\n\n```ts\nimport { connect } from \"simdeck/test\";\n\nconst sim = await connect({ udid: \"\u003cudid\u003e\" });\ntry {\n  await sim.tap(0.5, 0.5);\n  await sim.waitFor({ label: \"Continue\" });\n  await sim.screenshot();\n  await sim.screenshot({ withBezel: true });\n  await sim.record({ seconds: 5 });\n} finally {\n  sim.close();\n}\n```\n\n`connect()` starts the SimDeck service when needed and reuses it when it is\nalready healthy. Pass `udid` to `connect()`\nto make it the default for session methods; each method still accepts an\nexplicit UDID as the first argument when needed. Query helpers such as\n`tree()`, `query()`, `waitFor()`, `assert()`, and selector `tapElement()`\ndefault to `source: \"native-ax\"` for fast agent control; pass\n`source: \"auto\"` when a test intentionally wants richer framework inspector\ntrees first.\n\n## NativeScript Inspector\n\nNativeScript apps can connect directly to the running server from JS and expose\ntheir NativeScript logical hierarchy plus raw UIKit backing views without\nlinking the Swift inspector framework:\n\n```ts\nimport { startSimDeckInspector } from \"@nativescript/simdeck-inspector\";\n\nif (__DEV__) {\n  startSimDeckInspector({ port: 4310 });\n}\n```\n\nThe runtime connects to `GET /api/inspector/connect` as a WebSocket. The Rust\nserver prefers connected NativeScript inspectors for hierarchy requests and\nfalls back to the Swift TCP inspector or the built-in native accessibility\nbridge when no matching app inspector is available.\n\n## React Native Inspector\n\nReact Native apps can expose their component tree and Metro dev-mode source\nlocations with the React Native inspector package:\n\n```ts\nimport \"react-native-simdeck/auto\";\nimport \"expo-router/entry\";\n```\n\nImport it before `expo-router/entry` or `AppRegistry.registerComponent(...)`\nso the package can capture React Fiber commits. The auto entrypoint no-ops\noutside development, reads `EXPO_PUBLIC_SIMDECK_PORT` when present, and\notherwise scans common SimDeck service ports.\n\n## Flutter Inspector\n\nFlutter apps can expose their widget tree, render frames, semantics metadata,\nand debug widget creation locations with the Flutter inspector package:\n\n```dart\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:simdeck_flutter_inspector/simdeck_flutter_inspector.dart';\n\nvoid main() {\n  WidgetsFlutterBinding.ensureInitialized();\n\n  if (kDebugMode) {\n    startSimDeckFlutterInspector(port: 4310);\n  }\n\n  runApp(const App());\n}\n```\n\n## Contributing\n\nContributors should read [CONTRIBUTING.md](CONTRIBUTING.md) for local build\ninstructions, the dev workflow, and architecture notes.\n\n## Copyright notice\n\nCopyright [OpenJS Foundation](https://openjsf.org) and `NativeScript` contributors. All rights reserved. The [OpenJS Foundation](https://openjsf.org) has registered trademarks and uses trademarks. For a list of trademarks of the [OpenJS Foundation](https://openjsf.org), please see our [Trademark Policy](https://trademark-policy.openjsf.org/) and [Trademark List](https://trademark-list.openjsf.org/). Trademarks and logos not indicated on the [list of OpenJS Foundation trademarks](https://trademark-list.openjsf.org) are trademarks™ or registered® trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.\n\n[The OpenJS Foundation](https://openjsf.org/) | [Terms of Use](https://terms-of-use.openjsf.org/) | [Privacy Policy](https://privacy-policy.openjsf.org/) | [OpenJS Foundation Bylaws](https://bylaws.openjsf.org/) | [Trademark Policy](https://trademark-policy.openjsf.org/) | [Trademark List](https://trademark-list.openjsf.org/) | [Cookie Policy](https://www.linuxfoundation.org/cookies/)\n\n\u003ch3 align=\"center\"\u003eMade with ❤️\u003c/h3\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnativescript%2Fsimdeck","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnativescript%2Fsimdeck","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnativescript%2Fsimdeck/lists"}