Launch, stream and control Android Emulators / iOS Simulators
A terminal UI + CLI, and a desktop app for many devices at once
Browse your available emulators and simulators side-by-side, launch with custom options and connect to physical devices wirelessly.
SimUtil comes in two forms:
- CLI / TUI —
simutilin your terminal: launch and shut down devices, ADB wireless tools, Logcat and custom plugins. Built with Nocterm, a terminal UI framework for Dart with similar syntax to Flutter. - Desktop app (preview) — a Flutter app that streams and controls many Android emulators / devices and iOS simulators side by side, records them, runs scenarios across devices, and exposes an MCP server for AI agents. See app/README.md.
Both run on macOS, Linux, and Windows. iOS Simulator support requires macOS (Xcode / simctl); on Linux and Windows they focus on Android emulators and devices.
Screen.Recording.2026-10-11.at.14.51.39.mov
- Multi-device streaming — Stream and control many Android emulators / devices and iOS simulators side by side, in a grid or spotlight layout, with touch, swipe and navigation buttons on every stream.
- Headless devices — Start devices without the emulator window or Simulator app; launch Android emulators with Cold Boot / No Audio from the context menu.
- Slim mode — iOS simulators with background services off use about 1 GB of memory instead of 4 GB.
- Wireless ADB — Connect Android devices over Wi-Fi with a QR code, a pairing code or an IP.
- Recording — Record one device or the whole grid (native, 60 fps on macOS).
- Scenario studio — Write YAML scenarios (tap by label, swipe, type, assertions) and run them on many devices at once, watching each step's status live.
- MCP server for agents — Let Claude Code, Codex, Cursor and others list, start, stream, tap, swipe, screenshot and record devices. See app/README.md.
- No scrcpy install needed — The app ships its own scrcpy server.
- One-Key Launch — Start any device with
Enter, no need to open Android Studio or Xcode - Android Launch Options — Provide launch option for Android Emulators: Normal, Cold Boot, No Audio, or Cold Boot + No Audio,...
- Shutdown device — Shutdown simulators/emulators.
- Logcat — View logcat output of Android emulators / devices, support filtering.
- ADB Tools Built-in — Connect to physical Android devices wirelessly:
- Connect via IP address
- Pair with 6-digit code (Android 11+)
- QR code pairing (Android 11+)
- Custom Plugins — Add your own external tools (scrcpy, Maestro, etc.) via a YAML file, no code changes needed. Press
pto pick a plugin and a command to run on the selected device. - Edit Config — Press
eto open~/.simutil/settings.yamlin your default editor (macOS, Linux, Windows). - Xcode Tools — Press
x(macOS) to clear Xcode Derived Data after a size preview and confirmation.
SimUtil Desktop (preview) streams and controls many Android emulators / devices
and iOS simulators side by side. Installers are on the
releases page (app-v* tags).
macOS (Monterey or later; pulls in adb and ffmpeg). Update Homebrew
first so it sees the latest cask, then tap and install:
brew update
brew tap dungngminh/simutil
brew install --cask simutil-desktopOr download SimUtil-macos.dmg and drag SimUtil into Applications.
Windows: download SimUtil-windows-x64-setup.exe from the
latest desktop release
and run it. The installer also offers to install Android platform-tools and
FFmpeg.
Linux (x86_64 AppImage; installs adb, ffmpeg and FUSE with your package manager, re-run to update):
curl -fsSL https://raw.githubusercontent.com/dungngminh/simutil/main/app/packaging/linux/install.sh | bashcurl -fsSL https://raw.githubusercontent.com/dungngminh/simutil/main/install.sh | bashpowershell -ExecutionPolicy Bypass -Command "iwr -useb https://raw.githubusercontent.com/dungngminh/simutil/main/install.ps1 | iex"brew tap dungngminh/simutil
brew install simutildart pub global activate simutilgit clone https://github.com/dungngminh/simutil.git
cd simutil
flutter pub get # the workspace includes the Flutter desktop app
dart pub global activate --source path packages/simutilThen run:
simutilsimutil checks for a new release at most once a day and shows
Version X available! Run: simutil upgrade. Set SIMUTIL_NO_UPDATE_CHECK=1
to turn it off.
simutil upgrade runs the upgrade for your install method (e.g.
brew upgrade dungngminh/simutil/simutil, dart pub global activate simutil,
or re-running the install script). On Windows, or when running from source, it
prints the command / releases link instead.
SimUtil itself runs on macOS, Linux, and Windows. Feature support depends on the host OS:
| Host OS | Android emulators & devices | iOS simulators & devices |
|---|---|---|
| macOS | Yes | Yes (requires Xcode) |
| Linux | Yes | No |
| Windows | Yes | No |
iOS support depends on Apple’s tools (xcrun simctl for simulators, xcrun devicectl for physical devices), which are only available on macOS. On Xcode 27+, launching a simulator opens DeviceHub.app; earlier Xcode versions still open Simulator.app. On Linux and Windows, the iOS panels indicate they are not supported; Android launch, ADB tools, Logcat, and plugins still work.
With arguments, simutil runs headless commands (no TUI). The TUI starts when you run simutil with no arguments.
simutil -V # print version
simutil upgrade # upgrade to the latest release
simutil android emulator list # AVD names (one per line, like the screenshot)
simutil android device list -r # running adb devices only
simutil list -v # grouped tables (all platforms)
simutil list --json # agent/script friendly
simutil launch <device-id> # boot (alias: start)
simutil launch <id> -c --no-audio # cold boot, no audio (Android)
simutil shutdown <device-id> # shut down (alias: stop)
simutil plugin list # YAML plugins
simutil plugin run scrcpy mirror -d emulator-5554
simutil schema # full CLI JSON schema for agents
simutil schema list --human # readable help for one command
simutil list --help # flags for a command (built-in)Short flags: -a/--android, -i/--ios, -e/--emulator, -p/--physical, -r/--running, -v/--verbose, -j/--json, -c/--cold, -d/--device.
SimUtil can run external shell-command tools (scrcpy, Maestro, custom scripts, …)
defined in the plugins: section of ~/.simutil/settings.yaml — no code changes
needed. A default file (with theme, last_selected_device_id, and scrcpy) is
created automatically on first launch.
Each plugin groups one or more commands. In the app, press p on a selected
device to choose a plugin, then a command. Press e to edit the config file.
A command can also define a single-key shortcut to run it directly. Commands are
filtered to the selected device, and args support template variables like
{device.id} and {device.name}.
# ~/.simutil/settings.yaml
theme: dark
last_selected_device_id: ~
plugins:
- id: scrcpy
label: scrcpy
description: Screen mirroring and control for Android
availability:
command: scrcpy
args: [--version]
commands:
- id: mirror
label: Screen Mirror
command: scrcpy
args: [-s, "{device.id}"]
platforms: [android] # android | ios; empty = any
requires_running: true # only show when the device is running
mode: detached # detached (default) | inherit
shortcut: s # optional single key to run directlySee the full reference — all fields, template variables, run modes, availability probes, shortcuts, examples, and troubleshooting — in docs/plugins.md.
Monorepo (pub workspace); every package is versioned and published separately:
| Package | Contents |
|---|---|
simutil |
The app: simutil executable, TUI and CLI |
simutil_shared |
App layer shared by TUI and GUI: settings, app state, changelog, service wiring |
simutil_core |
Models, CommandExec, DeviceService |
simutil_adb |
AndroidDeviceService, wireless ADB, Logcat parsing |
simutil_apple |
IOSDeviceService, XcodeCacheService |
simutil_plugins |
YAML plugin catalog and runner |
simutil_h264 |
Native H.264 decoding into Flutter textures (desktop app) |
app |
SimUtil desktop (preview): multi-device streaming, MCP server for agents |
The repository root only holds the workspace pubspec.yaml (Melos scripts), docs, and CI.
The workspace includes the Flutter desktop app, so resolving it needs the
Flutter SDK (flutter pub get).
git clone https://github.com/dungngminh/simutil.git
cd simutil
flutter pub get # whole workspace, desktop app included
dart run melos run cli # CLI locally
dart run melos run check # analyze + Dart and Flutter tests
dart run melos run cli_hot_reload # CLI with hot reload- Fork this repository
- Create a branch and make your changes
- Open a Pull Request
MIT — see LICENSE



