Skip to content

Commit f4292bb

Browse files
authored
Merge pull request #142 from MoonModules/next-iteration
Help in the app from the headers, and every catalog a card deck
2 parents 41eb323 + aeb24f1 commit f4292bb

467 files changed

Lines changed: 13148 additions & 13122 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/release.yml‎

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,10 @@ jobs:
615615
dist/MoonLight-control-surface.json
616616
ls -la dist/MoonLight-control-surface.json
617617
618+
# The module help this release's app shows, so a device reads the help of the firmware it runs: a newer file names controls it lacks. deploy-pages mirrors it beside the release's binaries, where the device's page can read it.
619+
- name: Stage the module help
620+
run: cp docs/help/help.json dist/MoonLight-help.json
621+
618622
- name: Resolve effective tag
619623
id: tag
620624
env:
@@ -743,6 +747,7 @@ jobs:
743747
dist/MoonLight-*.tar.gz
744748
dist/MoonLight-*.zip
745749
dist/MoonLight-control-surface.json
750+
dist/MoonLight-help.json
746751
dist/MoonLight-*.dmg
747752
dist/MoonLight-*-setup.exe
748753
dist/moonlight_*.deb
@@ -950,6 +955,7 @@ jobs:
950955
--pattern 'manifest-*.json' \
951956
--pattern 'MoonLight-*.tar.gz' \
952957
--pattern 'MoonLight-*.zip' \
958+
--pattern 'MoonLight-help.json' \
953959
--pattern 'MoonLight-*.dmg' \
954960
--pattern 'moonlight_*.deb' \
955961
|| echo " (skip $T — no matching assets)"
@@ -991,23 +997,6 @@ jobs:
991997
done
992998
ls -la pages/ pages/install/
993999
994-
# gen_api.py runs Doxygen -> moxygen to generate the per-module technical pages
995-
# (moonmodules/{core,light}/moxygen/*.md) from each `.h`'s /// comments at
996-
# MkDocs-build time. moxygen runs via `npx moxygen@2.1.10`, so Node must be
997-
# present; pin it explicitly (rather than lean on the runner image's default) so
998-
# a future image change can't silently drop npx or shift its behavior. Doxygen
999-
# is the one apt binary we add — the justified non-uv dependency (like ESP-IDF's
1000-
# Python). With the tools present, a moxygen/doxygen failure now RAISES (gen_api
1001-
# GenApiError) and fails this build, rather than shipping a site with no API pages.
1002-
- name: Set up Node (for npx moxygen)
1003-
uses: actions/setup-node@v4
1004-
with:
1005-
node-version: '20'
1006-
- name: Install Doxygen (source-generated API pages)
1007-
run: |
1008-
set -euo pipefail
1009-
sudo apt-get update && sudo apt-get install -y doxygen
1010-
10111000
- name: Build docs site into Pages root
10121001
run: |
10131002
set -euo pipefail

