SimUtil

SimUtil

A terminal UI for launching Android Emulators / iOS Simulators
Launch, connect, manage your devices and more — all from the terminal

SimUtil - Terminal UI for iOS Simulators and Android Emulators | Product Hunt

GitHub Repo stars Build GitHub release

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.

Simutil Showcase

Simutil Showcase Image

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 p to pick a plugin and a command to run on the selected device.
  • Edit Config — Press e to open ~/.simutil/settings.yaml in 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

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 Linux and Windows, the iOS panels indicate they are not supported; Android launch, ADB tools, Logcat, and plugins still work.

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
  1. Fork this repository
  2. Create a branch and make your changes
  3. 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/changelog_dialog
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
components/welcome_dialog
data/changelog_entries
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
plugins/registry/command_menu_dialog
plugins/registry/plugin_menu_dialog
services/android_device_service
services/app_state
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