MoonLight v6.0.0
38 commits across 7 PRs, and the first release under the new name: projectMM is now MoonLight. Highlights: the repository, the documentation and every download carry the name; a device boots on an effect that shows it hears the room; audio arrives on every device; the scenario suite runs on real hardware, Linux arm64 included; and an update that loses its connection gives up instead of waiting for good.
If you like MoonLight, give it a ⭐️, fork it, or open an issue or pull request. It helps the project grow, improve, and get noticed.
🌗 About the name
This is the first MoonLight release, and it is a rename rather than a rewrite: the same code, the same modules, the same configuration. The repository is MoonModules/MoonLight, the documentation is at moonmodules.org/MoonLight, and the web installer is at moonmodules.org/MoonLight/install. The old addresses redirect.
A device running v5.0.0 updates itself to v6.0.0. It finds the release on its own, because v5.0.0 already knew both addresses, and it accepts the image, because the ESP32 firmware keeps the built-in name a v5 device checks for. Both were tested before this release, on an ESP32-S3 and on a classic ESP32 with MoonBase.
Update to v6.0.0 before any later release. A device refuses firmware whose built-in name it does not know. v6.0.0 accepts both the current name and MoonLight, which is what lets the release after this one ship under the new name. A device that skips v6.0.0 will refuse what comes next.
The predecessor project, the earlier MoonLight, lives on at ewowi/MoonLight.
✨ Highlights
A first boot that shows the room is heard (new)
A device now boots on Pulse: expanding shells from a drifting origin, sparse enough that a single beat is unmistakable, and moving on an idle clock when the room is silent. It is the same code on a strip, a panel and a volume, and costs 250 to 280 us at 16x16 on an S3. Device models describe hardware only, so every model boots on the firmware's own default.
Audio on every device (new)
Audio arrives wired on every device and synthesized by default, so effects react before a microphone is attached to anything. Pick a real source and the choice survives a restart.
Updates that give up instead of hanging (new)
An install that stops receiving data ends after a minute and says so, in the device's own update and in MoonBase. Before, a connection that went quiet without closing left a device on "downloading" until someone cancelled it.
Tested on the hardware it runs on
The scenario suite was rebuilt as one scenario per top-level card, plus what survives a restart, and it runs against live devices: classic ESP32, ESP32-S3, ESP32-S31, ESP32-P4, and for the first time Linux arm64, in a container on a NanoPi. A scenario that asserts nothing now fails, and a skipped one is counted as skipped. Windows is a first-class build host again, with its own scenario run recorded beside macOS.
Drive a device from your own code (new)
A new reference page, Integrating, covers REST, MQTT and WebSocket, with worked examples: add an effect, read and write a MoonLive script, update firmware.
ESP-IDF v6.1
Every ESP32 variant builds against ESP-IDF v6.1, on the bench and in CI.
MoonTube
The documentation clips are a product of their own: each is recorded from a run file that is also a UI test, and each is narrated.
Downloads under the new name
The desktop archives are MoonLight-*, the Debian package is moonlight, the container image is ghcr.io/moonmodules/moonlight, and the web installer flashes every chip MoonLight ships.
🐛 Notable fixes
- A scripted
circlecould hang the render thread at the edge of the 16-bit coordinate range. - The boot wiring dereferenced a module the factory had not made, on a build where that module is compiled out.
- The update fallback address is tried whenever the first request fails, which covers DNS, TLS and an outage as well as a moved repository.
- Ethernet presets on a fresh board: a chip offering exactly one preset opened on Custom, and the preset's pin map never reached its fields, so an erased P4 selected P4-NANO and still booted with no interface.
- Scenario observations were overwritten across machines: desktop figures are keyed per host, so macOS, Windows and Linux sit side by side.
⚠️ Breaking changes
Four entries, each with the action it asks of you, are in MIGRATING. A device updated over the air keeps its configuration. What changes:
- The desktop settings folder is named
MoonLight, so the app starts on defaults: copy the oldprojectMMfolder across, and uninstall projectMM first, since both answer on port 8080. - The Debian package is
moonlightand the container image isghcr.io/moonmodules/moonlight: remove the old package, and copy/data/projectMMto/data/MoonLightinside an existing volume. - The MQTT topic root is
MoonLight/<last6-of-MAC>, so a subscription on the old root stops matching and Home Assistant shows a new entity. - Audio modes are reordered, so a configured Audio source is set again.
Backup before upgrading. The File Manager's Backup carries configuration across every one of these, converting what it can and reporting what it cannot.


