A macOS menu bar app that monitors and remotely controls mimoLive — the professional live streaming and video production software by Boinx Software.
mlController sits in your menu bar and provides a web-based dashboard (port 8990) for managing mimoLive from any browser on your local network. It serves as both a practical tool and a reference implementation for building custom control interfaces using the mimoLive HTTP API.
- Menu Bar Status — See at a glance whether mimoLive is running, with quick controls to start, stop, or restart it
- Web Dashboard — Browser-based control panel accessible from any device on your network at
http://<your-mac>:8990 - Document Management — Open mimoLive documents (
.tvshow/.mls) from the dashboard, with a list of local files found in~/Documents - Show Control — Start and stop shows with a single button, with a live-updating timer and tags showing which outputs are tied to the show
- Output Destinations — View and toggle output destinations (recording, streaming, NDI, fullscreen) per document with real-time status
- Document Metadata — See resolution, frame rate, source count, and layer count for each open document at a glance
- Zoom Meeting Control — Join and leave Zoom meetings through mimoLive, assign participants to video sources, and request recording permissions
- Real-Time Updates — WebSocket connection pushes state changes to the browser instantly, with polling as a fallback
- Universal Binary — Runs natively on both Apple Silicon and Intel Macs
- macOS 13.0 (Ventura) or later
- mimoLive installed and running (for full functionality)
- Xcode Command Line Tools or Xcode (for building from source)
# Clone the repository
git clone https://github.com/boinx/mlController.git
cd mlController
# Build, bundle, and install to /Applications
make install| Command | Description |
|---|---|
make build |
Compile the universal binary with Swift Package Manager |
make bundle |
Build and assemble the .app bundle (ad-hoc signed) |
make install |
Build, bundle, and copy to /Applications |
make run |
Build and launch the app |
make install-login-agent |
Install a LaunchAgent so mlController starts at login |
make uninstall-login-agent |
Remove the login LaunchAgent |
make clean |
Remove all build artifacts |
For distributing to other users, use the release pipeline which signs with a Developer ID certificate and notarizes with Apple:
# One-time setup: store notarization credentials in the keychain
make setup-notarization
# Build, sign, notarize, and create a DMG
make releaseThis produces a mlController-<version>.dmg ready for distribution.
The project includes an Xcode project generated by XcodeGen. To regenerate it after making changes to project.yml:
brew install xcodegen
xcodegen generate
open mlController.xcodeproj- Launch mlController — it appears as an icon in your menu bar
- Open the dashboard — click the menu bar icon and select "Open Dashboard", or navigate to
http://localhost:8990in any browser - Control mimoLive — use the dashboard to start/stop mimoLive, open documents, and manage shows
- Show Control — start or stop a show directly from the dashboard; the live timer counts up in real time and shows which outputs are affected
- Output Destinations — expand the Outputs section on any open document to see and toggle recording, streaming, NDI, and fullscreen outputs
- Zoom Panel — switch to the Zoom tab to access Zoom meeting controls including joining meetings, assigning participants to sources, and managing recording permissions
The web dashboard listens on port 8990 and is accessible from other devices on your local network. This is useful for controlling mimoLive from a phone or tablet during a live production.
mlController is built with Swift and SwiftUI, using a lightweight embedded HTTP server (Swifter) to serve the web dashboard. It communicates with mimoLive through its local HTTP API on port 8989.
┌─────────────────┐ ┌──────────────┐ ┌──────────┐
│ Web Browser │──────▶│ mlController │──────▶│ mimoLive │
│ (port 8990) │◀──────│ (menu bar) │◀──────│ (8989) │
└─────────────────┘ HTTP └──────────────┘ HTTP └──────────┘
+ WS │
SwiftUI popover
AppState— Central state manager, polls mimoLive every 5 seconds and coordinates all servicesWebServer— Swifter-based HTTP server serving the dashboard and proxying API calls to mimoLiveMimoLiveMonitor— Checks if mimoLive is running and queries its HTTP APIMimoLiveWebSocket— Subscribes to mimoLive state changes and pushes updates to connected browsersMimoLiveController— Starts, stops, and restarts mimoLive via NSWorkspace
The mimoLive API Reference is a comprehensive guide covering the full HTTP API (port 8989) and the mlController proxy API (port 8990). It documents every endpoint, response format, WebSocket protocol, Zoom meeting control, and common recipes with working examples.
The reference is designed to be used with AI coding assistants like Claude — drop mimoLive-API.md into your project or conversation context and Claude will know exactly how to write correct mimoLive API calls.
If you're using Claude Code, the included /mimolive slash command loads the full API reference automatically:
/mimolive help me toggle the lower third layer on and off
To use the API reference in your own project, copy mimoLive-API.md into your project's .claude/ directory or reference it in your CLAUDE.md.
The official mimoLive HTTP API is documented at mimolive.com/user-manual/remote-control-automation/http-api. Some key endpoints:
GET /api/v1/documents— List open documentsGET|POST /api/v1/documents/{id}/toggleLive— Start/stop a showGET /api/v1/documents/{id}/layers— List layersGET|POST /api/v1/.../layers/{id}/toggleLive— Toggle a layer on/offPUT /api/v1/.../layers/{id}— Update layer parameters (e.g. lower third text)GET /api/v1/documents— List open documents with metadataGET /api/v1/documents/<id>/output-destinations— List output destinations per documentGET /api/v1/documents/<id>/setLive— Start a showGET /api/v1/documents/<id>/setOff— Stop a showGET /api/v1/documents/<id>/output-destinations/<id>/setLive— Start an output destinationGET /api/v1/documents/<id>/output-destinations/<id>/setOff— Stop an output destinationGET /api/v1/zoom/participants— List Zoom meeting participantsPATCH /api/v1/sources/{id}— Assign a Zoom participant to a sourcews://localhost:8989/api/v1/socket— WebSocket for real-time state changes
Have questions, ideas, or want to share what you've built with the mimoLive API?
Join the mimoLive Experts community on Discord:
Join the Discord · #mlcontroller channel
This project is licensed under the MIT License — see the LICENSE file for details.