SimUtil
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 is written with Nocterm, a terminal UI framework for Dart with similar syntax to Flutter.
Features
- 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).
Custom Plugins
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 directly
See the full reference — all fields, template variables, run modes, availability probes, shortcuts, examples, and troubleshooting — in docs/plugins.md.
Installation
Binary Install
curl -fsSL https://raw.githubusercontent.com/dungngminh/simutil/main/install.sh | bash
Binary Install (Windows PowerShell)
powershell -ExecutionPolicy Bypass -Command "iwr -useb https://raw.githubusercontent.com/dungngminh/simutil/main/install.ps1 | iex"
Using Homebrew (macOS/Linux)
brew tap dungngminh/simutil
brew install simutil
From pub.dev
dart pub global activate simutil
From source
git clone https://github.com/dungngminh/simutil.git
cd simutil
dart pub get
dart pub global activate --source path .
Then run:
simutil
Supported platforms
xmacOSxLinuxxWindows
Contributing
git clone https://github.com/dungngminh/simutil.git
cd simutil
dart pub get
dart run bin/simutil.dart # Run locally
dart --enable-vm-service bin/simutil.dart # Run with hot reload
- Fork this repository
- Create a branch and make your changes
- Open a Pull Request
License
MIT — see LICENSE
Libraries
- cli/commands/simutil_command
- cli/commands/version_command
- cli/simutil_command_runner
- components/android_launch_dialog
- components/app_header
- components/app_status_bar
- components/device_detail_panel
- components/device_list_component
- components/error_dialog
- components/input_dialog
- components/loading_state
- components/pin_code_fields
- components/show_overlay_dialog
- components/simutil_icons
- components/simutil_theme
- components/success_dialog
- models/adb_connect_result
- models/android_quick_launch_option
- models/app_settings
- models/device
- models/device_os
- models/device_state
- models/device_type
- models/isolate_message
- models/plugin_config
- models/wifi_pairing_device
- models/wireless_connect_request
- models/wireless_pairing_info
- plugins/adb_tools/adb_tools_dialog
- plugins/adb_tools/qr_connect_dialog
- plugins/adb_tools/wireless_pairing/wireless_pairing_dialog
- plugins/logcat/logcat_dialog
- plugins/logcat/logcat_filter_bar
- plugins/logcat/logcat_helper
- services/android_device_service
- services/command_exec
- services/device_service
- services/ios_device_service
- services/isolate_runner
- services/plugin_registry_service
- services/plugin_runner_service
- services/service_locator
- services/settings_service
- services/user_config
- services/wifi_discovery_service
- simutil_app
- utils/constant
- utils/iterable_extension
- utils/string_extension
- utils/version