{"id":51687988,"url":"https://github.com/lycorp-jp/sim-use","last_synced_at":"2026-08-04T04:00:34.275Z","repository":{"id":368142594,"uuid":"1280990105","full_name":"lycorp-jp/sim-use","owner":"lycorp-jp","description":"Give your AI agent eyes and hands on iOS Simulator and Android emulator/devices.","archived":false,"fork":false,"pushed_at":"2026-07-23T03:15:19.000Z","size":1155,"stargazers_count":1049,"open_issues_count":4,"forks_count":63,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-07-23T03:15:35.421Z","etag":null,"topics":["accessibility","ai-agents","ai-development","android-emulator","ios-simulator","mobile-automation"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lycorp-jp.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.ja.md","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":"NOTICE","maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":"DCO.md","cla":null}},"created_at":"2026-06-26T05:59:56.000Z","updated_at":"2026-07-23T03:15:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/lycorp-jp/sim-use","commit_stats":null,"previous_names":["lycorp-jp/sim-use"],"tags_count":2,"template":false,"template_full_name":"lycorp-jp/.github","purl":"pkg:github/lycorp-jp/sim-use","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lycorp-jp%2Fsim-use","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lycorp-jp%2Fsim-use/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lycorp-jp%2Fsim-use/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lycorp-jp%2Fsim-use/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lycorp-jp","download_url":"https://codeload.github.com/lycorp-jp/sim-use/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lycorp-jp%2Fsim-use/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36259953,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-08-04T02:00:06.901Z","response_time":57,"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":["accessibility","ai-agents","ai-development","android-emulator","ios-simulator","mobile-automation"],"created_at":"2026-07-15T23:00:22.840Z","updated_at":"2026-08-04T04:00:34.261Z","avatar_url":"https://github.com/lycorp-jp.png","language":"Swift","funding_links":[],"categories":["Swift"],"sub_categories":[],"readme":"# sim-use\n\n[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)\n[![Tests](https://github.com/lycorp-jp/sim-use/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/lycorp-jp/sim-use/actions/workflows/tests.yml)\n\nGive AI agents the ability to observe and act on iOS Simulator and Android emulator / device screens.\n\n**Observe** — turn any screen into a token-efficient outline an LLM can reason about:\n\n```text\n$ sim-use ui\nApp: Settings  402x874\n\n[Top  y\u003c120]\n  @1  StaticText  \"Settings\"\n[Content  y=120..754]\n  @5  SearchField  \"Search\"\n  @7  Button  \"Sign in to your iPhone\"\n  @9  Button  \"General\"\n  @10 Button  \"Display \u0026 Brightness\"\n  @11 Button  \"Wallpaper\"\n  ...\n[Bottom  y\u003e754]\n  @43 TabBar\n```\n\n**Act** — tap any element by its alias, no coordinates needed:\n\n```text\n$ sim-use tap @9\n✓ Tap at (201.0, 452.0) completed successfully\n```\n\nPlan, code, **verify**, ship — teach this CLI to your agent and close the last gap in the agentic mobile development loop. Let agents verify what they built so you can focus on what matters.\n\n`sim-use` is a cross-platform CLI that drives Apple's Accessibility APIs, the iOS Simulator HID pipeline, and Android's AccessibilityService through a single command surface. It emits a compact, agent-friendly screen description (`ui`) and an alias-cached tap shortcut (`tap @N`) so an LLM loop can observe → act in a few hundred milliseconds per round trip.\n\n\n- [The observe → act loop](#the-observe--act-loop)\n- [Why sim-use](#why-sim-use)\n- [Install](#install)\n- [Platforms](#platforms)\n- [Commands](#commands)\n- [Architecture](#architecture)\n- [Viewer](#viewer)\n- [Contributing](#contributing)\n- [Licence](#licence)\n\n\n## The observe → act loop\n\nEvery interaction follows the same cycle — observe, act, verify:\n\n```bash\nsim-use ui                  # 1. read the screen\nsim-use tap @9              # 2. act on what you see\nsim-use ui                  # 3. verify the result\n```\n\nMultiple selector styles for different needs:\n\n| Selector | Example | Best for |\n|---|---|---|\n| `@N` alias | `tap @9` | Speed — cached from last `ui` |\n| `#\u003cid\u003e` | `tap #settingsButton` | Stability — survives layout changes |\n| `--label` | `tap --label \"General\"` | Scripted flows with `--wait-timeout` |\n| `-x -y` / `--point` | `tap --point 100,200` | Last resort — no AX data |\n\nAX-derived selectors work in any orientation — sim-use self-calibrates the\ncurrent rotation on each command (iOS). Explicit `-x/-y`/`--point` is\ninterpreted in the device-native portrait space.\n\n\n## Why sim-use\n\n- **Token-efficient.** The outline representation is ~16x more compact than a raw JSON accessibility tree. An LLM can read and reason about an entire screen in a few hundred tokens.\n- **Nothing hidden.** sim-use walks the full accessibility tree including WebViews, system overlays, and embedded content — no elements are silently skipped. When the frontmost app exposes an empty tree because a remote process owns the visible UI (a system document picker, for example), `ui` automatically retries with cross-process discovery and flags the recovered, flat hierarchy via the `advisory` envelope key.\n- **AI-native.** Designed from day one for agent loops, not human testers. Alias-cached taps (`@N`), structured `--json` envelopes with actionable `hint` fields on errors, and a bundled agent skill (`sim-use init --client claude`) that teaches your AI client the full command surface.\n- **Fast.** A per-device background daemon amortises init cost across calls. After the first command, each observe-act round trip completes in ~300 ms.\n- **Cross-platform.** One command surface drives both iOS Simulator and Android emulator/device. Same verbs, same flags, same `--json` shape — write one agent loop that works on both.\n\n\n## Install\n\n### Homebrew (recommended)\n\n```bash\nbrew tap lycorp-jp/tap\nbrew install lycorp-jp/tap/sim-use\n```\n\nOn Homebrew 6.0.5+, if you see an \"untrusted tap\" error, run `brew trust lycorp-jp/tap` first.\n\n### Build from source\n\nsim-use is a Swift package targeting **macOS 14+**, built with the latest Xcode toolchain. It links against static XCFrameworks built from [Meta's idb](https://github.com/facebook/idb), which are produced locally by the build script (they are large and not checked into the repository). The idb checkout generates its Xcode project with [XcodeGen](https://github.com/yonaskolb/XcodeGen) (`brew install xcodegen`).\n\n```bash\ngit clone https://github.com/lycorp-jp/sim-use.git\ncd sim-use\n\n# Build the required XCFrameworks (first time only)\n./scripts/build.sh dev\n\n# Build sim-use itself\nmake build\n.build/debug/sim-use --help\n\n# Other Makefile targets\nmake test    # run tests\nmake clean\n```\n\nThe XCFrameworks are built without library evolution, so their Swift\nmodules are locked to the toolchain that produced them — re-run\n`./scripts/build.sh dev` after switching Xcode versions.\n\n### Xcode 27 (beta)\n\nXcode 27 betas are fully supported from Beta 4 on (earlier betas ship no\nusable `SimulatorKit.framework`), including simulators booted while\nDevice Hub is open — the HID transport is selected automatically per\nboot. Note that Xcode 27 no longer bundles Simulator.app; the one from an\nXcode 26.x install still works, as does Device Hub itself.\n\n### Agent skill\n\nTo install the bundled agent skill into your AI client's skill directory:\n\n```bash\nsim-use init                        # auto-detect installed clients\nsim-use init --client claude        # non-interactive\nsim-use init --dest ~/.claude/skills\nsim-use init --print                # print skill content without installing\nsim-use init --uninstall --client claude\n```\n\n\n## Platforms\n\nsim-use drives both **iOS Simulators** and **Android devices / emulators** through the same command surface. The device ID shape decides which backend handles the call:\n\n  * `1A2B3C4D-...` (UUID) → iOS Simulator\n  * `emulator-5554` / `R5CT1ABCD12` / `192.168.1.5:5555` → Android device\n\nFor Android, run `sim-use android init --device \u003cserial\u003e` once to install the bridge APK. See `AGENTS.md` for Android toolchain setup.\n\n\n## Commands\n\nAll device-scoped commands accept `--device \u003cID\u003e` (optional when only one simulator is booted). Three command layers:\n\n  * **Top-level** — cross-platform verbs: `ui`, `tap`, `long-press`, `swipe`, `touch`, `multi-touch`, `type`, `paste`, `button`, `gesture`, `keyboard-state`, `screenshot`, `record-video`, `stream-video`, `app-state`. Same flags on iOS and Android.\n  * **`sim-use ios \u003cverb\u003e`** — iOS-only: `key`, `key-combo`, `key-sequence`, `batch`.\n  * **`sim-use android \u003cverb\u003e`** — Android-only: `init`, `devices`, `ping`, `scroll`.\n\nRun `sim-use --help` or `sim-use \u003ccommand\u003e --help` for the full flag set.\n\n```bash\nsim-use devices\nUDID=\"B34FF305-5EA8-412B-943F-1D0371CA17FF\"\n```\n\n### Touch \u0026 gestures\n\n```bash\nsim-use tap @5 --device $UDID                                 # alias from the last `ui`\nsim-use tap \"#3\" --device $UDID                               # 3rd cell of the dominant list (\"#2@2\": 2nd cell, 2nd list)\nsim-use tap \"#settingsButton\" --device $UDID                  # AXUniqueId\nsim-use tap --label \"Safari\" --device $UDID                   # also: --id, --value\nsim-use tap -x 100 -y 200 --device $UDID                      # raw point (or --point 100,200)\n\nsim-use swipe --from 100,300 --to 300,100 --device $UDID      # positional \"100,300 300,100\" works too\nsim-use swipe --from 50,500 --to 350,500 --duration 2.0 --delta 25 --device $UDID\n\n# Low-level touch control\nsim-use touch -x 150 -y 250 --down --device $UDID             # then: touch ... --up\nsim-use touch -x 150 -y 250 --down --up --delay 1.0 --device $UDID   # long press\n\n# Gesture presets\nsim-use gesture scroll-up --device $UDID\nsim-use gesture swipe-from-left-edge --device $UDID\nsim-use gesture scroll-down --pre-delay 0.5 --post-delay 1.0 --device $UDID\n```\n\n`--pre-delay` / `--post-delay` / `--duration` work on `tap`, `swipe`, and `gesture` alike for coarse timing control.\n\nSingle-finger presets (`scroll-*`, `swipe-from-*-edge`) name **visual** directions and are orientation-aware on iOS: their canvas size and rotation are auto-detected per command, so `scroll-up` scrolls the on-screen content up whether the device is portrait, landscape, or upside-down. Explicit `swipe`/`touch` coordinates remain device-native portrait space by default; pass `--coordinate-space ui` to give them in the visual space `ui` prints instead (orientation-calibrated per command; `touch` supports this in the atomic `--down --up` form only). Pinch/rotate presets remain untransformed. On Android the flag is accepted and ignored — display coordinates already rotate with the UI.\n\n### Text input\n\n```bash\nsim-use type 'Hello World!' --device $UDID\necho \"complex text\" | sim-use type --stdin --device $UDID\nsim-use type --file input.txt --device $UDID\n```\n\n### Paste (IME-safe Unicode)\n\n`sim-use paste` writes text to the simulator pasteboard (`simctl pbcopy`) and issues Cmd+V, so characters reach the focused field without going through the keyboard. This bypasses host IME composition (e.g. Japanese kana remapping ASCII keys) and accepts arbitrary Unicode the HID keycode table cannot express (CJK, emoji, diacritics).\n\n```bash\nsim-use paste 'ABC 日本語 🎉' --device $UDID             # at caret\nsim-use paste 'new content' --replace --device $UDID   # Cmd+A + paste\n\nprintf '%s' \"$CONTENT\" | sim-use paste --stdin --device $UDID\nsim-use paste --file body.txt --device $UDID\n```\n\nThe default Cmd+V path needs a connected hardware keyboard on the simulator (Simulator.app: I/O \u003e Keyboard \u003e Connect Hardware Keyboard = ON). Under soft-keyboard-only mode HID Cmd+V is dropped — switch to `--via-menu`, which long-presses the target and taps the iOS edit-menu \"Paste\" button:\n\n```bash\nsim-use paste 'ABC 日本語' --via-menu --target-id chatTextField --device $UDID\nsim-use paste 'at xy' --replace --via-menu --target-x 171 --target-y 513 --device $UDID\n```\n\niOS 16+ gates the first paste per app session behind an \"Allow Paste\" prompt (modal dialog on iOS 16, inline bubble on iOS 17+). sim-use does not auto-dismiss it — approve once interactively (iOS grants a ~60 s grace window for the session) or pre-configure Settings → Paste from Other Apps per app.\n\n### Keyboard state\n\nProbe whether the software keyboard is visible. Primary use: pick between the `paste` Cmd+V default and `--via-menu` path.\n\n```bash\n# Prints `soft` or `hidden` (both exit 0; non-zero = probe failure). Branch on stdout:\nif [[ \"$(sim-use keyboard-state --device $UDID)\" == soft ]]; then\n  sim-use paste \"$TEXT\" --via-menu --target-id chatTextField --device $UDID\nelse\n  sim-use paste \"$TEXT\" --device $UDID\nfi\n\nsim-use keyboard-state --json --device $UDID   # -\u003e {\"ok\":true,\"data\":{\"visible\":true, ...}}\n```\n\n### Hardware buttons\n\n```bash\nsim-use button home --device $UDID\nsim-use button lock --duration 2.0 --device $UDID     # long press\nsim-use button siri --device $UDID\n# Also: side-button, apple-pay\n```\n\n### Low-level keyboard (iOS-only)\n\nThese verbs speak USB HID keycodes, which have no Android counterpart —\nfor Android text entry use `sim-use type` or `sim-use paste`.\n\n```bash\n# Individual key presses by HID keycode\nsim-use ios key 40 --device $UDID                                     # Enter\nsim-use ios key 42 --duration 1.0 --device $UDID                      # hold Backspace\n\n# Sequences and modifier combos\nsim-use ios key-sequence --keycodes 11,8,15,15,18 --device $UDID      # \"hello\"\nsim-use ios key-combo --modifiers 227 --key 4 --device $UDID          # Cmd+A\nsim-use ios key-combo --modifiers 227,225 --key 4 --device $UDID      # Cmd+Shift+A\n```\n\n### Batch chaining (iOS-only)\n\nRun multiple steps in a single invocation. Batch reuses one HID session and one AX snapshot across steps, cutting round-trip cost on multi-step flows (Android steps each round-trip through the bridge already, so batching would save nothing there).\n\n```bash\nsim-use ios batch --device $UDID \\\n  --step \"tap --id SearchField\" \\\n  --step \"type 'hello world'\" \\\n  --step \"key 40\"\n\n# With element waiting — selector taps poll until the element appears\nsim-use ios batch --device $UDID \\\n  --wait-timeout 5 \\\n  --step \"tap --id LoginButton\" \\\n  --step \"tap --id WelcomeMessage\"\n\n# From file (one step per line)\nsim-use ios batch --device $UDID --file steps.txt\n```\n\nKey semantics:\n\n- Exactly one step source per run: `--step`, `--file`, or `--stdin`.\n- Fail-fast by default; `--continue-on-error` switches to best-effort.\n- `--wait-timeout \u003cseconds\u003e` makes selector taps poll for the element to appear — primary mechanism for multi-screen flows.\n- `--ax-cache perBatch` (default) reuses one AX snapshot for the whole run; `--ax-cache perStep` refreshes between steps when the UI changes; `--ax-cache none` disables snapshot reuse entirely. `--wait-timeout` polling always refetches.\n\n### Screenshot\n\n```bash\nsim-use screenshot --device $UDID                                 # auto-named\nsim-use screenshot --output ~/Desktop/shot.png --device $UDID     # specific file\nsim-use screenshot --output ~/Desktop/ --device $UDID             # directory\n```\n\nThe output path goes to stdout; progress messages go to stderr.\n\n### Video streaming \u0026 recording\n\n```bash\n# MJPEG stream (cross-platform)\nsim-use stream-video --device $UDID --fps 10 --format mjpeg \u003e stream.mjpeg\n\n# Pipe into ffmpeg\nsim-use stream-video --device $UDID --fps 30 --format ffmpeg | \\\n  ffmpeg -f image2pipe -framerate 30 -i - -c:v libx264 -preset ultrafast out.mp4\n\n# Native H.264 live stream (Android-only): adb screenrecord passthrough —\n# variable frame rate, cheap, high quality. Preview it live in ffplay:\nsim-use stream-video --device emulator-5554 --format h264 | \\\n  ffplay -f h264 -probesize 32 -fflags nobuffer -\n\n# Record MP4 directly (cross-platform)\nsim-use record-video --device $UDID --output recording.mp4            # 30 fps default\nsim-use record-video --device $UDID --fps 60 --output smooth.mp4      # up to 60 fps\nsim-use record-video --device $UDID --quality 60 --scale 0.5 --output low-bw.mp4\n\n# Record an animated GIF (cross-platform) — auto-plays inline in PRs / issues / chat\nsim-use record-video --device $UDID --output demo.gif                 # format inferred from extension\nsim-use record-video --device $UDID --format gif                      # sim-use-video-\u003ctimestamp\u003e.gif\nsim-use record-video --device $UDID --format gif --fps 15 --scale 0.4 --output demo.gif\n```\n\n`record-video` captures a real H.264 stream and muxes it straight into the\nMP4 (passthrough — no per-frame screenshot re-encoding). iOS records at a\nconstant `--fps` (default 30, max 60); Android records at the device's\nnative variable frame rate (`--fps` ignored, `--quality` → bitrate,\n`--scale` → size) and stitches across the `screenrecord` per-invocation\nlimit on API \u003c 34 automatically. Rotating the display mid-recording stops\ncapture on Android (an MP4 track can't change frame size). Press Ctrl+C to\nstop; sim-use finalises the MP4 before exiting.\n\n`--format gif` (or a `.gif` `--output` extension) records the same H.264\nstream to an intermediate MP4, then transcodes it into a looping GIF once\nrecording stops — sampling at `--fps` (GIF default 10, capped at 50 by the\nformat's centisecond delay floor) and scaling at `--scale` (GIF default\n0.5), since full-rate full-scale GIFs get enormous. Per-frame delays\nfollow the source timestamps, so Android's variable frame rate stays true\nto wall-clock. If the transcode fails, the intermediate MP4 is preserved\nand its path reported, so the footage is never lost. GIF is meant for\nshort clips: the encoder holds every frame in memory until the file is\nwritten, so for sessions beyond a few hundred frames prefer a lower\n`--fps` or `--format mp4`.\n\n### Accessibility inspection\n\n```bash\nsim-use ui --device $UDID                      # compact outline (default)\nsim-use ui --json --device $UDID               # structured envelope\nsim-use ui --json --no-raw --device $UDID      # envelope without the raw tree (much smaller)\nsim-use ui --point 100,200 --device $UDID      # specific point (same UI space as outline frames)\n```\n\nThe `--json` envelope carries the raw accessibility tree under `data.raw` by default; `--no-raw` drops it while keeping `outline` / `entries` / `lists` intact — prefer it in agent loops where the raw tree is only debugging ballast.\n\nThe outline uses region banding (`[Top]` / `[Content]` / `[Bottom]` / declared `Group` regions) and `@N` / `#N` / `#N@M` / `#\u003cid\u003e` alias addressing. When the device is rotated, the `App:` header carries an orientation tag (e.g. `(landscape-right)`) and the `--json` envelope an `orientation` field.\n\nA list cluster detector runs on every snapshot and attaches `#N` aliases to detected list cells — outline lines render as `@N #M` (dominant list) or `@N #M@S` (scope `S\u003e1`). The `--json` envelope adds a `lists` array (one summary per cluster, ordered by detector score, dominant first) and per-cell membership under `entries[*].aliases.list`.\n\n### App state \u0026 crash detection\n\n```bash\nsim-use app-state --device $UDID                              # list running apps\nsim-use app-state --bundle-id com.example.app --device $UDID  # running | not_running\nsim-use app-state --reset --device $UDID                      # re-baseline crash detection\n```\n\nWhile the daemon drives a device, it watches for the target process disappearing between commands and surfaces a banner on the next `ui` call. The signal is process liveness (not foreground identity), so backgrounding for a permission dialog or share sheet never false-fires. On Android, `ui` also detects the AOSP system crash dialog directly from the accessibility tree. Call `app-state --reset` after an intentional relaunch; `SIM_USE_NO_CRASH_DETECT=1` disables detection entirely.\n\n### Daemon\n\nUDID-scoped commands auto-spawn a per-UDID background daemon on first use and reuse it on subsequent calls, amortising FBSimulatorControl / accessibility init (~200 ms per `ui`-shaped call). Scripts do not need to manage the daemon.\n\n```bash\nsim-use daemon status\nsim-use daemon stop --device $UDID\nsim-use daemon stop --all\n\n# Force in-process execution for a single call (diagnostics)\nSIM_USE_NO_DAEMON=1 sim-use ui --device $UDID\n```\n\nDaemons self-exit after 600 s of idle and log to `/tmp/sim-use-\u003cuid\u003e/\u003cUDID\u003e.log`. Streaming commands (`screenshot`, `record-video`, `stream-video`) always run in-process regardless.\n\n\n## Architecture\n\nsim-use drives iOS Simulators through the lower-level XCFrameworks of Facebook's [idb](https://github.com/facebook/idb) (statically linked), Apple's Accessibility APIs, and the simulator HID pipeline. Android devices are driven through an on-device bridge APK that exposes the AccessibilityService tree and input injection over HTTP, tunnelled via `adb forward`. Everything ships as a single binary; every command supports `--json` for machine consumption.\n\n\n## Viewer\n\nA local web app that renders `sim-use ui --json` onto a scaled SVG canvas — see which elements the accessibility tree exposes, spot blind spots, and tap directly from the browser.\n\n```bash\nsim-use viewer\n```\n\nNo Node or npm needed — the SPA is bundled into the binary. Opens your browser automatically. For front-end development on the Viewer itself, see [`Tools/Viewer/README.md`](Tools/Viewer/README.md).\n\n\n## Contributing\n\nSee [`CONTRIBUTING.md`](CONTRIBUTING.md) for development setup, coding conventions, and the DCO sign-off every contribution needs.\n\n\n## Licence\n\nsim-use is licensed under the **Apache License, Version 2.0** — see [`LICENSE`](LICENSE) and [`NOTICE`](NOTICE).\n\nsim-use began as a fork of [`cameroncooke/AXe`](https://github.com/cameroncooke/AXe) (MIT, © 2025 Cameron Cooke), cut from AXe v1.6.0 in April 2026 and substantially modified since. It also links against XCFrameworks built from [Meta's idb](https://github.com/facebook/idb) (MIT). The MIT License of both works permits this Apache-2.0 redistribution; their original notices are reproduced in [`THIRD_PARTY_LICENSES`](THIRD_PARTY_LICENSES).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flycorp-jp%2Fsim-use","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flycorp-jp%2Fsim-use","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flycorp-jp%2Fsim-use/lists"}