‎.gitignore‎

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,6 @@ __pycache__/
136136
# (the CLI generate_test_docs.py can still write them locally, but they are not committed).
137137
/docs/reference/tests/*.md
138138

139-
# Generated per-module technical pages — Doxygen+moxygen from each `.h`, built into
140-
# the site by moondeck/docs/mkdocs_hooks.py (via gen_api.py). Regenerated every build.
141-
/docs/moonmodules/core/moxygen/
142-
/docs/moonmodules/light/moxygen/
143-
/docs/moonmodules/platform/moxygen/
144139

145140
# Read-only hardware snapshots (flash/NVS dumps pulled off reverse-engineered boards).
146141
# Root-anchored + dir-scoped, like /build/ above: a bare `.snapshots` would also swallow any

‎.vale.ini‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ BasedOnStyles =
5656
BasedOnStyles =
5757
[docs/tests/*.md]
5858
BasedOnStyles =
59-
[docs/moonmodules/**/moxygen/*.md]
60-
BasedOnStyles =
6159

6260
# CLOSING THE NET. A page the sweep has finished is held to every rule on the whole file: a
6361
# suggestion becomes an error there, so a regression fails the gate instead of annotating a PR.

‎CLAUDE.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ The rules that bind every change. What the system is: [README.md](README.md). Ho
44

55
A high-performance system driving large LED installations and DMX fixtures. One source tree drives ESP32, Teensy, Raspberry Pi, macOS, Windows and Linux.
66

7-
**Read on every task**: this file. **Read when the task touches them**: the architecture, the two standards pages, and the spec of the module being changed. Everything else is linked from where it applies.
7+
**Read on every task**: this file. **Read when the task touches them**: the architecture, the two standards pages, and the header of the module being changed. Everything else is linked from where it applies.
88

99
## Principles
1010

@@ -130,7 +130,7 @@ flowchart TB
130130

131131
Keep each commit under ~100 changed files: CodeRabbit reviews the files a pushed commit changes, and past that the commit silently loses a review layer. A mechanical sweep (em-dashes, a metrics refresh) is a commit of its own, apart from behavioral fixes, so both stay reviewable.
132132

133-
**A contributed pull request is one topic, about 400 changed lines and ten files at most**, tests included. Generated files (metrics, images, scenario observations) are a category of their own, outside the count. Past a few hundred lines a review stops catching defects (the SmartBear and Cisco review study; Google's guide on small changes), and the product owner reviews every line. Every pull request is based on main. The one exception is a step of a larger topic, which lands as its own pull request and may build on the step below it. A stacked pull request from a fork shows its parents, so it is reviewed once the one below it merges.
133+
**A contributed pull request is one topic, max 400 changed lines and ten files**, tests included. Generated files (metrics, images, scenario observations) are a category of their own, outside the count. Past a few hundred lines a review stops catching defects (the SmartBear and Cisco review study; Google's guide on small changes), and the product owner reviews every line. Every pull request is based on main. The one exception is a step of a larger topic, which lands as its own pull request and may build on the step below it. A stacked pull request from a fork shows its parents, so it is reviewed once the one below it merges.
134134

135135
### Build and test
136136

@@ -173,7 +173,7 @@ New behavior is pinned before it ships: a unit test for module logic, a scenario
173173

174174
### Document
175175

176-
Docs land with the code: the module's spec and catalog card describe what shipped, a breaking change gets its [MIGRATING](docs/reference/MIGRATING.md) entry, and a shipped backlog item or spec draft is deleted. The merge gate verifies this happened. How the writing looks and how much of it there is: [documentation-standards.md](docs/contributing/documentation-standards.md), which is the one home for all of it.
176+
Docs land with the code: the module's header describes what shipped, a breaking change gets its [MIGRATING](docs/reference/MIGRATING.md) entry, and a shipped backlog item or spec draft is deleted. The merge gate verifies this happened. How the writing looks and how much of it there is: [documentation-standards.md](docs/contributing/documentation-standards.md), which is the one home for all of it.
177177

178178
### Commit
179179

‎CMakeLists.txt‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,13 @@ add_custom_target(build_info_gen ALL
251251
# (no semicolons on the command line — those would either get split by `make`
252252
# on POSIX hosts or land as literals in the value on MSBuild) and let
253253
# embed_ui.cmake assemble the `<uv> run python` list internally.
254+
# Every UI file, by glob, so a file added to src/ui re-embeds without a second edit here: the hand-kept list had already missed migrate.js, semver.js and preview-adapt.js.
255+
file(GLOB UI_SOURCES CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/src/ui/*.js ${CMAKE_SOURCE_DIR}/src/ui/*.html
256+
${CMAKE_SOURCE_DIR}/src/ui/*.css ${CMAKE_SOURCE_DIR}/src/ui/*.png ${CMAKE_SOURCE_DIR}/src/ui/vendor/*.js)
254257
add_custom_command(
255258
OUTPUT ${CMAKE_SOURCE_DIR}/src/ui/ui_embedded.h
256259
COMMAND ${CMAKE_COMMAND} -DUI_DIR=${CMAKE_SOURCE_DIR}/src/ui -DOUT=${CMAKE_SOURCE_DIR}/src/ui/ui_embedded.h -DUV_EXECUTABLE=${UV_EXECUTABLE} -P ${CMAKE_SOURCE_DIR}/src/ui/embed_ui.cmake
257-
DEPENDS ${CMAKE_SOURCE_DIR}/src/ui/index.html ${CMAKE_SOURCE_DIR}/src/ui/app.js ${CMAKE_SOURCE_DIR}/src/ui/style.css ${CMAKE_SOURCE_DIR}/src/ui/install-picker.js ${CMAKE_SOURCE_DIR}/src/ui/vendor/prism.js ${CMAKE_SOURCE_DIR}/src/ui/preview3d.js ${CMAKE_SOURCE_DIR}/src/ui/moonmodules-logo.png ${CMAKE_SOURCE_DIR}/src/ui/embed_ui.cmake
260+
DEPENDS ${UI_SOURCES} ${CMAKE_SOURCE_DIR}/src/ui/embed_ui.cmake
258261
COMMENT "Embedding UI files"
259262
)
260263
add_custom_target(ui_embed DEPENDS ${CMAKE_SOURCE_DIR}/src/ui/ui_embedded.h)

‎README.md‎

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ If you like MoonLight, give it a star, fork it, or open an issue. It helps the p
2828

2929
🎵 **Audio-reactive**: an I²S microphone drives a 16-band FFT spectrum and sound level.
3030

31-
🏠 **Home automation**: a device joins Homebridge and any MQTT hub for on/off, brightness and color. See [the MQTT module](docs/moonmodules/core/services.md#mqtt).
31+
🏠 **Home automation**: a device joins Homebridge and any MQTT hub for on/off, brightness and color. See [the MQTT module](https://moonmodules.org/MoonLight/moonmodules/core/system.html#mqtt).
3232

33-
📁 **On-device file manager**: browse and edit the device filesystem from the browser, with drag-drop upload and [firmware update over the LAN](docs/moonmodules/core/services.md#firmware-update).
33+
📁 **On-device file manager**: browse and edit the device filesystem from the browser, with drag-drop upload and [firmware update over the LAN](https://moonmodules.org/MoonLight/moonmodules/core/system.html#firmware-update).
3434

3535
🛡️ **Robust to any input**: add, delete, replace or reconfigure any module in any order, at any grid size, and the device keeps running. Every crash found becomes a regression test.
3636

@@ -94,35 +94,35 @@ The domain-neutral runtime: the module base class, controls, scheduling, persist
9494

9595
![The Services card, built from declared controls](docs/assets/core/Services.png)
9696

97-
Architecture: [MoonCore](docs/explanation/architecture/mooncore.md) · [MoonModule](docs/explanation/architecture/moonmodule.md) · Use it: [System](docs/moonmodules/core/system.md) · [Control](docs/moonmodules/core/system.md#control) · [Services](docs/moonmodules/core/services.md)
97+
Architecture: [MoonCore](docs/explanation/architecture/mooncore.md) · [MoonModule](docs/explanation/architecture/moonmodule.md) · Use it: [System](https://moonmodules.org/MoonLight/moonmodules/core/system.html) · [Control](https://moonmodules.org/MoonLight/moonmodules/core/system.html#control) · [Services](https://moonmodules.org/MoonLight/moonmodules/core/services.html)
9898

9999
### MoonLight
100100

101101
The light domain, and the bigger half of the code: light values, layouts, layers, mapping, blending, effects, modifiers and LED drivers. This is what you build a light show from, stacking a layout, then layers of effects and modifiers, then a driver.
102102

103103
![The Layers panel: a layer, an effect, and its controls](docs/assets/light/Effects.png)
104104

105-
Architecture: [MoonLight](docs/explanation/architecture/moonlight.md) · Use it: [Effects](docs/moonmodules/light/effects.md) · [Layouts](docs/moonmodules/light/layouts.md) · [Modifiers](docs/moonmodules/light/modifiers.md) · [Drivers](docs/moonmodules/light/drivers.md)
105+
Architecture: [MoonLight](docs/explanation/architecture/moonlight.md) · Use it: [Effects](https://moonmodules.org/MoonLight/moonmodules/light/effects.html) · [Layouts](https://moonmodules.org/MoonLight/moonmodules/light/layouts.html) · [Modifiers](https://moonmodules.org/MoonLight/moonmodules/light/modifiers.html) · [Drivers](https://moonmodules.org/MoonLight/moonmodules/light/drivers.html)
106106

107107
### MoonLive
108108

109109
Scripts compiled to native machine code on the device. Write an effect in the browser, and it runs at the speed of compiled code rather than an interpreter, on ESP32 and on the desktop alike.
110110

111111
![A MoonLive effect running](docs/assets/light/effects/MoonLiveEffect.gif)
112112

113-
Architecture: [MoonLive](docs/explanation/architecture/moonlive.md) · Use it: [MoonLiveEffect](docs/moonmodules/light/moonlive.md) · [the script language](moonlive/README.md)
113+
Architecture: [MoonLive](docs/explanation/architecture/moonlive.md) · Use it: [MoonLiveEffect](https://moonmodules.org/MoonLight/moonmodules/light/moonlive.html) · [the script language](moonlive/README.md)
114114

115115
### MoonI80
116116

117-
Our own DMA driver for parallel WS2812 output, one of the backends [ParallelLedDriver](docs/moonmodules/light/drivers.md#parallelled) selects. It adds a streaming ring and 74HCT595 expander support, which is what drives 12,288 lights from a single board.
117+
Our own DMA driver for parallel WS2812 output, one of the backends [ParallelLedDriver](https://moonmodules.org/MoonLight/moonmodules/light/drivers.html#parallelled) selects. It adds a streaming ring and 74HCT595 expander support, which is what drives 12,288 lights from a single board.
118118

119-
Architecture: [MoonLight drivers](docs/explanation/architecture/moonlight.md#drivers) · Use it: [LED drivers](docs/moonmodules/light/drivers.md#moonled)
119+
Architecture: [MoonLight drivers](docs/explanation/architecture/moonlight.md#drivers) · Use it: [LED drivers](https://moonmodules.org/MoonLight/moonmodules/light/drivers.html#parallelled)
120120

121121
### MoonBase
122122

123123
A small maintenance image in the factory slot that installs updates into one large app slot, instead of spending half the flash on a second copy of the firmware. A power cut mid-update lands back in MoonBase rather than a half-written app.
124124

125-
Architecture: [MoonBase](docs/explanation/architecture/moonbase.md) · Use it: [System modules](docs/moonmodules/core/system.md)
125+
Architecture: [MoonBase](docs/explanation/architecture/moonbase.md) · Use it: [System modules](https://moonmodules.org/MoonLight/moonmodules/core/system.html)
126126

127127
### MoonCloud
128128

@@ -213,21 +213,7 @@ We built and maintained these, so MoonLight rests on our own hands-on experience
213213

214214
## Credits
215215

216-
People whose work directly shaped parts of MoonLight. We study their thinking with respect and write our own code against our architecture:
217-
218-
- **[WLED](https://github.com/wled/WLED) and [WLED-MM](https://github.com/MoonModules/WLED)**: MoonLight is born out of WLED and takes the usermod idea further, where everything is a module. A MoonLight device also acts as a WLED device and talks to WLED devices.
219-
- **Frank ([softhack007](https://github.com/softhack007))**: main author of the WLED-MM audio-reactive usermod. The ideas behind [AudioService](docs/moonmodules/core/moxygen/AudioService.md), including the adaptive noise gate analyzed with his permission, descend from years of collaboration.
220-
- **[troyhacks](https://github.com/troyhacks/WLED)**: reworked the WLED-MM audio DSP onto Espressif's [esp-dsp](https://github.com/espressif/esp-dsp) FFT, the same choice AudioService makes.
221-
- **[Stefan Petrick](https://github.com/StefanPetrick)**: the generative-field vocabulary from [Animartrix](https://github.com/StefanPetrick/animartrix), [FunkyNoise](https://github.com/StefanPetrick/FunkyNoise) and [ColorTrails](https://github.com/StefanPetrick/ColorTrails). [Aurora](docs/moonmodules/light/effects.md#aurora), [PolarNoise](docs/moonmodules/light/effects.md#polarnoise), [Tunnel](docs/moonmodules/light/effects.md#tunnel) and [Trails](docs/moonmodules/light/effects.md#trails) sit in that tradition, written on the published algorithms underneath.
222-
- **[hpwit](https://github.com/hpwit) (Yves Bazin)**: the clockless I2S, RMT and Parlio driver techniques, and the [ESPLiveScript](https://github.com/hpwit/ESPLiveScript) engine behind MoonLive.
223-
- **Christophe Gagnier ([@Moustachauve](https://github.com/Moustachauve))**: author of the native [WLED-Android](https://github.com/Moustachauve/WLED-Android) and [WLED-iOS](https://github.com/Moustachauve/WLED-iOS) apps, whose source let MoonLight devices appear in them.
224-
- **The [Improv Wi-Fi](https://github.com/improv-wifi) project**: the open serial provisioning standard the web installer uses.
225-
- **[FastLED](https://github.com/FastLED/FastLED)**: the canonical LED-effects library whose names and models MoonLight carries forward (`scale8`, `sin8`, the gradient-palette model, the `beatsin8` family) so a contributor recognizes them on sight. The implementations are our own, integer-only and hot-path-tuned.
226-
- **[FPP](https://github.com/FalconChristmas/fpp) (Falcon Player)**: the show player that prompted [PanelCardDriver](docs/moonmodules/light/drivers.md#panelcard): if a Linux host can feed a wall of HUB75 panels, so can the board already rendering them.
227-
- **[Tasmota](https://github.com/arendst/Tasmota) and Mathieu Carbou's [MycilaSafeBoot](https://github.com/mathieucarbou/MycilaSafeBoot)**: the safeboot pattern behind [MoonBase](docs/explanation/architecture/moonbase.md), our from-scratch minimal take on it.
228-
- **Damian Schneider ([dedehai](https://github.com/DedeHai))**: author of the WLED Particle System, whose shape our [particle kernel](docs/moonmodules/light/power-functions.md#particles) follows in fixed point.
229-
- **[Piper](https://github.com/OHF-Voice/piper1-gpl) (OHF-Voice)**: the offline text-to-speech that narrates the documentation clips, with voice models from [rhasspy/piper-voices](https://huggingface.co/rhasspy/piper-voices). GPL, and used as a tool rather than linked: MoonTube calls it to render an audio track.
230-
- **wladi ([myhome-control](https://shop.myhome-control.de))**: designer of the [MHC-WLED ESP32-P4 shield](https://shop.myhome-control.de/en/ABC-WLED-ESP32-P4-shield/HW10027), and the source of the pinout details that got its line-in audio working.
216+
The people, projects and published algorithms whose work shaped MoonLight, each with what it shaped and the modules that name it, are on the [Attributions](docs/reference/attributions.md) page.
231217

232218
## Contributing
233219

3.19 KB
Loading
File renamed without changes.

0 commit comments

Comments
 (0)