Skip to content

boinx/mlController

Repository files navigation

mlController

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.

Features

  • 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

Requirements

  • macOS 13.0 (Ventura) or later
  • mimoLive installed and running (for full functionality)
  • Xcode Command Line Tools or Xcode (for building from source)

Build and Install

Quick Start

# Clone the repository
git clone https://github.com/boinx/mlController.git
cd mlController

# Build, bundle, and install to /Applications
make install

Available Make Targets

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

Distribution (Signed + Notarized)

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 release

This produces a mlController-<version>.dmg ready for distribution.

Building with Xcode

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

Usage

  1. Launch mlController — it appears as an icon in your menu bar
  2. Open the dashboard — click the menu bar icon and select "Open Dashboard", or navigate to http://localhost:8990 in any browser
  3. Control mimoLive — use the dashboard to start/stop mimoLive, open documents, and manage shows
  4. 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
  5. Output Destinations — expand the Outputs section on any open document to see and toggle recording, streaming, NDI, and fullscreen outputs
  6. Zoom Panel — switch to the Zoom tab to access Zoom meeting controls including joining meetings, assigning participants to sources, and managing recording permissions

Network Access

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.

Architecture

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

Key Components

  • AppState — Central state manager, polls mimoLive every 5 seconds and coordinates all services
  • WebServer — Swifter-based HTTP server serving the dashboard and proxying API calls to mimoLive
  • MimoLiveMonitor — Checks if mimoLive is running and queries its HTTP API
  • MimoLiveWebSocket — Subscribes to mimoLive state changes and pushes updates to connected browsers
  • MimoLiveController — Starts, stops, and restarts mimoLive via NSWorkspace

mimoLive API Reference

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.

Using with Claude Code

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.

Key Endpoints

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 documents
  • GET|POST /api/v1/documents/{id}/toggleLive — Start/stop a show
  • GET /api/v1/documents/{id}/layers — List layers
  • GET|POST /api/v1/.../layers/{id}/toggleLive — Toggle a layer on/off
  • PUT /api/v1/.../layers/{id} — Update layer parameters (e.g. lower third text)
  • GET /api/v1/documents — List open documents with metadata
  • GET /api/v1/documents/<id>/output-destinations — List output destinations per document
  • GET /api/v1/documents/<id>/setLive — Start a show
  • GET /api/v1/documents/<id>/setOff — Stop a show
  • GET /api/v1/documents/<id>/output-destinations/<id>/setLive — Start an output destination
  • GET /api/v1/documents/<id>/output-destinations/<id>/setOff — Stop an output destination
  • GET /api/v1/zoom/participants — List Zoom meeting participants
  • PATCH /api/v1/sources/{id} — Assign a Zoom participant to a source
  • ws://localhost:8989/api/v1/socket — WebSocket for real-time state changes

Community

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

License

This project is licensed under the MIT License — see the LICENSE file for details.

About

A controller app for mimoLive that lives in the Menu bar

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors