From 31ce4e6980a4f57fa93d609da298837f8ee87928 Mon Sep 17 00:00:00 2001 From: Justin Bunton <130115204+Bunton33@users.noreply.github.com> Date: Sat, 11 Jul 2026 20:38:38 -0400 Subject: [PATCH 1/4] Add M-1 LED matrix to the device registry Points at the currently live WLED-MM-M1 manifests (Rev4/Rev6). The switch to the upstream-WLED 16.0.1 build from ApolloAutomation/wled is documented in docs/m1-wled-migration.md and gated on firmware hosting going live. Registry validator passes. No image asset yet (images/m-1.jpg to be added before deploy). Draft only - do not deploy. Co-Authored-By: Claude Fable 5 --- devices.json | 17 ++++++++++++++++ docs/m1-wled-migration.md | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 docs/m1-wled-migration.md diff --git a/devices.json b/devices.json index d7a5932..8561d23 100644 --- a/devices.json +++ b/devices.json @@ -217,6 +217,23 @@ "Standard": "https://raw.githubusercontent.com/ApolloAutomation/BTN-1/main/Integrations/ESPHome/BTN-1.yaml" } } + }, + { + "id": "m-1", + "name": "M-1", + "category": "LED matrix", + "description": "64x64 HUB75 LED matrix display (WLED firmware)", + "image": "images/m-1.jpg", + "imageSource": "https://wiki.apolloautomation.com/assets/Apollo_Square.png", + "wiki": "https://wiki.apolloautomation.com/products/m1/introduction/", + "repo": "ApolloAutomation/WLED-MM-M1", + "githubPagesInstaller": "https://apolloautomation.github.io/WLED-MM-M1/", + "firmware": { + "stable": { + "Rev4": "https://apolloautomation.github.io/WLED-MM-M1/14.5.1/manifest.json", + "Rev6": "https://apolloautomation.github.io/WLED-MM-M1/Rev6_14.5.1/manifest.json" + } + } } ] } diff --git a/docs/m1-wled-migration.md b/docs/m1-wled-migration.md new file mode 100644 index 0000000..e5c6d31 --- /dev/null +++ b/docs/m1-wled-migration.md @@ -0,0 +1,43 @@ +# M-1 entry: current state and the WLED 16.0.1 switch + +The m-1 entry in devices.json currently points at the manifests that are live today, +served from the WLED-MM-M1 repository GitHub Pages: + +- Rev4: https://apolloautomation.github.io/WLED-MM-M1/14.5.1/manifest.json +- Rev6: https://apolloautomation.github.io/WLED-MM-M1/Rev6_14.5.1/manifest.json + +The registry validator requires live URLs, so the entry ships in this state first. + +## Planned switch (after the 16.0.1 firmware is released) + +The M-1 firmware is moving from the WLED-MM fork to upstream WLED 16.0.1, built from +ApolloAutomation/wled (branch apollo/m1, environment apollo_m1). One firmware serves +rev4 and rev6, so the Rev4/Rev6 split collapses to a single Standard variant: + +```json +"repo": "ApolloAutomation/wled", +"githubPagesInstaller": "https://apolloautomation.github.io/wled/", +"firmware": { + "stable": { + "Standard": "https://apolloautomation.github.io/wled/manifest.json" + } +} +``` + +The manifest content is prepared in the firmware repository at +apollo/installer/manifest.json (see that repo, branch apollo/m1): + +- chipFamily ESP32-S3 +- single part: M-1_full_install.bin at offset 0 (bootloader + partition table + + otadata + application + LittleFS with the factory configuration) +- new_install_prompt_erase: true. The install flow must run a FULL ERASE: the merged + image is what guarantees a factory-fresh unit boots as a 64x64 matrix with zero + configuration. When adding the entry, verify the installer UI preselects or clearly + requires the erase option for this device. + +Hosting for the new manifest and binary is not set up yet (GitHub Pages on the +ApolloAutomation/wled fork, or any static host). Do not switch the URLs until they +are live; scripts/validate_registry.py will catch dead links. + +Customers on WLED-MM keep working: OTA from WLED-MM 14.5.1 to the 16.0.1 app-only +image (M-1_ota.bin) preserves settings because both use the same partition table. From 24b94eec777dc5dd14fc653f9208271b573c30fe Mon Sep 17 00:00:00 2001 From: Justin Bunton <130115204+Bunton33@users.noreply.github.com> Date: Wed, 15 Jul 2026 13:51:16 -0400 Subject: [PATCH 2/4] Correct firmware fork name in the M-1 WLED migration note The canonical firmware fork is ApolloAutomation/WLED-M1 (branch m1-wled-update), not ApolloAutomation/wled. Applies the fixup patch prepared in the firmware repo (apollo/installer-fixup.patch). Co-Authored-By: Claude Fable 5 --- docs/m1-wled-migration.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/m1-wled-migration.md b/docs/m1-wled-migration.md index e5c6d31..ff82ce2 100644 --- a/docs/m1-wled-migration.md +++ b/docs/m1-wled-migration.md @@ -11,21 +11,21 @@ The registry validator requires live URLs, so the entry ships in this state firs ## Planned switch (after the 16.0.1 firmware is released) The M-1 firmware is moving from the WLED-MM fork to upstream WLED 16.0.1, built from -ApolloAutomation/wled (branch apollo/m1, environment apollo_m1). One firmware serves +ApolloAutomation/WLED-M1 (branch m1-wled-update, environment apollo_m1). One firmware serves rev4 and rev6, so the Rev4/Rev6 split collapses to a single Standard variant: ```json -"repo": "ApolloAutomation/wled", -"githubPagesInstaller": "https://apolloautomation.github.io/wled/", +"repo": "ApolloAutomation/WLED-M1", +"githubPagesInstaller": "https://apolloautomation.github.io/WLED-M1/", "firmware": { "stable": { - "Standard": "https://apolloautomation.github.io/wled/manifest.json" + "Standard": "https://apolloautomation.github.io/WLED-M1/manifest.json" } } ``` The manifest content is prepared in the firmware repository at -apollo/installer/manifest.json (see that repo, branch apollo/m1): +apollo/installer/manifest.json (see that repo, branch m1-wled-update): - chipFamily ESP32-S3 - single part: M-1_full_install.bin at offset 0 (bootloader + partition table + @@ -36,7 +36,7 @@ apollo/installer/manifest.json (see that repo, branch apollo/m1): requires the erase option for this device. Hosting for the new manifest and binary is not set up yet (GitHub Pages on the -ApolloAutomation/wled fork, or any static host). Do not switch the URLs until they +ApolloAutomation/WLED-M1 fork, or any static host). Do not switch the URLs until they are live; scripts/validate_registry.py will catch dead links. Customers on WLED-MM keep working: OTA from WLED-MM 14.5.1 to the 16.0.1 app-only From 335ebe12da8b040f660db1e856318a0afe435e91 Mon Sep 17 00:00:00 2001 From: bharvey88 <8107750+bharvey88@users.noreply.github.com> Date: Fri, 17 Jul 2026 14:03:54 -0500 Subject: [PATCH 3/4] Add M-1 firmware toggle (WLED-MM 14.5.1 default, WLED 16.0.1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the M-1 entry's two-variant Rev4/Rev6 toggle with a three-way firmware toggle: WLED-MM 14.5.1 (Rev6, default), WLED-MM 14.5.1 (Rev4), and WLED 16.0.1 (Rev6 only). The 16.0.1 manifest is not live yet; its hosting PR is pending merge separately, so scripts/validate_registry.py will flag that one URL until it lands. Also fetch the M-1 product image via scripts/fetch_images.py and rewrite docs/m1-wled-migration.md to describe the shipped toggle instead of the prior planned-switch note. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- devices.json | 9 ++++--- docs/m1-wled-migration.md | 55 ++++++++++++-------------------------- images/m-1.jpg | Bin 0 -> 47429 bytes 3 files changed, 22 insertions(+), 42 deletions(-) create mode 100644 images/m-1.jpg diff --git a/devices.json b/devices.json index 8561d23..fcb2298 100644 --- a/devices.json +++ b/devices.json @@ -222,16 +222,17 @@ "id": "m-1", "name": "M-1", "category": "LED matrix", - "description": "64x64 HUB75 LED matrix display (WLED firmware)", + "description": "64x64 HUB75 LED matrix controller (WLED firmware)", "image": "images/m-1.jpg", - "imageSource": "https://wiki.apolloautomation.com/assets/Apollo_Square.png", + "imageSource": "https://cdn.shopify.com/s/files/1/0792/0959/5187/files/M-1_Full_Kit_bd50d749-ee4d-43fd-b2b9-8093d3459388.jpg?v=1754315671", "wiki": "https://wiki.apolloautomation.com/products/m1/introduction/", "repo": "ApolloAutomation/WLED-MM-M1", "githubPagesInstaller": "https://apolloautomation.github.io/WLED-MM-M1/", "firmware": { "stable": { - "Rev4": "https://apolloautomation.github.io/WLED-MM-M1/14.5.1/manifest.json", - "Rev6": "https://apolloautomation.github.io/WLED-MM-M1/Rev6_14.5.1/manifest.json" + "WLED-MM 14.5.1 (Rev6)": "https://apolloautomation.github.io/WLED-MM-M1/Rev6_14.5.1/manifest.json", + "WLED-MM 14.5.1 (Rev4)": "https://apolloautomation.github.io/WLED-MM-M1/14.5.1/manifest.json", + "WLED 16.0.1 (Rev6 only)": "https://apolloautomation.github.io/WLED-MM-M1/16.0.1/manifest.json" } } } diff --git a/docs/m1-wled-migration.md b/docs/m1-wled-migration.md index ff82ce2..b4bcee1 100644 --- a/docs/m1-wled-migration.md +++ b/docs/m1-wled-migration.md @@ -1,43 +1,22 @@ -# M-1 entry: current state and the WLED 16.0.1 switch +# M-1 firmware options in the installer -The m-1 entry in devices.json currently points at the manifests that are live today, -served from the WLED-MM-M1 repository GitHub Pages: +The M-1 offers two WLED firmwares in the installer, both served from GitHub Pages: -- Rev4: https://apolloautomation.github.io/WLED-MM-M1/14.5.1/manifest.json -- Rev6: https://apolloautomation.github.io/WLED-MM-M1/Rev6_14.5.1/manifest.json +- WLED-MM 14.5.1 (default) from ApolloAutomation/WLED-MM-M1. Two hardware revisions: + - Rev6: https://apolloautomation.github.io/WLED-MM-M1/Rev6_14.5.1/manifest.json + - Rev4: https://apolloautomation.github.io/WLED-MM-M1/14.5.1/manifest.json +- WLED 16.0.1 (Rev6 only), currently hosted on the same WLED-MM-M1 Pages site: + - https://apolloautomation.github.io/WLED-MM-M1/16.0.1/manifest.json -The registry validator requires live URLs, so the entry ships in this state first. +Rev6 with WLED-MM 14.5.1 is the default because that is the hardware being sold and the firmware +shipped on it today. WLED 16.0.1 is a single merged full-install image (bootloader, partition +table, otadata, application, and LittleFS factory config) built from ApolloAutomation/WLED-M1. +Its manifest sets new_install_prompt_erase, so esp-web-tools prompts a full erase, which is what +guarantees a factory-fresh 64x64 boot. It is offered for Rev6 only. -## Planned switch (after the 16.0.1 firmware is released) +Customers already on WLED-MM 14.5.1 can OTA to 16.0.1 with the M-1_ota.bin app-only image +(same partition table preserves settings); the installer only serves the first-flash full image. -The M-1 firmware is moving from the WLED-MM fork to upstream WLED 16.0.1, built from -ApolloAutomation/WLED-M1 (branch m1-wled-update, environment apollo_m1). One firmware serves -rev4 and rev6, so the Rev4/Rev6 split collapses to a single Standard variant: - -```json -"repo": "ApolloAutomation/WLED-M1", -"githubPagesInstaller": "https://apolloautomation.github.io/WLED-M1/", -"firmware": { - "stable": { - "Standard": "https://apolloautomation.github.io/WLED-M1/manifest.json" - } -} -``` - -The manifest content is prepared in the firmware repository at -apollo/installer/manifest.json (see that repo, branch m1-wled-update): - -- chipFamily ESP32-S3 -- single part: M-1_full_install.bin at offset 0 (bootloader + partition table + - otadata + application + LittleFS with the factory configuration) -- new_install_prompt_erase: true. The install flow must run a FULL ERASE: the merged - image is what guarantees a factory-fresh unit boots as a 64x64 matrix with zero - configuration. When adding the entry, verify the installer UI preselects or clearly - requires the erase option for this device. - -Hosting for the new manifest and binary is not set up yet (GitHub Pages on the -ApolloAutomation/WLED-M1 fork, or any static host). Do not switch the URLs until they -are live; scripts/validate_registry.py will catch dead links. - -Customers on WLED-MM keep working: OTA from WLED-MM 14.5.1 to the 16.0.1 app-only -image (M-1_ota.bin) preserves settings because both use the same partition table. +Hosting note: the 16.0.1 manifest and its 16MB full-install image live on the WLED-MM-M1 Pages +site for now (interim). They will migrate to an ApolloAutomation/WLED-M1 Pages site later; when +that happens, only the 16.0.1 manifest URL in devices.json changes. diff --git a/images/m-1.jpg b/images/m-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d9f57f85da911385352f55ba528441e1a6928b2 GIT binary patch literal 47429 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 G)&Bz|U<@$; literal 0 HcmV?d00001 From 2ddc562511c74980a8c94a252405e35d011fa308 Mon Sep 17 00:00:00 2001 From: Brandon Harvey <8107750+bharvey88@users.noreply.github.com> Date: Fri, 17 Jul 2026 14:24:17 -0500 Subject: [PATCH 4/4] Point M-1 WLED 16.0.1 at its WLED-M1 Pages host MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 16.0.1 firmware hosting moved from the interim WLED-MM-M1 location to the originally planned ApolloAutomation/WLED-M1 GitHub Pages site. Update the devices.json manifest URL and the migration doc to match. Neither host is live yet; this is a staging edit ahead of that cutover. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- devices.json | 2 +- docs/m1-wled-migration.md | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/devices.json b/devices.json index fcb2298..4aaaa41 100644 --- a/devices.json +++ b/devices.json @@ -232,7 +232,7 @@ "stable": { "WLED-MM 14.5.1 (Rev6)": "https://apolloautomation.github.io/WLED-MM-M1/Rev6_14.5.1/manifest.json", "WLED-MM 14.5.1 (Rev4)": "https://apolloautomation.github.io/WLED-MM-M1/14.5.1/manifest.json", - "WLED 16.0.1 (Rev6 only)": "https://apolloautomation.github.io/WLED-MM-M1/16.0.1/manifest.json" + "WLED 16.0.1 (Rev6 only)": "https://apolloautomation.github.io/WLED-M1/manifest.json" } } } diff --git a/docs/m1-wled-migration.md b/docs/m1-wled-migration.md index b4bcee1..0dde407 100644 --- a/docs/m1-wled-migration.md +++ b/docs/m1-wled-migration.md @@ -5,8 +5,8 @@ The M-1 offers two WLED firmwares in the installer, both served from GitHub Page - WLED-MM 14.5.1 (default) from ApolloAutomation/WLED-MM-M1. Two hardware revisions: - Rev6: https://apolloautomation.github.io/WLED-MM-M1/Rev6_14.5.1/manifest.json - Rev4: https://apolloautomation.github.io/WLED-MM-M1/14.5.1/manifest.json -- WLED 16.0.1 (Rev6 only), currently hosted on the same WLED-MM-M1 Pages site: - - https://apolloautomation.github.io/WLED-MM-M1/16.0.1/manifest.json +- WLED 16.0.1 (Rev6 only) from ApolloAutomation/WLED-M1: + - https://apolloautomation.github.io/WLED-M1/manifest.json Rev6 with WLED-MM 14.5.1 is the default because that is the hardware being sold and the firmware shipped on it today. WLED 16.0.1 is a single merged full-install image (bootloader, partition @@ -17,6 +17,7 @@ guarantees a factory-fresh 64x64 boot. It is offered for Rev6 only. Customers already on WLED-MM 14.5.1 can OTA to 16.0.1 with the M-1_ota.bin app-only image (same partition table preserves settings); the installer only serves the first-flash full image. -Hosting note: the 16.0.1 manifest and its 16MB full-install image live on the WLED-MM-M1 Pages -site for now (interim). They will migrate to an ApolloAutomation/WLED-M1 Pages site later; when -that happens, only the 16.0.1 manifest URL in devices.json changes. +Hosting: WLED-MM-M1 serves the 14.5.1 manifests from committed files via legacy branch Pages. +WLED-M1 serves the 16.0.1 manifest through an Actions Pages workflow +(.github/workflows/apollo-pages.yml) that publishes manifest.json plus M-1_full_install.bin +from the latest GitHub release, so the 16MB image never enters git history.