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), 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.

Credentials are saved to the device and survive reflashing.

Network module docs: NetworkModule · WifiStaModule · WifiApModule · EthernetModule

Network and WiFi test coverage


Option B — Run on PC

Step 1 — Build

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

Step 2 — Run

deploy/build/pc/projectMM

Step 3 — 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