- SimUtil Desktop — stream and control many devices side by side (emulators, simulators, real Android phones and real iPhones / iPads), record them, run scenarios across them, and let AI agents drive them over MCP.
simutilCLI — list, launch and shut down devices, connect over Wi-Fi, read Logcat and run your own tools from scripts or the terminal.- Dart packages — the same device services (
adb,simctl,devicectl) as libraries for your own tooling.
Runs on macOS, Linux and Windows. iOS features need macOS (Xcode). https://github.com/user-attachments/assets/b0463741-6d31-496d-99a8-264a5e69457a
Utilities
Install
SimUtil Desktop
Installers are on the releases page
(app-v* tags). The app updates itself in place from where you installed it.
macOS (Monterey or later; pulls in adb and ffmpeg):
brew update
brew tap dungngminh/simutil
brew install --cask simutil-desktop
Or download SimUtil-macos.dmg and drag SimUtil into Applications.
Windows: run SimUtil-windows-x64-setup.exe from the
latest desktop release.
The installer offers to install Android platform-tools and FFmpeg.
Linux (x86_64 AppImage; installs adb, ffmpeg and FUSE, re-run to update):
curl -fsSL https://raw.githubusercontent.com/dungngminh/simutil/main/app/packaging/linux/install.sh | bash
More, including the MCP tool list: app/README.md.
simutil CLI
# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/dungngminh/simutil/main/install.sh | bash
# Homebrew
brew tap dungngminh/simutil && brew install simutil
# pub.dev
dart pub global activate simutil
Windows (PowerShell):
powershell -ExecutionPolicy Bypass -Command "iwr -useb https://raw.githubusercontent.com/dungngminh/simutil/main/install.ps1 | iex"
simutil upgrade updates it the same way you installed it. simutil checks for
a new release at most once a day; set SIMUTIL_NO_UPDATE_CHECK=1 to turn that off.
CLI usage
simutil list -v # devices on every platform, grouped
simutil list --json # for scripts and agents
simutil launch <device-id> # boot (alias: start)
simutil launch <id> -c --no-audio # cold boot, no audio (Android)
simutil launch <id> --headless # no emulator window / Simulator app
simutil shutdown <device-id> # alias: stop
simutil wipe <device-id> # erase data of a shut-down device (asks y/N)
simutil delete <device-id> -y # delete it; -y skips the prompt
simutil android device list -r # running adb devices only
simutil plugin run scrcpy mirror -d emulator-5554
simutil schema # every command as JSON, for agents
Run simutil with no arguments for an interactive device picker with ADB
tools, Logcat and plugins. simutil <command> --help lists each command's flags.
Plugins
Wire external tools (scrcpy, Maestro, your own scripts) to a device in
~/.simutil/settings.yaml, no code changes needed:
plugins:
- id: scrcpy
label: scrcpy
availability:
command: scrcpy
args: [--version]
commands:
- id: mirror
label: Screen Mirror
command: scrcpy
args: [-s, "{device.id}"]
platforms: [android]
requires_running: true
Full reference: docs/plugins.md.
Supported platforms
iOS support uses Apple's tools (xcrun simctl, xcrun devicectl), which only
exist on macOS. On Xcode 27+, a simulator opens in DeviceHub.app; earlier
versions use Simulator.app.
Packages
Monorepo (pub workspace); each package is versioned and published separately:
Contributing
git clone https://github.com/dungngminh/simutil.git
cd simutil
flutter pub get # whole workspace, desktop app included
dart run melos run check # analyze + Dart and Flutter tests
cd app && flutter run -d macos
Fork, branch, open a Pull Request. Architecture notes: docs/ai/architecture.md.
License
MIT — see LICENSE