MoonLight Overview
▶️ Watch the functional overview
MoonLight is open-source software that lets you control a wide range of DMX and LED lights using ESP32 microcontrollers — for home use, art installations, and professional stages.
What's inside MoonLight
MoonLight is organised into modules, each covering a specific area of functionality:
| Module | What it does |
|---|---|
| Lights Control | Global brightness, colour, presets and external control (DMX, IR, Home Assistant) |
| Effects | Visual effects and modifiers that run on virtual layers |
| Drivers | Layouts and drivers that send data to physical lights |
| Channels | Live monitor of the raw channel data going to your lights |
| Live Scripts | Write and run custom effects directly on the device |
| MoonLight Info | Firmware build info and system diagnostics |
About MoonModules
MoonLight is created by MoonModules — a collective of light artists, hardware and software developers who love building DIY lighting solutions based on ESP32. You can find our work on GitHub and reach us on Discord.
We develop our products for a large community of light enthusiasts and show them at art exhibitions, in venues, and at festivals. See also about MoonModules.
We started creating WLED-MM, a fork of WLED focused on driving more LEDs, supporting new platforms (e.g. ESP32-P4), and better audio. As most of the MoonModules team are also core WLED developers, WLED-MM functionality is gradually moving back into WLED.
Starting in 2023 we began building MoonLight — a modern alternative to WLED with a reactive UI, 1D/2D/3D layout support, live scripts and flexible LED drivers.
Why build MoonLight when WLED already exists?
| Pain point | How MoonLight addresses it |
|---|---|
| Complex UI — two separate UI systems, hard to extend | Single reactive SvelteKit UI, fully generic module rendering |
| ESP8266 legacy — constrains the codebase | ESP32-only, no legacy baggage |
| Outdated libraries — ArduinoJson, FastLED, ESP-IDF | Philosophy: keep dependencies up to date |
| 1D/2D effects only — lots of hardcoding | 3D at the core; effects don't know fixture size |
| Strip/panel mapping — no 3D, hacks for rings/hexagons | Inverse mapping: just define LED coordinates |
| Accumulated tech debt — hard to maintain audio-reactive | Clean architecture with Node-based isolation |
| Too large to change — deep architectural changes are nearly impossible | Built from scratch with extensibility in mind |
What I love most about WLED and wanted to keep: UserMods ❤️ — small, isolated, opt-in code pieces each with their own UI. That idea evolved into MoonLight's Nodes class: self-contained objects that initialise, run, expose controls, and clean up after themselves.
Current status
As of late 2025 MoonLight's foundation is solidly in place.
Earlier releases involved major structural changes that sometimes required fresh installs. Future updates should generally be seamless, though major version upgrades may still include exceptions.
MoonBase is now a flexible IoT foundation you can use independently of lights. MoonLight is a ready-to-use lighting application built on top of it.
That doesn't mean the work is done — this is just the beginning. MoonLight is open for collaboration. You're warmly invited to help shape its future; see the Develop pages to get started.
What's been done
MoonBase
- ESP32-SvelteKit foundation (SvelteKit UI, PsychicHttp, Stateful services, Event Sockets, RESTful API, mDNS, MQTT)
- Modules: generic building blocks for server + UI functionality activated via a JSON definition
- Nodes 🥜: generic building blocks that run code and expose controls in the UI
- Utilities: system logging, 3D coordinate system, string and memory management
- MoonBase features: Connections, WiFi, System, Files, Tasks, Devices, IO
- ESP32-P4 support
- Ethernet
- Specific board profiles; see Premade boards
MoonLight
- Layers: physical and virtual layers; physical layer manages real LEDs/lights via layouts and drivers; virtual layers run effects and modifiers
- Control, Channels and Info
- Effects & Modifiers
- Layouts & Drivers — FastLED, parallel LED driver, DMX, Art-Net, DDP, E1.31, WLED Audio Sync
- Live Scripts (already in MoonLight, planned for MoonBase)
- Multiple layers
- DMX / Network In (Art-Net, DDP, E1.31)
- Palettes: more options, custom, audio-reactive
Looking ahead
MoonBase
- MIDI (light control desks)
- SuperSync 🥜 — distributed effects across multiple devices
- HA / MQTT improvements
MoonLight
- Virtual driver
- More effects (FastLED, Animartrix, Physics, Live Scripts)
Where you can help
- Add effects (FastLED, WLED, particle systems, Animartrix, Soulmate Lights…), modifiers, layouts and drivers
- Improve the UI (Svelte 5, DaisyUI 5, Tailwind 4) — File Manager, multi-row layout, Monitor (WebGL)
- Tune FastLED, add FastLED 2D effects
- CI automation
Come say hi in the MoonLight channels on Discord MoonModules 👋
Emoji key
Effects, Modifiers, Layouts and Drivers use emojis to show their capabilities at a glance:
| Emoji | Meaning |
|---|---|
| 🔥 | Effect |
| 🐙 | WLED origin |
| 💫 | MoonLight origin |
| ⚡️ | FastLED origin |
| 🚨 | Moving head — colour effect |
| 🗼 | Moving head — move effect |
| 💎 | Modifier |
| 🚥 | Layout |
| ☸️ | Driver |
| ♫ | Audio-reactive (FFT-based) |
| ♪ | Audio-reactive (volume-based) |
| 💡 | Supports 0D and up |
| 📏 | Supports 1D and up |
| 🟦 | Supports 2D and up |
| 🧊 | Supports 3D |
Reporting issues
Found a bug or want to request a feature?
Checklist
- Search existing issues first — your issue may already be reported
- For bugs, include the module API output (see below)
- For feature requests, describe the use case
Bug report template
See A github issue for an example.
1. Describe the problem
Steps to reproduce:
1. ...
2. ...
Expected behavior:
[What should happen]
Actual behavior:
[What happens instead]
2. Attach module API outputs
The API output is a JSON snapshot of your device state — ⚠️ this is the most useful diagnostic data!
Get the API output:
- Open the affected module in the MoonLight UI (e.g. Effects, Drivers)
- Click the API icon (↔) at the bottom-right of the module card
- Copy the entire JSON, paste it in your issue in a code block
Include the following API output:
- Always: System status
- If lights related: MoonLight Info
- If pins related: Board preset
- If drivers related: Drivers
-
Affected module, e.g.:
use ```text to have all the output on one line to avoid very long issue texts like this:
API output:
- System status
```text
{"esp_platform":"ESP32-S3","firmware_version":"0.9.1","firmware_date":"20260406","firmware_target":"esp32-s3-n8r8v","platform_version":"pioarduino-55.03.37","ma...}
```
- MoonLight info
```text
{"nrOfLights":256,"channelsPerLight":3,"nrOfChannels":768,"size":{"x":16,"y":16,"z":1},"nodes#":2,"layers":...}
```
- Module IO Board preset
```text
{"boardPreset":"LightCrafter16","modded":false,"maxPower":500,"pins":...}
```
- Module Drivers
```text
{"nodes":[{"name":"Panel â¹ï¸ 🚥","on":true,"controls":[{"name":"panelWidth","value":16,"default":16,"p":1009379704,"type":"number","valid":true,"min":1,"max":65536,"size":16},]}]...}
```
3. Ask for analysis (optional)
Add a comment to your issue:
CodeRabbit will analyze the logs and suggest a fix.
Feature requests
Describe the use case, expected behaviour, and alternatives you've considered.