Skip to content

The macOS App

MultiDocker ships with a native SwiftUI app for macOS 13+. It’s a graphical front-end over the same engine the CLI uses — not a re-implementation. Every action in the app shells out to the mdocker binary and decodes its --json output.

The MultiDocker main window: project list on the left, and the selected project’s health, git, hostnames and routing cards on the right.

The app also lives in the menu bar. The popover gives you every project’s state and a toggle to start or stop it, without bringing the main window forward:

The MultiDocker menu bar popover: three projects with status dots, hostnames and start/stop toggles.

The app wraps the CLI through Swift’s Process API. When you click “Start” on a project, it runs mdocker up <name>; when it renders the project list, it parses mdocker ls --json. This means:

  • The app and CLI can never drift in behaviour — there’s one implementation of every verb.
  • Anything the app does, you can reproduce (and script) on the command line.
  • The app adds presentation and orchestration on top: a sidebar, live health cards, embedded terminals, a profile editor, and a first-run wizard.

The app follows an MVVM + dependency-injection structure:

View ──► ViewModel ──► Service ──► ProcessRunner ──► mdocker
└──► Storage (preferences, logs, wizard state)
  • Views are dumb — they observe @Published state and send actions upward.
  • ViewModels own feature state and orchestrate service calls.
  • MdockerService is the umbrella service (~80 methods) that wraps every CLI verb, decodes models, and tracks in-flight actions for progress UI.
  • ProcessRunner is the single place that creates Process instances, with PATH augmentation (so it finds brew-installed tools) and a SIGTERM→SIGKILL timeout.

All services and view models are @MainActor, so UI updates are always thread-safe.

Area What it shows
Sidebar Registered projects, expandable to their AI/terminal sessions; a footer entry opens the global profile editor.
Detail pane Per-project hero card plus health, Shopware, git, hosts, share, services, database and session cards.
Toolbar / menubar A Doctor button, refresh, settings, and an EDGE badge that turns red when the edge stack is down.
Console A collapsible bottom console showing every command the app ran, its output and exit code.

The app is optional. You can run everything from the terminal with mdocker. But the app adds real value for day-to-day use: at-a-glance health, one-click start/stop, embedded terminals that survive quitting the app, and a live profile editor with validation.