A terminal UI for launching Android Emulators / iOS Simulators
Launch, connect, manage your devices and more — all from the terminal
Browse your available emulators and simulators side-by-side, launch with custom options and connect to physical devices wirelessly.
SimUtil runs on macOS, Linux, and Windows. iOS Simulator support requires macOS (Xcode / simctl); on Linux and Windows the TUI focuses on Android emulators and devices.
Simutil is written with Nocterm, a terminal UI framework for Dart with similar syntax to Flutter.
- 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 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.
curl -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
dart pub get
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.
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 |
The repository root only holds the workspace pubspec.yaml (Melos scripts), docs, and CI.
git clone https://github.com/dungngminh/simutil.git
cd simutil
dart pub get
dart run melos run cli # CLI locally
dart run melos run check # analyze + test (CI parity)
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


