Skip to content

Getting Started

This guide takes you from a blank device (or a fresh PC build) to a running projectMM instance with a live LED preview in the browser. No coding required.


What you need

Target Requirements
ESP32 ESP32 classic (D0) or S3 (P4 soon), USB cable, a computer with a browser
PC macOS / Linux / Windows, CMake ≥ 3.16, a C++17 compiler, Git

Option A — Flash an ESP32

Step 1 — Get the firmware

From a release (recommended): download the latest .bin from the GitHub Releases page.

From source: follow the deploy guide then come back here.

Step 2 — Flash

Use ESP Web Tools (Chrome/Edge, no install required) or PlatformIO:

python3 deploy/flashfs.py      # all test:true ESP32 devices
python3 deploy/flashfs.py --wifi  # also inject WiFi credentials

Step 3 — Connect to the device's access point

On first boot, projectMM creates a Wi-Fi access point:

  • SSID: MM-XXXX (last 4 characters of the device MAC address)
  • Password: (none — open AP)

Connect your phone or laptop to this network.

Step 4 — Open the UI

Navigate to http://4.3.2.1 in your browser. You should see the projectMM control panel.

Step 5 — (Optional) Connect to your home Wi-Fi

In the module list, find the WifiStaModule card. Enter your home Wi-Fi SSID and password and press Enter. The device will connect and its IP address will appear in the WifiStaModule status field. You can then connect your browser to that IP instead of the AP.

Once STA is connected, the AP (MM-XXXX) is automatically disabled within 10 seconds. If STA drops for more than 30 seconds, the AP re-opens as a recovery path. Credentials are saved to the device and survive reflashing.

Network module docs: NetworkModule · WifiStaModule · WifiApModule · EthernetModule · Network developer guide

Network and WiFi test coverage


Option B — Run on PC

Step 1 — Download or build

From a nightly release (easiest): download the latest archive from the GitHub nightly release and extract it.

Platform File
macOS projectMM-pc-macos.tar.gz
Windows projectMM-pc-windows.zip

From source:

git clone https://github.com/ewowi/projectMM.git
cd projectMM
uv run deploy/build.py -target pc

The binary is placed at deploy/build/pc/macos/projectMM (macOS/Linux) or deploy/build/pc/windows/projectMM.exe (Windows).

Step 2 — First launch: security warning

Downloaded binaries are unsigned, so the OS will warn you on first run.

macOS: open System Settings, go to Privacy & Security, scroll to the bottom and click Allow Anyway next to the projectMM entry. Alternatively, run in Terminal:

xattr -d com.apple.quarantine projectMM-pc-macos

Windows: when SmartScreen blocks the exe, click More info then Run anyway.

Step 3 — Run

# macOS / Linux (extracted nightly)
./projectMM-pc-macos

# macOS / Linux (built from source)
deploy/build/pc/macos/projectMM

# Windows (extracted nightly)
projectMM-pc-windows.exe

Step 4 — Open the UI

Navigate to http://localhost (port 80) in your browser.


Step 6 — Add your first modules

A freshly booted device starts with an empty module list (or the network modules on ESP32). To see a live preview, add a standard pipeline:

  1. Open the UI and click + (or use the REST API below).
  2. Add a EffectsLayer (id: producer1, width: 16, height: 16).
  3. Add a SineEffectModule (id: sine1, parent: producer1, input layer: producer1).
  4. Add a DriverLayer (id: consumer1, input source: producer1).
  5. Add a PreviewModule (id: preview1, parent: consumer1, input source: consumer1).

Or use the REST API (PC example):

curl -sX POST http://localhost/api/modules -H 'Content-Type: application/json' \
  -d '{"type":"EffectsLayer","id":"producer1","props":{"width":16,"height":16}}'

curl -sX POST http://localhost/api/modules -H 'Content-Type: application/json' \
  -d '{"type":"SineEffectModule","id":"sine1","parent_id":"producer1","inputs":{"layer":"producer1"}}'

curl -sX POST http://localhost/api/modules -H 'Content-Type: application/json' \
  -d '{"type":"DriverLayer","id":"consumer1","props":{"width":16,"height":16},"inputs":{"source":"producer1"}}'

curl -sX POST http://localhost/api/modules -H 'Content-Type: application/json' \
  -d '{"type":"PreviewModule","id":"preview1","parent_id":"consumer1","inputs":{"source":"consumer1"}}'

The configuration is saved automatically to state/modulemanager.json and survives restarts.


Verify live updates

  • Move the frequency slider on the SineEffectModule card — the WebGL preview should update immediately.
  • The WebSocket connection indicator (dot in the top bar) should be green.
  • The device name appears in the top bar (set it in the SystemStatusModule card).

Next steps

  • UI reference — all UI features explained
  • Modules overview — what each module does
  • API reference — REST + WebSocket reference for scripting and integration
  • Deploy guide — build from source, run tests, flash ESP32
  • FAQ — common questions about deployment, platforms, and external libraries