From 7c8c8daff3f6442dad51a946126524eb4b097b8c Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 8 Jul 2026 20:51:52 +0000 Subject: [PATCH 1/9] chore(plugins): add missing LICENSE files, march-madness README, http:// retry mount MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neglected-plugin hygiene pass (plugin audit, phase 1): - Add LICENSE files matching each manifest's declared license: MIT for geochron, nfl-draft, on-air, tide-display; GPL-3.0 for march-madness (previously undeclared — license field added to its manifest). - march-madness: add a README (it was the only plugin shipping without one) documenting features, display mode, per-key config, and data source; and mount the HTTP retry adapter on http:// as well as https:// so redirected ESPN requests keep the retry/backoff policy. - Bump manifest versions + add changelog entries; sync plugins.json. ledmatrix-elections (third-party author) LICENSE intentionally deferred pending the contributor's licensing choice. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01F9Saiat9CQmNi3DeDdvacB --- plugins.json | 20 ++--- plugins/geochron/LICENSE | 21 +++++ plugins/geochron/manifest.json | 10 ++- plugins/march-madness/LICENSE | 17 ++++ plugins/march-madness/README.md | 127 ++++++++++++++++++++++++++++ plugins/march-madness/manager.py | 4 +- plugins/march-madness/manifest.json | 13 ++- plugins/nfl-draft/LICENSE | 21 +++++ plugins/nfl-draft/manifest.json | 10 ++- plugins/on-air/LICENSE | 21 +++++ plugins/on-air/manifest.json | 10 ++- plugins/tide-display/LICENSE | 21 +++++ plugins/tide-display/manifest.json | 10 ++- 13 files changed, 283 insertions(+), 22 deletions(-) create mode 100644 plugins/geochron/LICENSE create mode 100644 plugins/march-madness/LICENSE create mode 100644 plugins/march-madness/README.md create mode 100644 plugins/nfl-draft/LICENSE create mode 100644 plugins/on-air/LICENSE create mode 100644 plugins/tide-display/LICENSE diff --git a/plugins.json b/plugins.json index c54ca1a4..c2bbb30b 100644 --- a/plugins.json +++ b/plugins.json @@ -236,10 +236,10 @@ "plugin_path": "plugins/geochron", "stars": 0, "downloads": 0, - "last_updated": "2026-06-10", + "last_updated": "2026-07-08", "verified": true, "screenshot": "", - "latest_version": "1.0.0", + "latest_version": "1.0.1", "icon": "fa-globe" }, { @@ -405,10 +405,10 @@ "plugin_path": "plugins/march-madness", "stars": 0, "downloads": 0, - "last_updated": "2026-05-19", + "last_updated": "2026-07-08", "verified": true, "screenshot": "", - "latest_version": "1.0.0" + "latest_version": "1.0.1" }, { "id": "masters-tournament", @@ -523,10 +523,10 @@ "plugin_path": "plugins/on-air", "stars": 0, "downloads": 0, - "last_updated": "2026-06-07", + "last_updated": "2026-07-08", "verified": true, "screenshot": "", - "latest_version": "1.2.0", + "latest_version": "1.2.1", "icon": "fa-circle-dot" }, { @@ -547,10 +547,10 @@ "plugin_path": "plugins/nfl-draft", "stars": 0, "downloads": 0, - "last_updated": "2026-05-15", + "last_updated": "2026-07-08", "verified": true, "screenshot": "", - "latest_version": "1.3.11", + "latest_version": "1.3.12", "icon": "fas fa-football-ball" }, { @@ -822,10 +822,10 @@ "plugin_path": "plugins/tide-display", "stars": 0, "downloads": 0, - "last_updated": "2026-06-07", + "last_updated": "2026-07-08", "verified": true, "screenshot": "", - "latest_version": "1.1.0", + "latest_version": "1.1.1", "icon": "fa-water" }, { diff --git a/plugins/geochron/LICENSE b/plugins/geochron/LICENSE new file mode 100644 index 00000000..90aa34a6 --- /dev/null +++ b/plugins/geochron/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 ChuckBuilds + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/geochron/manifest.json b/plugins/geochron/manifest.json index f625f1e0..4d8fcf32 100644 --- a/plugins/geochron/manifest.json +++ b/plugins/geochron/manifest.json @@ -1,7 +1,7 @@ { "id": "geochron", "name": "Geochron World Clock", - "version": "1.0.0", + "version": "1.0.1", "author": "ChuckBuilds", "description": "High-fidelity world map clock showing the real-time day/night terminator with civil/nautical/astronomical twilight bands, the subsolar point, configurable city markers, and a digital UTC/local clock - a classic Geochron, reimagined for LED matrix panels of any size.", "entry_point": "manager.py", @@ -11,6 +11,12 @@ "display_modes": ["geochron"], "compatible_versions": [">=2.0.0"], "versions": [ + { + "released": "2026-07-08", + "version": "1.0.1", + "notes": "Add MIT LICENSE file matching the manifest's declared license.", + "ledmatrix_min": "2.0.0" + }, { "released": "2026-06-10", "version": "1.0.0", @@ -23,7 +29,7 @@ "license": "MIT", "homepage": "https://github.com/ChuckBuilds/ledmatrix-plugins/tree/main/plugins/geochron", "config_schema": "config_schema.json", - "last_updated": "2026-06-10", + "last_updated": "2026-07-08", "stars": 0, "downloads": 0, "verified": true, diff --git a/plugins/march-madness/LICENSE b/plugins/march-madness/LICENSE new file mode 100644 index 00000000..9107ff2e --- /dev/null +++ b/plugins/march-madness/LICENSE @@ -0,0 +1,17 @@ +GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 + +Copyright (C) 2026 ChuckBuilds + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/plugins/march-madness/README.md b/plugins/march-madness/README.md new file mode 100644 index 00000000..18d943d7 --- /dev/null +++ b/plugins/march-madness/README.md @@ -0,0 +1,127 @@ +----------------------------------------------------------------------------------- +### Connect with ChuckBuilds + +- Show support on Youtube: https://www.youtube.com/@ChuckBuilds +- Stay in touch on Instagram: https://www.instagram.com/ChuckBuilds/ +- Want to chat or need support? Reach out on the ChuckBuilds Discord: https://discord.com/invite/uW36dVAtcT +- Feeling Generous? Support the project: + - Github Sponsorship: https://github.com/sponsors/ChuckBuilds + - Buy Me a Coffee: https://buymeacoffee.com/chuckbuilds + - Ko-fi: https://ko-fi.com/chuckbuilds/ + +----------------------------------------------------------------------------------- + +# March Madness Plugin + +A plugin for LEDMatrix that tracks the NCAA Division I basketball tournaments. It +shows a horizontally-scrolling ticker of tournament games grouped by round — from +the Round of 64 through the National Championship — with team seeds, round +branding, live scores, and upset highlighting. + +Unlike the in-season **Basketball Scoreboard** plugin (which can also surface +tournament games in its normal live/recent/upcoming rotation), this plugin is a +dedicated bracket view: it orders games by tournament round and region, draws round +separators, and calls out upsets, so it reads like a bracket rather than a game +list. + +## Features + +- **Men's & Women's Tournaments**: Track the NCAA Men's (NCAAM) and Women's + (NCAAW) Division I tournaments, independently toggleable. +- **Round Grouping**: Games are grouped and ordered by round — Round of 64, Round + of 32, Sweet Sixteen, Elite Eight, Final Four, and the National Championship. +- **Seeds**: Shows each team's tournament seed (1–16) next to its name. +- **Round Logos**: Optional round-logo separators between game groups. +- **Upset Highlighting**: Highlights upset winners (a higher seed beating a lower + seed) in gold. +- **Bracket Progress**: Optionally shows which teams are still alive in each region. +- **Favorite Teams**: Highlight your teams anywhere they appear in the bracket. +- **Live Scores**: Live game scores with an automatically shortened refresh + interval while games are in progress. +- **Any Panel Size**: Renders on 64×32, 128×32, 128×64, and 256×32 matrices. + +## Installation + +### From Plugin Store (Recommended) + +Install **March Madness** from the LEDMatrix plugin store and enable it in your +display rotation. + +### Manual Installation + +Copy the `march-madness` folder into your LEDMatrix plugins directory and install +its requirements: + +```bash +pip install -r requirements.txt +``` + +## Display Modes + +| Mode | Description | +|------|-------------| +| `march_madness` | A single horizontally-scrolling ticker of tournament games, grouped by round with seeds, round-logo separators, live scores, and upset highlighting. | + +The plugin exposes one screen; its length adapts to how many games are on the +board (see `dynamic_duration` below). + +## Configuration + +The web UI form is generated from `config_schema.json`, which is the source of +truth. The keys below are the ones you'll typically set. + +### Global + +| Key | Default | Notes | +|-----|---------|-------| +| `enabled` | `false` | Enable the March Madness display. | +| `leagues.ncaam` | `true` | Show NCAA Men's Tournament games. | +| `leagues.ncaaw` | `true` | Show NCAA Women's Tournament games. | +| `favorite_teams` | `[]` | Team abbreviations to highlight (e.g. `DUKE`, `UNC`). Empty shows all teams equally. | + +### Display Options + +| Key | Default | Range | Notes | +|-----|---------|-------|-------| +| `show_seeds` | `true` | — | Show tournament seeds (1–16) next to team names. | +| `show_round_logos` | `true` | — | Show round-logo separators between game groups. | +| `highlight_upsets` | `true` | — | Highlight upset winners (higher seed beating lower seed) in gold. | +| `show_bracket_progress` | `true` | — | Show which teams are still alive in each region. | +| `scroll_speed` | `1.0` | 0.5–5.0 | Scroll speed in pixels per frame. | +| `scroll_delay` | `0.02` | 0.001–0.1 | Delay between scroll frames, in seconds (smaller = smoother, more CPU). | +| `target_fps` | `120` | 30–200 | Target frames per second for the scroll. | +| `loop` | `true` | — | Loop the scroll continuously. | +| `dynamic_duration` | `true` | — | Adjust the on-screen duration automatically based on content width. | +| `min_duration` | `30` | 10–300 | Minimum display duration in seconds (used with `dynamic_duration`). | +| `max_duration` | `300` | 30–600 | Maximum display duration in seconds (used with `dynamic_duration`). | + +### Data Settings + +| Key | Default | Range | Notes | +|-----|---------|-------|-------| +| `update_interval` | `300` | 60–3600 | How often to refresh tournament data, in seconds. Automatically shortens to 60s when live games are detected. | +| `request_timeout` | `30` | 5–60 | API request timeout in seconds. | + +## Data Source + +Tournament data comes from the public **ESPN** college-basketball scoreboard API +(men's and women's). **No API key is required.** Responses are fetched over a +pooled HTTP session with automatic retry/backoff on transient errors, and the +refresh cadence is governed by `update_interval` (shortened automatically while +games are live). + +## Troubleshooting + +- **Nothing is shown / "no games"** — The tournaments only run in March–April. The + plugin has no games to display outside that window; the ESPN scoreboard returns + an empty slate and the ticker stays idle. +- **Only one tournament appears** — Check `leagues.ncaam` / `leagues.ncaaw`; both + default to on. +- **Scrolling looks choppy on a Pi** — Lower `target_fps` and/or increase + `scroll_delay` to reduce CPU load. +- **My team isn't highlighted** — Confirm the abbreviation in `favorite_teams` + matches ESPN's (e.g. `DUKE`, `UNC`, `UCONN`). + +## License + +Released under the GNU General Public License v3.0 — see [LICENSE](LICENSE). diff --git a/plugins/march-madness/manager.py b/plugins/march-madness/manager.py index cd0d8c73..481ca7a4 100644 --- a/plugins/march-madness/manager.py +++ b/plugins/march-madness/manager.py @@ -136,7 +136,9 @@ def __init__( # HTTP session with retry self.session = requests.Session() retry = Retry(total=3, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504]) - self.session.mount("https://", HTTPAdapter(max_retries=retry)) + adapter = HTTPAdapter(max_retries=retry) + self.session.mount("https://", adapter) + self.session.mount("http://", adapter) self.headers = {"User-Agent": "LEDMatrix/2.0"} # ScrollHelper diff --git a/plugins/march-madness/manifest.json b/plugins/march-madness/manifest.json index 3f0d16f6..dc82f48e 100644 --- a/plugins/march-madness/manifest.json +++ b/plugins/march-madness/manifest.json @@ -1,7 +1,7 @@ { "id": "march-madness", "name": "March Madness", - "version": "1.0.0", + "version": "1.0.1", "description": "NCAA March Madness tournament bracket tracker with round branding, seeded matchups, live scores, and upset highlighting", "author": "ChuckBuilds", "category": "sports", @@ -17,6 +17,12 @@ "branch": "main", "plugin_path": "plugins/march-madness", "versions": [ + { + "version": "1.0.1", + "ledmatrix_min": "2.0.0", + "released": "2026-07-08", + "notes": "Add README and LICENSE (GPL-3.0). Mount the HTTP retry adapter on http:// as well as https:// so redirected ESPN requests keep the retry/backoff policy." + }, { "version": "1.0.0", "ledmatrix_min": "2.0.0", @@ -25,7 +31,7 @@ ], "stars": 0, "downloads": 0, - "last_updated": "2026-02-16", + "last_updated": "2026-07-08", "verified": true, "screenshot": "", "display_modes": [ @@ -33,5 +39,6 @@ ], "dependencies": {}, "entry_point": "manager.py", - "class_name": "MarchMadnessPlugin" + "class_name": "MarchMadnessPlugin", + "license": "GPL-3.0" } diff --git a/plugins/nfl-draft/LICENSE b/plugins/nfl-draft/LICENSE new file mode 100644 index 00000000..90aa34a6 --- /dev/null +++ b/plugins/nfl-draft/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 ChuckBuilds + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/nfl-draft/manifest.json b/plugins/nfl-draft/manifest.json index 9a46299c..5a18a02d 100644 --- a/plugins/nfl-draft/manifest.json +++ b/plugins/nfl-draft/manifest.json @@ -1,7 +1,7 @@ { "id": "nfl-draft", "name": "NFL Draft", - "version": "1.3.11", + "version": "1.3.12", "author": "ChuckBuilds", "description": "Displays projected NFL draft picks from ESPN with live draft tracking support during the annual NFL Draft event. Includes simulate_live mode to replay a completed draft using real ESPN core API data. Shows team logos, player names, positions, and pick numbers in a scrolling display.", "entry_point": "manager.py", @@ -24,6 +24,12 @@ ], "icon": "fas fa-football-ball", "versions": [ + { + "released": "2026-07-08", + "version": "1.3.12", + "notes": "Add MIT LICENSE file matching the manifest's declared license.", + "ledmatrix_min": "2.0.0" + }, { "released": "2026-05-15", "version": "1.3.11", @@ -95,5 +101,5 @@ "nfl_logos": "assets/sports/nfl_logos/" }, "license": "MIT", - "last_updated": "2026-05-15" + "last_updated": "2026-07-08" } diff --git a/plugins/on-air/LICENSE b/plugins/on-air/LICENSE new file mode 100644 index 00000000..90aa34a6 --- /dev/null +++ b/plugins/on-air/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 ChuckBuilds + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/on-air/manifest.json b/plugins/on-air/manifest.json index 8555147a..813d01a0 100644 --- a/plugins/on-air/manifest.json +++ b/plugins/on-air/manifest.json @@ -1,7 +1,7 @@ { "id": "on-air", "name": "On Air Light", - "version": "1.2.0", + "version": "1.2.1", "author": "ChuckBuilds", "description": "Retro broadcast ON AIR tally light. Activate remotely via MQTT or Home Assistant to signal you're on a call, recording, or live — stays on until you turn it off.", "entry_point": "manager.py", @@ -11,6 +11,12 @@ "display_modes": ["on_air"], "compatible_versions": [">=2.0.0"], "versions": [ + { + "released": "2026-07-08", + "version": "1.2.1", + "notes": "Add MIT LICENSE file matching the manifest's declared license.", + "ledmatrix_min": "2.0.0" + }, { "released": "2026-06-08", "version": "1.2.0", @@ -36,7 +42,7 @@ "license": "MIT", "homepage": "https://github.com/ChuckBuilds/ledmatrix-plugins/tree/main/plugins/on-air", "config_schema": "config_schema.json", - "last_updated": "2026-06-08", + "last_updated": "2026-07-08", "stars": 0, "downloads": 0, "verified": true, diff --git a/plugins/tide-display/LICENSE b/plugins/tide-display/LICENSE new file mode 100644 index 00000000..90aa34a6 --- /dev/null +++ b/plugins/tide-display/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 ChuckBuilds + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/tide-display/manifest.json b/plugins/tide-display/manifest.json index 59183210..6080c1a2 100644 --- a/plugins/tide-display/manifest.json +++ b/plugins/tide-display/manifest.json @@ -1,7 +1,7 @@ { "id": "tide-display", "name": "Tide Display", - "version": "1.1.0", + "version": "1.1.1", "author": "ChuckBuilds", "description": "Coastal tide display with animated wave level, tide schedule, 24-hour chart, and tidal statistics. Powered by the free NOAA Tides & Currents API (US stations, no API key required).", "entry_point": "manager.py", @@ -11,6 +11,12 @@ "display_modes": ["current", "schedule", "chart", "stats"], "compatible_versions": [">=2.0.0"], "versions": [ + { + "released": "2026-07-08", + "version": "1.1.1", + "notes": "Add MIT LICENSE file matching the manifest's declared license.", + "ledmatrix_min": "2.0.0" + }, { "released": "2026-07-02", "version": "1.1.0", @@ -46,7 +52,7 @@ "license": "MIT", "homepage": "https://github.com/ChuckBuilds/ledmatrix-plugins/tree/main/plugins/tide-display", "config_schema": "config_schema.json", - "last_updated": "2026-06-07", + "last_updated": "2026-07-08", "stars": 0, "downloads": 0, "verified": true, From b2cfd4372b0bceda6542a23eccfa4f0edfd507b3 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 8 Jul 2026 20:56:17 +0000 Subject: [PATCH 2/9] fix(plugins): satisfy core manifest schema for march-madness and on-air The safety CI validates each changed plugin's manifest against the core manifest_schema.json. Two pre-existing issues surfaced once these plugins became "changed" in this PR: - march-madness: add the required `compatible_versions` field ([">=2.0.0"]). - on-air: remove `update_interval: 0`, which violates the schema's minimum of 1. on-air is MQTT push-driven and does not poll; the sibling mqtt-notifications plugin omits the field entirely. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01F9Saiat9CQmNi3DeDdvacB --- plugins/march-madness/manifest.json | 3 ++- plugins/on-air/manifest.json | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/march-madness/manifest.json b/plugins/march-madness/manifest.json index dc82f48e..980501a6 100644 --- a/plugins/march-madness/manifest.json +++ b/plugins/march-madness/manifest.json @@ -16,12 +16,13 @@ "repo": "https://github.com/ChuckBuilds/ledmatrix-plugins", "branch": "main", "plugin_path": "plugins/march-madness", + "compatible_versions": [">=2.0.0"], "versions": [ { "version": "1.0.1", "ledmatrix_min": "2.0.0", "released": "2026-07-08", - "notes": "Add README and LICENSE (GPL-3.0). Mount the HTTP retry adapter on http:// as well as https:// so redirected ESPN requests keep the retry/backoff policy." + "notes": "Add README and LICENSE (GPL-3.0), and the required compatible_versions manifest field. Mount the HTTP retry adapter on http:// as well as https:// so redirected ESPN requests keep the retry/backoff policy." }, { "version": "1.0.0", diff --git a/plugins/on-air/manifest.json b/plugins/on-air/manifest.json index 813d01a0..3732db2f 100644 --- a/plugins/on-air/manifest.json +++ b/plugins/on-air/manifest.json @@ -14,7 +14,7 @@ { "released": "2026-07-08", "version": "1.2.1", - "notes": "Add MIT LICENSE file matching the manifest's declared license.", + "notes": "Add MIT LICENSE file matching the manifest's declared license. Remove the invalid update_interval:0 manifest field (this plugin is MQTT push-driven and does not poll, matching mqtt-notifications).", "ledmatrix_min": "2.0.0" }, { @@ -36,7 +36,6 @@ "ledmatrix_min": "2.0.0" } ], - "update_interval": 0, "default_duration": 5, "icon": "fa-circle-dot", "license": "MIT", From 4e02d374a8ba6f594f30c33193093603165c2de0 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 8 Jul 2026 20:58:50 +0000 Subject: [PATCH 3/9] fix(march-madness): make dependencies an array to satisfy core schema The core manifest_schema.json requires `dependencies` to be an array; march-madness declared it as an empty object `{}`. It has no plugin dependencies, so `[]` is correct. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01F9Saiat9CQmNi3DeDdvacB --- plugins/march-madness/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/march-madness/manifest.json b/plugins/march-madness/manifest.json index 980501a6..d987a984 100644 --- a/plugins/march-madness/manifest.json +++ b/plugins/march-madness/manifest.json @@ -22,7 +22,7 @@ "version": "1.0.1", "ledmatrix_min": "2.0.0", "released": "2026-07-08", - "notes": "Add README and LICENSE (GPL-3.0), and the required compatible_versions manifest field. Mount the HTTP retry adapter on http:// as well as https:// so redirected ESPN requests keep the retry/backoff policy." + "notes": "Add README and LICENSE (GPL-3.0). Conform the manifest to the schema (add required compatible_versions; make dependencies an array). Mount the HTTP retry adapter on http:// as well as https:// so redirected ESPN requests keep the retry/backoff policy." }, { "version": "1.0.0", @@ -38,7 +38,7 @@ "display_modes": [ "march_madness" ], - "dependencies": {}, + "dependencies": [], "entry_point": "manager.py", "class_name": "MarchMadnessPlugin", "license": "GPL-3.0" From f18f5291020b1c433912912b9728ab7366fc5413 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 9 Jul 2026 11:45:54 +0000 Subject: [PATCH 4/9] docs(plugins): fix stale README config docs (7-segment-clock, on-air, static-image) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plugin audit phase 2a — realign these READMEs with their config_schema.json (the source of truth for the web UI form): - 7-segment-clock: remove the documented-but-removed sunrise/sunset color transition feature (location lat/lng/locality, color_daytime/nighttime, min_fade_elevation, astral dependency) — it no longer exists in the schema or manager; document the real color and digit_spacing options; fix the placeholder license section (GPL-3.0, matching the LICENSE file). - on-air: replace the removed pulsing/glow/tally-dot options with the actual text color, background color, font, and Home Assistant discovery fields; correct the per-message color/bg MQTT payload docs; drop the broken preview.png reference. - static-image: document all rotation_mode values (add time_based/date_based), describe images as scheduled image entries rather than plain paths, and add a Per-Image Scheduling section. Also normalizes each manifest's versions[] changelog key to ledmatrix_min (some mixed the old ledmatrix_min_version). Version bumps + plugins.json sync. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01F9Saiat9CQmNi3DeDdvacB --- plugins.json | 12 +- plugins/7-segment-clock/README.md | 152 ++++++++++---------------- plugins/7-segment-clock/manifest.json | 12 +- plugins/on-air/README.md | 42 +++---- plugins/on-air/manifest.json | 8 +- plugins/static-image/README.md | 21 +++- plugins/static-image/manifest.json | 14 ++- 7 files changed, 127 insertions(+), 134 deletions(-) diff --git a/plugins.json b/plugins.json index c2bbb30b..2f37b363 100644 --- a/plugins.json +++ b/plugins.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "last_updated": "2026-07-08", + "last_updated": "2026-07-09", "plugins": [ { "id": "7-segment-clock", @@ -20,10 +20,10 @@ "plugin_path": "plugins/7-segment-clock", "stars": 0, "downloads": 0, - "last_updated": "2026-06-07", + "last_updated": "2026-07-08", "verified": true, "screenshot": "", - "latest_version": "1.0.2" + "latest_version": "1.0.3" }, { "id": "baseball-scoreboard", @@ -526,7 +526,7 @@ "last_updated": "2026-07-08", "verified": true, "screenshot": "", - "latest_version": "1.2.1", + "latest_version": "1.2.2", "icon": "fa-circle-dot" }, { @@ -725,10 +725,10 @@ "plugin_path": "plugins/static-image", "stars": 0, "downloads": 0, - "last_updated": "2026-05-15", + "last_updated": "2026-07-08", "verified": true, "screenshot": "", - "latest_version": "1.0.3" + "latest_version": "1.0.4" }, { "id": "stock-news", diff --git a/plugins/7-segment-clock/README.md b/plugins/7-segment-clock/README.md index 6cd22de5..aeb16c01 100644 --- a/plugins/7-segment-clock/README.md +++ b/plugins/7-segment-clock/README.md @@ -1,16 +1,16 @@ # 7-Segment Clock Plugin -A retro-style 7-segment clock plugin for LEDMatrix that displays time using digit images with configurable formats and sunrise/sunset-based color transitions. +A retro-style 7-segment clock plugin for LEDMatrix that displays the time using +digit images with configurable format, spacing, and color. ## Features -- **Retro 7-Segment Display**: Uses classic digit images (13x32px) with customizable colors -- **Time Format Options**: Support for 12-hour and 24-hour time formats -- **Leading Zero Control**: Optional leading zero for hours (e.g., "09:30" vs "9:30") -- **Flashing Separator**: Optional blinking colon separator between hours and minutes -- **Sunrise/Sunset Color Transitions**: Automatically transitions between daytime and nighttime colors based on sun elevation -- **Location-Based**: Configure latitude/longitude for accurate sunrise/sunset calculations -- **Timezone Support**: Display time in any timezone +- **Retro 7-Segment Display**: Classic digit images (13×32px) with a customizable color +- **Time Format Options**: 12-hour and 24-hour formats +- **Leading Zero Control**: Optional leading zero for hours (e.g. "09:30" vs "9:30") +- **Flashing Separator**: Optional blinking colon between hours and minutes +- **Adjustable Digit Spacing**: Tune the pixel gap between digits for readability +- **Timezone Support**: Display time in any timezone (or inherit the main LEDMatrix timezone) ## Installation @@ -18,8 +18,7 @@ A retro-style 7-segment clock plugin for LEDMatrix that displays time using digi 1. Open the LEDMatrix web interface (`http://your-pi-ip:5000`) 2. Open the **Plugin Manager** tab -3. Find **7-Segment Clock** in the **Plugin Store** section and click - **Install** +3. Find **7-Segment Clock** in the **Plugin Store** section and click **Install** ### Manual Installation @@ -47,23 +46,11 @@ A retro-style 7-segment clock plugin for LEDMatrix that displays time using digi ## Configuration -The plugin can be configured via the web interface or directly in `config/config.json`: +The plugin can be configured via the web interface (the form is generated from +`config_schema.json`, which is the source of truth) or directly in +`config/config.json`. -### Basic Configuration - -```json -{ - "7-segment-clock": { - "enabled": true, - "display_duration": 15, - "is_24_hour_format": true, - "has_leading_zero": false, - "has_flashing_separator": true - } -} -``` - -### Full Configuration with Location and Colors +### Example ```json { @@ -71,88 +58,66 @@ The plugin can be configured via the web interface or directly in `config/config "enabled": true, "display_duration": 15, "location": { - "lat": 37.541290, - "lng": -77.434769, - "timezone": "US/Eastern", - "locality": "Richmond, VA" + "timezone": "US/Eastern" }, "is_24_hour_format": true, "has_leading_zero": false, "has_flashing_separator": true, - "color_daytime": "#FFFFFF", - "color_nighttime": "#220000", - "min_fade_elevation": "-1" + "digit_spacing": 2, + "color": "#FFFFFF" } } ``` ### Configuration Options -| Option | Type | Default | Description | -|--------|------|---------|-------------| +| Option | Type | Default | Notes | +|--------|------|---------|-------| | `enabled` | boolean | `true` | Enable or disable the plugin | -| `display_duration` | number | `15` | How long to display the clock (seconds) | -| `location.lat` | number | `37.541290` | Latitude for sunrise/sunset calculations | -| `location.lng` | number | `-77.434769` | Longitude for sunrise/sunset calculations | -| `location.timezone` | string | `"US/Eastern"` | Timezone string (e.g., "US/Eastern", "UTC") | -| `location.locality` | string | `"Richmond, VA"` | Human-readable location name | -| `is_24_hour_format` | boolean | `true` | Use 24-hour format (false for 12-hour) | -| `has_leading_zero` | boolean | `false` | Show leading zero for hours | -| `has_flashing_separator` | boolean | `true` | Enable blinking separator (colon) | -| `color_daytime` | string | `"#FFFFFF"` | Hex color for daytime (white) | -| `color_nighttime` | string | `"#FFFFFF"` | Hex color for nighttime (white) | -| `min_fade_elevation` | string | `"-1"` | Sun elevation threshold for color mixing | - -### Color Transition Options - -The `min_fade_elevation` option controls when color transitions occur based on sun elevation: - -- **`"-1"`** (None): No fading, switches directly between day/night colors -- **`"-6"`** (Civil twilight): Fades during civil twilight (sun 6° below horizon) -- **`"-12"`** (Nautical twilight): Fades during nautical twilight (sun 12° below horizon) -- **`"-18"`** (Astronomical twilight): Fades during astronomical twilight (sun 18° below horizon) +| `display_duration` | number | `15` | How long to show the clock, in seconds (5–300) | +| `location.timezone` | string | *(inherits)* | Timezone string (e.g. `US/Eastern`, `UTC`). If unset, inherits the main LEDMatrix timezone | +| `is_24_hour_format` | boolean | `true` | Use 24-hour format (`false` for 12-hour) | +| `has_leading_zero` | boolean | `false` | Show a leading zero for hours (e.g. `09:30` instead of `9:30`) | +| `has_flashing_separator` | boolean | `true` | Blink the colon separator once per second | +| `digit_spacing` | number | `2` | Pixels between digits, for readability (0–10) | +| `color` | string | `"#FFFFFF"` | Hex color for the digits (e.g. `#FFFFFF` white, `#FF0000` red) | ## Usage -Once installed and enabled, the plugin will automatically display the current time during the normal plugin rotation. The display updates every 60 seconds (configurable via `update_interval` in manifest). +Once installed and enabled, the plugin displays the current time during the normal +plugin rotation. The core refreshes the plugin on its own cadence (see +`update_interval` in `manifest.json`, default 60s). ### Time Formats -- **24-hour format** (`is_24_hour_format: true`): Displays time as "HH:MM" (e.g., "14:30") -- **12-hour format** (`is_24_hour_format: false`): Displays time as "H:MM" or "HH:MM" (e.g., "2:30" or "02:30") +- **24-hour** (`is_24_hour_format: true`): "HH:MM" (e.g. "14:30") +- **12-hour** (`is_24_hour_format: false`): "H:MM" or "HH:MM" depending on `has_leading_zero` (e.g. "2:30" or "02:30") ### Separator Flashing -When `has_flashing_separator` is enabled, the colon separator blinks every second (visible on even seconds, hidden on odd seconds), similar to traditional digital clocks. +When `has_flashing_separator` is enabled, the colon blinks each second (visible on +even seconds, hidden on odd), like a traditional digital clock. ## Technical Details ### Image Assets -The plugin uses digit images (13x32 pixels) and a separator image (4x14 pixels) stored in `assets/images/`: -- `number_0.png` through `number_9.png`: Digit images -- `separator.png`: Colon separator image - -Images have transparent foreground on black background, allowing colors to be applied dynamically. - -### Sunrise/Sunset Calculations - -The plugin uses the `astral` library to calculate sun elevation based on: -- Location (latitude/longitude) -- Current date and time -- Timezone +The plugin uses digit images (13×32px) and a separator image (4×14px) in +`assets/images/`: +- `number_0.png` through `number_9.png`: digit images +- `separator.png`: the colon separator -Color mixing is calculated based on the sun's elevation relative to the configured fade thresholds. +Images have a transparent foreground on a black background, so the configured +`color` is applied dynamically. ### Display Dimensions -The plugin automatically adapts to any display size configured in LEDMatrix. Display dimensions are read from `display_manager.width` and `display_manager.height`. - -Centering calculations ensure the clock is properly positioned regardless of display width (supports 64x32, 128x32, chained panels, etc.). +The plugin adapts to any display size configured in LEDMatrix (dimensions are read +from `display_manager`), and centers the clock regardless of panel width (64×32, +128×32, chained panels, etc.). ## Dependencies -- `astral>=3.2`: Sunrise/sunset and sun elevation calculations - `pytz>=2023.3`: Timezone support - `PIL` (Pillow): Image processing (provided by LEDMatrix core) @@ -161,26 +126,19 @@ Centering calculations ensure the clock is properly positioned regardless of dis ### Clock Not Displaying 1. Check that the plugin is enabled in `config/config.json` -2. Verify images are present in `assets/images/` directory -3. Check plugin logs for errors: `journalctl -u ledmatrix -f` (if running as service) +2. Verify the images are present in the `assets/images/` directory +3. Check plugin logs for errors: `journalctl -u ledmatrix -f` (if running as a service) ### Wrong Time Displayed -1. Verify timezone is correct in configuration -2. Check system time is correct -3. Ensure location coordinates are accurate if using sunrise/sunset features - -### Colors Not Transitioning - -1. Verify location coordinates (lat/lng) are correct -2. Check that `min_fade_elevation` is set appropriately -3. Verify `color_daytime` and `color_nighttime` are different colors +1. Verify `location.timezone` is correct (or that the inherited main timezone is right) +2. Check that the system time is correct ### Images Not Loading -1. Verify all image files exist in `assets/images/` directory -2. Check file permissions on image files -3. Verify image files are valid PNG files +1. Verify all image files exist in `assets/images/` +2. Check file permissions on the image files +3. Verify the image files are valid PNGs ## Development @@ -192,13 +150,14 @@ Centering calculations ensure the clock is properly positioned regardless of dis ├── manager.py # Main plugin class ├── config_schema.json # Configuration schema ├── requirements.txt # Python dependencies -├── README.md # This file +├── README.md # This file +├── LICENSE └── assets/ └── images/ - ├── number_0.png # Digit images (0-9) + ├── number_0.png # Digit images (0-9) ├── ... ├── number_9.png - └── separator.png # Colon separator + └── separator.png # Colon separator ``` ### Testing @@ -210,15 +169,14 @@ python run.py --emulator ## License -[Add your license here] +Released under the GNU General Public License v3.0 — see [LICENSE](LICENSE). ## Credits - Original Big Clock applet: [TronbyT Apps](https://github.com/tronbyt/apps) -- Digit images sourced from TronbyT repository -- Adapted for LEDMatrix plugin system +- Digit images sourced from the TronbyT repository +- Adapted for the LEDMatrix plugin system ## Support For issues, questions, or contributions, please open an issue on the GitHub repository. - diff --git a/plugins/7-segment-clock/manifest.json b/plugins/7-segment-clock/manifest.json index a7c86f24..2404b210 100644 --- a/plugins/7-segment-clock/manifest.json +++ b/plugins/7-segment-clock/manifest.json @@ -1,7 +1,7 @@ { "id": "7-segment-clock", "name": "7-Segment Clock", - "version": "1.0.2", + "version": "1.0.3", "description": "Display a retro-style 7-segment clock with customizable colors", "author": "LEDMatrix", "entry_point": "manager.py", @@ -24,6 +24,12 @@ "default_duration": 15, "config_schema": "config_schema.json", "versions": [ + { + "released": "2026-07-08", + "version": "1.0.3", + "notes": "Rewrite the README to match the actual config schema: remove the documented-but-removed sunrise/sunset color-transition options and location lat/lng/locality keys, and document the real color and digit_spacing options. Normalize the versions changelog key to ledmatrix_min.", + "ledmatrix_min": "2.0.0" + }, { "released": "2026-06-07", "version": "1.0.2", @@ -37,8 +43,8 @@ { "version": "1.0.0", "released": "2026-04-07", - "ledmatrix_min_version": "2.0.0" + "ledmatrix_min": "2.0.0" } ], - "last_updated": "2026-06-07" + "last_updated": "2026-07-08" } diff --git a/plugins/on-air/README.md b/plugins/on-air/README.md index 56d94bad..2e9d4726 100644 --- a/plugins/on-air/README.md +++ b/plugins/on-air/README.md @@ -1,8 +1,6 @@ # On Air Light -A retro broadcast tally light for your LED matrix. Publish a single MQTT message to take over the display with a pulsing red "ON AIR" sign — it holds until you send the off command, so it works as a persistent do-not-disturb signal during calls, recordings, or livestreams. - -![On Air Light — pulsing red ON AIR tally light on a 192×48 LED matrix panel](preview.png) +A retro broadcast tally light for your LED matrix. Publish a single MQTT message to take over the display with a bold "ON AIR" sign — it holds until you send the off command, so it works as a persistent do-not-disturb signal during calls, recordings, or livestreams. Text, text color, and background color are all customizable. --- @@ -53,17 +51,21 @@ mosquitto_pub -h -t ledmatrix/on-air/set -m OFF | Field | Default | Description | |---|---|---| -| **MQTT Broker Host** | `localhost` | IP or hostname of your MQTT broker | -| **MQTT Port** | `1883` | Broker port (use 8883 for TLS) | -| **MQTT Username** | *(blank)* | Leave blank if no auth required | -| **MQTT Password** | *(blank)* | Leave blank if no auth required | -| **Command Topic** | `ledmatrix/on-air/set` | Topic the plugin **subscribes** to | -| **State Topic** | `ledmatrix/on-air/state` | Topic the plugin **publishes** to after each state change | -| **Default Label** | `ON AIR` | Text shown when activated without a label in the payload | -| **Default Color** | `[255, 20, 20]` | RGB glow color — broadcast red by default | -| **Enable Pulsing** | `true` | Animate the glow with a slow heartbeat pulse | -| **Pulse Speed** | `1.2` Hz | How fast the glow breathes (1.2 ≈ one pulse per second) | -| **Standby Rotation Duration** | `5` s | How long the dark standby screen sits in the normal rotation before cycling away | +| **Sign Text** | `ON AIR` | Text shown when activated (max 32 chars). Overridable per-message via JSON. | +| **Text Color** | `[255, 255, 255]` | RGB color of the sign text. | +| **Background Color** | `[200, 10, 10]` | RGB background color — broadcast red by default. | +| **Font** | *(blank)* | Path to a TTF font relative to the LEDMatrix root (e.g. `assets/fonts/PressStart2P-Regular.ttf`). Blank uses the default font, auto-sized to 80% of display height. | +| **Font Size (px)** | `0` | Font height in pixels when a custom Font is set. `0` auto-sizes to 80% of display height. | +| **MQTT Broker Host** | `localhost` | IP or hostname of your MQTT broker. | +| **MQTT Port** | `1883` | Broker port (use 8883 for TLS). | +| **MQTT Username** | *(blank)* | Leave blank if no auth required. | +| **MQTT Password** | *(blank)* | Leave blank if no auth required. | +| **Command Topic** | `ledmatrix/on-air/set` | Topic the plugin **subscribes** to (publish `ON`/`OFF` or JSON). | +| **State Topic** | `ledmatrix/on-air/state` | Topic the plugin **publishes** to after each state change. | +| **Enable Home Assistant Auto-Discovery** | `true` | Announce to HA via MQTT discovery so it auto-creates the device (switch, label sensor, connectivity) — no `configuration.yaml` needed. | +| **HA Discovery Prefix** | `homeassistant` | MQTT topic prefix your HA MQTT integration listens on. | +| **Device Name in Home Assistant** | `LED Matrix — On Air` | How the device appears under Settings → Devices & Services → MQTT. | +| **Display Duration (seconds)** | `5` | How long the sign stays on screen each rotation cycle while active (1–60). | --- @@ -98,16 +100,16 @@ The label (max 16 chars) replaces "ON AIR" on the display. On panels 128 px wide ### JSON — state + label + color ```json -{"state": "on", "label": "IN MEETING", "color": [255, 140, 0]} -{"state": "on", "label": "RECORDING", "color": [255, 20, 20]} -{"state": "on", "label": "LIVE", "color": [255, 0, 80]} +{"state": "on", "label": "IN MEETING", "bg": [255, 140, 0]} +{"state": "on", "label": "RECORDING", "bg": [200, 10, 10]} +{"state": "on", "label": "LIVE", "bg": [255, 0, 80], "color": [255, 255, 255]} ``` -Color is `[R, G, B]` and controls both the background glow and the tally dot. Good presets: +`bg` (or `background_color`) sets the sign's background — the dominant color of the display — and `color` (or `text_color`) sets the text. Both are `[R, G, B]`. Good background presets: -| Situation | Color | +| Situation | Background | |---|---| -| Recording / On Air | `[255, 20, 20]` — broadcast red | +| Recording / On Air | `[200, 10, 10]` — broadcast red | | In a meeting / call | `[255, 140, 0]` — amber | | Livestreaming | `[255, 0, 80]` — hot pink | | Do Not Disturb | `[180, 0, 180]` — purple | diff --git a/plugins/on-air/manifest.json b/plugins/on-air/manifest.json index 3732db2f..02fbc2e5 100644 --- a/plugins/on-air/manifest.json +++ b/plugins/on-air/manifest.json @@ -1,7 +1,7 @@ { "id": "on-air", "name": "On Air Light", - "version": "1.2.1", + "version": "1.2.2", "author": "ChuckBuilds", "description": "Retro broadcast ON AIR tally light. Activate remotely via MQTT or Home Assistant to signal you're on a call, recording, or live — stays on until you turn it off.", "entry_point": "manager.py", @@ -11,6 +11,12 @@ "display_modes": ["on_air"], "compatible_versions": [">=2.0.0"], "versions": [ + { + "released": "2026-07-08", + "version": "1.2.2", + "notes": "Update the README to match the current config schema and behavior: replace the removed pulsing/glow/tally-dot options with the actual text color, background color, font, and Home Assistant discovery fields; fix the per-message color/bg payload docs; and drop the broken preview image reference.", + "ledmatrix_min": "2.0.0" + }, { "released": "2026-07-08", "version": "1.2.1", diff --git a/plugins/static-image/README.md b/plugins/static-image/README.md index 6432d435..e75f2b84 100644 --- a/plugins/static-image/README.md +++ b/plugins/static-image/README.md @@ -75,9 +75,9 @@ from it. Key options: | Key | Default | Notes | |---|---|---| | `enabled` | `false` | Master switch | -| `images` | `[]` | Array of image paths (relative to LEDMatrix root or absolute) | -| `image_config.mode` | `"single"` | How images are presented | -| `image_config.rotation_mode` | `"sequential"` | `"sequential"` or `"random"` when multiple images | +| `images` | `[]` | Array of image entries (each an object with a `path` and an optional per-image `schedule`), managed via the file-upload widget. See **Per-Image Scheduling** below. | +| `image_config.mode` | `"single"` | How images are presented: `"single"` or `"multiple"` | +| `image_config.rotation_mode` | `"sequential"` | Order when showing multiple images: `"sequential"`, `"random"`, `"time_based"` (advance on a wall-clock interval), or `"date_based"` (one image per day) | | `rotation_settings.sequential_loop` | `true` | Loop back to the first image after the last | | `rotation_settings.random_seed` | `null` | Optional fixed seed for reproducible random order | | `rotation_settings.time_intervals.enabled` | `false` | Tie image changes to wall-clock intervals | @@ -88,6 +88,21 @@ from it. Key options: | `background_color` | `[0, 0, 0]` | RGB fill behind transparent pixels | | `display_duration` | `10` | Seconds the plugin holds the screen each rotation | +### Per-Image Scheduling + +Each entry in `images` can carry an optional `schedule` so an image only shows at +certain times (e.g. a "good morning" board, or business-hours signage): + +| Schedule key | Default | Notes | +|---|---|---| +| `schedule.enabled` | `false` | Turn scheduling on for this image | +| `schedule.mode` | `"always"` | `"always"` (any time), `"time_range"` (same window every day), or `"per_day"` (a different window per weekday) | +| `schedule.start_time` / `schedule.end_time` | `"08:00"` / `"18:00"` | Window bounds (HH:MM, 24-hour) for `time_range` mode | +| `schedule.days.` | — | Per-weekday `enabled` + `start_time`/`end_time`, used when `mode` is `"per_day"` | + +When several images are eligible at the same time, they rotate per +`image_config.rotation_mode`. + ## Usage ### Basic Setup diff --git a/plugins/static-image/manifest.json b/plugins/static-image/manifest.json index c68159c3..9ff04c0f 100644 --- a/plugins/static-image/manifest.json +++ b/plugins/static-image/manifest.json @@ -1,7 +1,7 @@ { "id": "static-image", "name": "Static Image Display", - "version": "1.0.3", + "version": "1.0.4", "author": "ChuckBuilds", "description": "Display static images on your LED matrix with automatic scaling, aspect ratio preservation, and transparency support. Perfect for logos, artwork, or custom graphics.", "entry_point": "manager.py", @@ -18,6 +18,12 @@ "static_image" ], "versions": [ + { + "released": "2026-07-08", + "version": "1.0.4", + "notes": "Correct the README config docs: document all rotation_mode values (sequential/random/time_based/date_based), describe images as scheduled image entries rather than plain paths, and add a Per-Image Scheduling section. Normalize the versions changelog key to ledmatrix_min.", + "ledmatrix_min": "2.0.0" + }, { "released": "2026-05-15", "version": "1.0.3", @@ -26,15 +32,15 @@ { "version": "1.0.2", "released": "2025-11-05", - "ledmatrix_min_version": "2.0.0" + "ledmatrix_min": "2.0.0" }, { "released": "2025-10-19", "version": "1.0.1", - "ledmatrix_min_version": "2.0.0" + "ledmatrix_min": "2.0.0" } ], - "last_updated": "2026-05-15", + "last_updated": "2026-07-08", "stars": 0, "downloads": 0, "verified": true, From 03a3416184586b8c016608f416769ff34b11543e Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 9 Jul 2026 12:01:03 +0000 Subject: [PATCH 5/9] docs(calendar,countdown): add config tables + missing schema titles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Audit phase 2 (README parity, continued): - calendar: convert the prose config bullets to a per-key table that also documents the previously-undocumented customization fonts. Kept credentials_file/token_file — both are real config-only keys the manager reads (manager.py:72-73), not schema drift. Added web-UI titles to the untitled options (Enabled, Max Events, Show All-Day Events, Event Rotation Interval, Display Duration, Update Interval). - countdown: replace the stale prose config section with per-key tables covering the v3 keys (target_time, mode until/since, layout_preset, text_align, and the per-countdown style/layout overrides); add a title to the top-level enabled option. Normalizes both manifests' versions[] key to ledmatrix_min. Version bumps + plugins.json sync. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01F9Saiat9CQmNi3DeDdvacB --- plugins.json | 8 ++--- plugins/calendar/README.md | 26 ++++++++++----- plugins/calendar/config_schema.json | 6 ++++ plugins/calendar/manifest.json | 14 +++++--- plugins/countdown/README.md | 50 ++++++++++++++++++---------- plugins/countdown/config_schema.json | 1 + plugins/countdown/manifest.json | 14 +++++--- 7 files changed, 81 insertions(+), 38 deletions(-) diff --git a/plugins.json b/plugins.json index 2f37b363..842db005 100644 --- a/plugins.json +++ b/plugins.json @@ -94,10 +94,10 @@ "plugin_path": "plugins/calendar", "stars": 0, "downloads": 0, - "last_updated": "2026-05-15", + "last_updated": "2026-07-08", "verified": true, "screenshot": "", - "latest_version": "1.1.2" + "latest_version": "1.1.3" }, { "id": "christmas-countdown", @@ -160,10 +160,10 @@ "plugin_path": "plugins/countdown", "stars": 0, "downloads": 0, - "last_updated": "2026-05-30", + "last_updated": "2026-07-08", "verified": true, "screenshot": "", - "latest_version": "3.1.0", + "latest_version": "3.1.1", "icon": "fa-clock" }, { diff --git a/plugins/calendar/README.md b/plugins/calendar/README.md index 7a3bb4fb..6ceb255e 100644 --- a/plugins/calendar/README.md +++ b/plugins/calendar/README.md @@ -96,15 +96,23 @@ All authentication files (`credentials.json` and `token.pickle`) are stored in t ### Configuration Options -- `enabled`: Enable/disable the plugin -- `credentials_file`: Path to OAuth credentials JSON file -- `token_file`: Path to store authentication token -- `max_events`: Maximum number of events to fetch (1-10) -- `calendars`: List of calendar IDs (use `"primary"` for default calendar) -- `update_interval`: Seconds between API updates (minimum 60) -- `show_all_day_events`: Include all-day events -- `event_rotation_interval`: Seconds between rotating events (minimum 5) -- `display_duration`: Total display duration in seconds +The web UI form is generated from `config_schema.json` (the source of truth). +`credentials_file` and `token_file` are handled by the setup flow above (the upload +widget and first-time authentication) and rarely need editing by hand. + +| Key | Default | Notes | +|-----|---------|-------| +| `enabled` | `false` | Enable or disable the plugin | +| `credentials_file` | `"credentials.json"` | Google OAuth credentials file (uploaded via the config UI) | +| `token_file` | `"token.pickle"` | Where the OAuth token is stored after first-time auth (auto-created) | +| `calendars` | `["primary"]` | Calendar IDs to display — use the calendar picker after authenticating, or `"primary"` for your default | +| `max_events` | `3` | Maximum upcoming events to show (1–10) | +| `show_all_day_events` | `true` | Include all-day events | +| `event_rotation_interval` | `10` | Seconds between rotating displayed events (min 5) | +| `display_duration` | `30` | Total seconds on screen before moving to the next plugin (min 5) | +| `update_interval` | `3600` | Seconds between refreshes from Google (60–86400) | +| `customization.datetime_text.font` / `.font_size` | `PressStart2P-Regular.ttf` / `8` | Font family + size (4–16px) for the event date/time line | +| `customization.title_text.font` / `.font_size` | `PressStart2P-Regular.ttf` / `8` | Font family + size (4–16px) for the event title | ## Display Format diff --git a/plugins/calendar/config_schema.json b/plugins/calendar/config_schema.json index 9c95cc38..b2c034b8 100644 --- a/plugins/calendar/config_schema.json +++ b/plugins/calendar/config_schema.json @@ -5,6 +5,7 @@ "enabled": { "type": "boolean", "default": false, + "title": "Enabled", "description": "Enable or disable the calendar plugin" }, "credentials_file": { @@ -38,23 +39,27 @@ "default": 3, "minimum": 1, "maximum": 10, + "title": "Max Events", "description": "Maximum number of upcoming events to show" }, "show_all_day_events": { "type": "boolean", "default": true, + "title": "Show All-Day Events", "description": "Include all-day events in the display" }, "event_rotation_interval": { "type": "number", "default": 10, "minimum": 5, + "title": "Event Rotation Interval (seconds)", "description": "Seconds between rotating displayed events" }, "display_duration": { "type": "number", "default": 30, "minimum": 5, + "title": "Display Duration (seconds)", "description": "Total display duration in seconds before moving to next plugin" }, "update_interval": { @@ -62,6 +67,7 @@ "default": 3600, "minimum": 60, "maximum": 86400, + "title": "Update Interval (seconds)", "description": "How often to refresh calendar data from Google (seconds)" }, "customization": { diff --git a/plugins/calendar/manifest.json b/plugins/calendar/manifest.json index 172c9c54..6b81152a 100644 --- a/plugins/calendar/manifest.json +++ b/plugins/calendar/manifest.json @@ -1,7 +1,7 @@ { "id": "calendar", "name": "Google Calendar", - "version": "1.1.2", + "version": "1.1.3", "author": "ChuckBuilds", "description": "Display upcoming events from Google Calendar with date, time, and event details. Shows next 1-3 events with automatic rotation and timezone support.", "category": "productivity", @@ -35,6 +35,12 @@ } ], "versions": [ + { + "released": "2026-07-08", + "version": "1.1.3", + "notes": "Document the config in a per-key table (including the previously-undocumented customization fonts), add web-UI titles to the untitled options (Max Events, Show All-Day Events, durations, Update Interval), and normalize the versions changelog key to ledmatrix_min.", + "ledmatrix_min": "2.0.0" + }, { "released": "2026-05-15", "version": "1.1.2", @@ -48,15 +54,15 @@ { "released": "2026-03-02", "version": "1.1.0", - "ledmatrix_min_version": "2.0.0" + "ledmatrix_min": "2.0.0" }, { "released": "2025-10-19", "version": "1.0.1", - "ledmatrix_min_version": "2.0.0" + "ledmatrix_min": "2.0.0" } ], - "last_updated": "2026-05-15", + "last_updated": "2026-07-08", "stars": 0, "downloads": 0, "verified": true, diff --git a/plugins/countdown/README.md b/plugins/countdown/README.md index c1f0c6ed..67233506 100644 --- a/plugins/countdown/README.md +++ b/plugins/countdown/README.md @@ -48,24 +48,40 @@ Display customizable countdowns with images on your LED matrix. Perfect for birt ### Configuration Options +The web UI form is generated from `config_schema.json` (the source of truth). + #### Per-Countdown Settings -- **Name** (required): Display name, max 30 characters -- **Target Date** (required): Date in YYYY-MM-DD format -- **Image Path**: Local image path (optional) -- **Enabled**: Toggle to enable/disable this countdown -- **Display Order**: Controls rotation order (lower numbers first) - -#### Global Settings -- **Display Duration**: How long to show each countdown (seconds) -- **Font Family**: Choose from press_start, four_by_six, tom_thumb, tiny, picopixel -- **Font Size**: Size for countdown value (6-16px) -- **Font Color**: RGB color for countdown value -- **Name Font Size**: Size for countdown name (6-16px) -- **Name Font Color**: RGB color for countdown name -- **Fit to Display**: Auto-scale images to fit -- **Preserve Aspect Ratio**: Maintain image proportions when scaling -- **Background Color**: RGB color for background -- **Show Expired**: Display countdowns that have already passed + +Each entry in the **Countdowns** table supports: + +| Field | Default | Notes | +|-------|---------|-------| +| `name` (required) | — | Display name, max 30 chars | +| `target_date` (required) | — | `YYYY-MM-DD` — the date to count to/from | +| `target_time` | `00:00` | Optional `HH:MM` (24h) for sub-day precision; switches to hours/minutes as the event nears | +| `mode` | `until` | `until` counts down to the date (Days Until); `since` counts up from it (Days Since) | +| `layout_preset` | `image-left` | `image-left`, `image-right`, `text-only`, or `image-only` | +| `text_align` | `center` | `left`, `center`, or `right` for the name/value text | +| `image_path` | — | Optional image shown alongside the countdown | +| `enabled` | `true` | Show/hide this countdown | +| `display_order` | `0` | Rotation order (lower first) | +| `layout.*` | auto | Optional pixel position/size overrides for the image and text | +| `style.*` | inherit | Optional per-countdown font/size/color overrides (`null` inherits the global settings below) | + +#### Global Settings (defaults for all countdowns) + +| Key | Default | Notes | +|-----|---------|-------| +| `display_duration` | `15` | Seconds to show each countdown before rotating (5–300) | +| `font_family` | `press_start` | One of `press_start`, `four_by_six`, `tom_thumb`, `tiny`, `picopixel` | +| `font_size` | `8` | Countdown value font size (4–16px) | +| `font_color` | `[255, 255, 255]` | RGB color for the countdown value | +| `name_font_size` | `8` | Countdown name font size (4–16px) | +| `name_font_color` | `[200, 200, 200]` | RGB color for the countdown name | +| `background_color` | `[0, 0, 0]` | RGB background color | +| `show_expired` | `false` | Show `until` countdowns that have passed (as "Nd ago") | +| `fit_to_display` | `true` | Auto-scale images to their allocated area | +| `preserve_aspect_ratio` | `true` | Keep image proportions when scaling | ## Display Layout diff --git a/plugins/countdown/config_schema.json b/plugins/countdown/config_schema.json index 086d2c3f..744593ad 100644 --- a/plugins/countdown/config_schema.json +++ b/plugins/countdown/config_schema.json @@ -8,6 +8,7 @@ "enabled": { "type": "boolean", "default": true, + "title": "Enabled", "description": "Enable or disable the countdown plugin" }, "countdowns": { diff --git a/plugins/countdown/manifest.json b/plugins/countdown/manifest.json index c9569dd3..d1f22589 100644 --- a/plugins/countdown/manifest.json +++ b/plugins/countdown/manifest.json @@ -1,7 +1,7 @@ { "id": "countdown", "name": "Countdown Display", - "version": "3.1.0", + "version": "3.1.1", "author": "ChuckBuilds", "description": "Create and manage customizable countdowns with images. Perfect for birthdays, holidays, events, and special occasions.", "entry_point": "manager.py", @@ -21,6 +21,12 @@ ">=2.0.0" ], "versions": [ + { + "released": "2026-07-08", + "version": "3.1.1", + "notes": "Rewrite the README config section as a per-key table covering the v3 keys (target_time, mode, layout_preset, text_align, and the per-countdown style/layout overrides), add a title to the top-level enabled option, and normalize the versions changelog key to ledmatrix_min.", + "ledmatrix_min": "2.0.0" + }, { "released": "2026-05-30", "version": "3.1.0", @@ -44,12 +50,12 @@ { "released": "2026-03-06", "version": "2.0.0", - "ledmatrix_min_version": "2.0.0" + "ledmatrix_min": "2.0.0" }, { "released": "2026-03-06", "version": "1.0.2", - "ledmatrix_min_version": "2.0.0" + "ledmatrix_min": "2.0.0" } ], "update_interval": 30, @@ -58,5 +64,5 @@ "license": "MIT", "homepage": "https://github.com/ChuckBuilds/ledmatrix-plugins/tree/main/plugins/countdown", "config_schema": "config_schema.json", - "last_updated": "2026-05-30" + "last_updated": "2026-07-08" } From 43232730214c0f40d8f6a6926f35e852fccb8e77 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 9 Jul 2026 18:11:18 +0000 Subject: [PATCH 6/9] chore(license): standardize these plugins to GPL-3.0 (not MIT) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per project policy the whole repo is GPL-3.0. This PR originally added MIT LICENSE files (matching those plugins' declared MIT manifests); switch them to GPL-3.0 instead so nothing ships as MIT: - geochron, nfl-draft, on-air, tide-display: LICENSE file + manifest "license" field MIT -> GPL-3.0. All are first-party (ChuckBuilds), so the relicense is the copyright holder's call; MIT is GPL-compatible. - ledmatrix-elections: add a GPL-3.0 LICENSE (it shipped without one) and declare it in the manifest; bump 1.1.0 -> 1.1.1. This plugin is a third-party contribution (rpierce99) — under the repo's inbound=outbound GPL policy (CONTRIBUTING.md) it is already GPL-licensed to the project. No code changes. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01F9Saiat9CQmNi3DeDdvacB --- plugins.json | 6 ++--- plugins/geochron/LICENSE | 30 ++++++++++------------- plugins/geochron/manifest.json | 4 +-- plugins/ledmatrix-elections/LICENSE | 17 +++++++++++++ plugins/ledmatrix-elections/manifest.json | 11 +++++++-- plugins/nfl-draft/LICENSE | 30 ++++++++++------------- plugins/nfl-draft/manifest.json | 4 +-- plugins/on-air/LICENSE | 30 ++++++++++------------- plugins/on-air/manifest.json | 4 +-- plugins/tide-display/LICENSE | 30 ++++++++++------------- plugins/tide-display/manifest.json | 4 +-- 11 files changed, 89 insertions(+), 81 deletions(-) create mode 100644 plugins/ledmatrix-elections/LICENSE diff --git a/plugins.json b/plugins.json index c2bbb30b..59c4286e 100644 --- a/plugins.json +++ b/plugins.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "last_updated": "2026-07-08", + "last_updated": "2026-07-09", "plugins": [ { "id": "7-segment-clock", @@ -943,10 +943,10 @@ "plugin_path": "plugins/ledmatrix-elections", "stars": 0, "downloads": 0, - "last_updated": "2026-06-15", + "last_updated": "2026-07-08", "verified": false, "screenshot": "", - "latest_version": "1.1.0" + "latest_version": "1.1.1" }, { "id": "ledmatrix-dresden-departures", diff --git a/plugins/geochron/LICENSE b/plugins/geochron/LICENSE index 90aa34a6..e653a0c1 100644 --- a/plugins/geochron/LICENSE +++ b/plugins/geochron/LICENSE @@ -1,21 +1,17 @@ -MIT License +GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 -Copyright (c) 2026 ChuckBuilds +Copyright (C) 2025 LEDMatrix Team -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/plugins/geochron/manifest.json b/plugins/geochron/manifest.json index 4d8fcf32..2e20d683 100644 --- a/plugins/geochron/manifest.json +++ b/plugins/geochron/manifest.json @@ -14,7 +14,7 @@ { "released": "2026-07-08", "version": "1.0.1", - "notes": "Add MIT LICENSE file matching the manifest's declared license.", + "notes": "Add a GPL-3.0 LICENSE file (project-standard license).", "ledmatrix_min": "2.0.0" }, { @@ -26,7 +26,7 @@ "update_interval": 45, "default_duration": 20, "icon": "fa-globe", - "license": "MIT", + "license": "GPL-3.0", "homepage": "https://github.com/ChuckBuilds/ledmatrix-plugins/tree/main/plugins/geochron", "config_schema": "config_schema.json", "last_updated": "2026-07-08", diff --git a/plugins/ledmatrix-elections/LICENSE b/plugins/ledmatrix-elections/LICENSE new file mode 100644 index 00000000..e653a0c1 --- /dev/null +++ b/plugins/ledmatrix-elections/LICENSE @@ -0,0 +1,17 @@ +GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 + +Copyright (C) 2025 LEDMatrix Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/plugins/ledmatrix-elections/manifest.json b/plugins/ledmatrix-elections/manifest.json index f8aee428..2e83dcbc 100644 --- a/plugins/ledmatrix-elections/manifest.json +++ b/plugins/ledmatrix-elections/manifest.json @@ -1,7 +1,7 @@ { "id": "ledmatrix-elections", "name": "Election Results", - "version": "1.1.0", + "version": "1.1.1", "author": "rpierce99", "description": "Live election results: a scrolling ticker of important races plus a full-screen interrupt when a race is newly called. Auto-activates for your state's primary + general (dormant otherwise), drains stale calls from the ticker, and survives restarts. Filterable to your state. NYT baseline provider + optional California SoS county/city rollup.", "entry_point": "manager.py", @@ -22,6 +22,12 @@ "cache_manager" ], "versions": [ + { + "released": "2026-07-08", + "version": "1.1.1", + "notes": "Add a GPL-3.0 LICENSE file (project-standard license; this plugin previously shipped without one).", + "ledmatrix_min": "2.0.0" + }, { "released": "2026-06-15", "version": "1.1.0", @@ -46,11 +52,12 @@ "ledmatrix_min": "2.0.0" } ], - "last_updated": "2026-06-15", + "last_updated": "2026-07-08", "stars": 0, "downloads": 0, "verified": false, "screenshot": "", + "license": "GPL-3.0", "config_schema": "config_schema.json", "compatible_versions": [ ">=2.0.0" diff --git a/plugins/nfl-draft/LICENSE b/plugins/nfl-draft/LICENSE index 90aa34a6..e653a0c1 100644 --- a/plugins/nfl-draft/LICENSE +++ b/plugins/nfl-draft/LICENSE @@ -1,21 +1,17 @@ -MIT License +GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 -Copyright (c) 2026 ChuckBuilds +Copyright (C) 2025 LEDMatrix Team -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/plugins/nfl-draft/manifest.json b/plugins/nfl-draft/manifest.json index 5a18a02d..51c14124 100644 --- a/plugins/nfl-draft/manifest.json +++ b/plugins/nfl-draft/manifest.json @@ -27,7 +27,7 @@ { "released": "2026-07-08", "version": "1.3.12", - "notes": "Add MIT LICENSE file matching the manifest's declared license.", + "notes": "Add a GPL-3.0 LICENSE file (project-standard license).", "ledmatrix_min": "2.0.0" }, { @@ -100,6 +100,6 @@ "uses_core_assets": true, "nfl_logos": "assets/sports/nfl_logos/" }, - "license": "MIT", + "license": "GPL-3.0", "last_updated": "2026-07-08" } diff --git a/plugins/on-air/LICENSE b/plugins/on-air/LICENSE index 90aa34a6..e653a0c1 100644 --- a/plugins/on-air/LICENSE +++ b/plugins/on-air/LICENSE @@ -1,21 +1,17 @@ -MIT License +GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 -Copyright (c) 2026 ChuckBuilds +Copyright (C) 2025 LEDMatrix Team -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/plugins/on-air/manifest.json b/plugins/on-air/manifest.json index 3732db2f..59939d2d 100644 --- a/plugins/on-air/manifest.json +++ b/plugins/on-air/manifest.json @@ -14,7 +14,7 @@ { "released": "2026-07-08", "version": "1.2.1", - "notes": "Add MIT LICENSE file matching the manifest's declared license. Remove the invalid update_interval:0 manifest field (this plugin is MQTT push-driven and does not poll, matching mqtt-notifications).", + "notes": "Add a GPL-3.0 LICENSE file (project-standard license). Remove the invalid update_interval:0 manifest field (this plugin is MQTT push-driven and does not poll, matching mqtt-notifications).", "ledmatrix_min": "2.0.0" }, { @@ -38,7 +38,7 @@ ], "default_duration": 5, "icon": "fa-circle-dot", - "license": "MIT", + "license": "GPL-3.0", "homepage": "https://github.com/ChuckBuilds/ledmatrix-plugins/tree/main/plugins/on-air", "config_schema": "config_schema.json", "last_updated": "2026-07-08", diff --git a/plugins/tide-display/LICENSE b/plugins/tide-display/LICENSE index 90aa34a6..e653a0c1 100644 --- a/plugins/tide-display/LICENSE +++ b/plugins/tide-display/LICENSE @@ -1,21 +1,17 @@ -MIT License +GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 -Copyright (c) 2026 ChuckBuilds +Copyright (C) 2025 LEDMatrix Team -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/plugins/tide-display/manifest.json b/plugins/tide-display/manifest.json index 6080c1a2..76270c99 100644 --- a/plugins/tide-display/manifest.json +++ b/plugins/tide-display/manifest.json @@ -14,7 +14,7 @@ { "released": "2026-07-08", "version": "1.1.1", - "notes": "Add MIT LICENSE file matching the manifest's declared license.", + "notes": "Add a GPL-3.0 LICENSE file (project-standard license).", "ledmatrix_min": "2.0.0" }, { @@ -49,7 +49,7 @@ "update_interval": 3600, "default_duration": 12, "icon": "fa-water", - "license": "MIT", + "license": "GPL-3.0", "homepage": "https://github.com/ChuckBuilds/ledmatrix-plugins/tree/main/plugins/tide-display", "config_schema": "config_schema.json", "last_updated": "2026-07-08", From d6c27c5bd5cf4012b6fda39e17f84677ff1c5815 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 9 Jul 2026 18:14:37 +0000 Subject: [PATCH 7/9] chore(license): set countdown manifest license to GPL-3.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit countdown's LICENSE file was already GPL-3.0 but its manifest declared MIT; align the manifest to the file (project standard). Folded into the pending 3.1.1 changelog entry — no extra version bump. Rides on a merge of the #173 branch, which flips geochron/nfl-draft/on-air/ tide-display to GPL-3.0 and adds ledmatrix-elections' LICENSE, keeping this stacked branch consistent with #173's licensing. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01F9Saiat9CQmNi3DeDdvacB --- plugins/countdown/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/countdown/manifest.json b/plugins/countdown/manifest.json index d1f22589..f29fd99a 100644 --- a/plugins/countdown/manifest.json +++ b/plugins/countdown/manifest.json @@ -24,7 +24,7 @@ { "released": "2026-07-08", "version": "3.1.1", - "notes": "Rewrite the README config section as a per-key table covering the v3 keys (target_time, mode, layout_preset, text_align, and the per-countdown style/layout overrides), add a title to the top-level enabled option, and normalize the versions changelog key to ledmatrix_min.", + "notes": "Rewrite the README config section as a per-key table covering the v3 keys (target_time, mode, layout_preset, text_align, and the per-countdown style/layout overrides), add a title to the top-level enabled option, normalize the versions changelog key to ledmatrix_min, and set the manifest license to GPL-3.0 (project standard; the LICENSE file was already GPL).", "ledmatrix_min": "2.0.0" }, { @@ -61,7 +61,7 @@ "update_interval": 30, "default_duration": 15, "icon": "fa-clock", - "license": "MIT", + "license": "GPL-3.0", "homepage": "https://github.com/ChuckBuilds/ledmatrix-plugins/tree/main/plugins/countdown", "config_schema": "config_schema.json", "last_updated": "2026-07-08" From 3fab1c954af1bbbd022ea2f5663ae661c92c32c6 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 9 Jul 2026 18:21:53 +0000 Subject: [PATCH 8/9] docs(countdown): fix README license section to GPL-3.0 The README license line still said "MIT License"; align it with the GPL-3.0 manifest + LICENSE (repo-wide MIT -> GPL-3.0 standardization). Docs only; countdown is already version-bumped in this PR. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01F9Saiat9CQmNi3DeDdvacB --- plugins/countdown/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/countdown/README.md b/plugins/countdown/README.md index 67233506..391e8859 100644 --- a/plugins/countdown/README.md +++ b/plugins/countdown/README.md @@ -212,7 +212,7 @@ Feel free to submit issues, feature requests, or pull requests! ## License -MIT License - See LICENSE file for details +Released under the GNU General Public License v3.0 — see the LICENSE file for details. ## Credits From 13524703969469c59328616f1b521c256cf2c1b2 Mon Sep 17 00:00:00 2001 From: ChuckBuilds Date: Fri, 10 Jul 2026 12:56:06 -0400 Subject: [PATCH 9/9] fix(plugins): use ledmatrix_min_version, not deprecated ledmatrix_min This PR's changelog normalization went the wrong direction: it converted each touched plugin's versions[] entries from ledmatrix_min_version to ledmatrix_min. The core's own validator (store_manager.py, _validate_manifest_version_fields) explicitly flags ledmatrix_min as deprecated and expects ledmatrix_min_version, so every real device install/update of these 5 plugins would start logging a fresh "deprecated field" warning that wasn't there before. Revert the field name direction (and the changelog notes describing the change) so it actually matches the core's documented, non-deprecated field. --- plugins/7-segment-clock/manifest.json | 10 +++++----- plugins/calendar/manifest.json | 12 ++++++------ plugins/countdown/manifest.json | 16 ++++++++-------- plugins/on-air/manifest.json | 10 +++++----- plugins/static-image/manifest.json | 10 +++++----- 5 files changed, 29 insertions(+), 29 deletions(-) diff --git a/plugins/7-segment-clock/manifest.json b/plugins/7-segment-clock/manifest.json index 2404b210..7d007189 100644 --- a/plugins/7-segment-clock/manifest.json +++ b/plugins/7-segment-clock/manifest.json @@ -27,23 +27,23 @@ { "released": "2026-07-08", "version": "1.0.3", - "notes": "Rewrite the README to match the actual config schema: remove the documented-but-removed sunrise/sunset color-transition options and location lat/lng/locality keys, and document the real color and digit_spacing options. Normalize the versions changelog key to ledmatrix_min.", - "ledmatrix_min": "2.0.0" + "notes": "Rewrite the README to match the actual config schema: remove the documented-but-removed sunrise/sunset color-transition options and location lat/lng/locality keys, and document the real color and digit_spacing options. Normalize the versions changelog key to ledmatrix_min_version.", + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-06-07", "version": "1.0.2", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-05-15", "version": "1.0.1", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "version": "1.0.0", "released": "2026-04-07", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" } ], "last_updated": "2026-07-08" diff --git a/plugins/calendar/manifest.json b/plugins/calendar/manifest.json index 6b81152a..e8ea97b9 100644 --- a/plugins/calendar/manifest.json +++ b/plugins/calendar/manifest.json @@ -38,28 +38,28 @@ { "released": "2026-07-08", "version": "1.1.3", - "notes": "Document the config in a per-key table (including the previously-undocumented customization fonts), add web-UI titles to the untitled options (Max Events, Show All-Day Events, durations, Update Interval), and normalize the versions changelog key to ledmatrix_min.", - "ledmatrix_min": "2.0.0" + "notes": "Document the config in a per-key table (including the previously-undocumented customization fonts), add web-UI titles to the untitled options (Max Events, Show All-Day Events, durations, Update Interval), and normalize the versions changelog key to ledmatrix_min_version.", + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-05-15", "version": "1.1.2", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-04-24", "version": "1.1.1", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-03-02", "version": "1.1.0", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2025-10-19", "version": "1.0.1", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" } ], "last_updated": "2026-07-08", diff --git a/plugins/countdown/manifest.json b/plugins/countdown/manifest.json index f29fd99a..2ea55540 100644 --- a/plugins/countdown/manifest.json +++ b/plugins/countdown/manifest.json @@ -24,38 +24,38 @@ { "released": "2026-07-08", "version": "3.1.1", - "notes": "Rewrite the README config section as a per-key table covering the v3 keys (target_time, mode, layout_preset, text_align, and the per-countdown style/layout overrides), add a title to the top-level enabled option, normalize the versions changelog key to ledmatrix_min, and set the manifest license to GPL-3.0 (project standard; the LICENSE file was already GPL).", - "ledmatrix_min": "2.0.0" + "notes": "Rewrite the README config section as a per-key table covering the v3 keys (target_time, mode, layout_preset, text_align, and the per-countdown style/layout overrides), add a title to the top-level enabled option, normalize the versions changelog key to ledmatrix_min_version, and set the manifest license to GPL-3.0 (project standard; the LICENSE file was already GPL).", + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-05-30", "version": "3.1.0", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-05-30", "version": "3.0.1", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-05-30", "version": "3.0.0", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-05-15", "version": "2.0.1", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-03-06", "version": "2.0.0", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-03-06", "version": "1.0.2", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" } ], "update_interval": 30, diff --git a/plugins/on-air/manifest.json b/plugins/on-air/manifest.json index 8e1eeee6..e0135dac 100644 --- a/plugins/on-air/manifest.json +++ b/plugins/on-air/manifest.json @@ -15,31 +15,31 @@ "released": "2026-07-08", "version": "1.2.2", "notes": "Update the README to match the current config schema and behavior: replace the removed pulsing/glow/tally-dot options with the actual text color, background color, font, and Home Assistant discovery fields; fix the per-message color/bg payload docs; and drop the broken preview image reference.", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-07-08", "version": "1.2.1", "notes": "Add a GPL-3.0 LICENSE file (project-standard license). Remove the invalid update_interval:0 manifest field (this plugin is MQTT push-driven and does not poll, matching mqtt-notifications).", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-06-08", "version": "1.2.0", "notes": "Fully customisable display: text, font path, font size, text color, background color. Removed animation/glow/tally-dot. Font loaded via PIL ImageFont.truetype with auto fallback to built-in display fonts. Per-MQTT-message color and bg override via JSON payload.", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-06-08", "version": "1.1.0", "notes": "Add HA MQTT Auto-Discovery: plugin publishes device + switch/sensor/binary_sensor configs on connect so HA creates the device automatically. Adds LWT for accurate offline detection. New config fields: ha_discovery, discovery_prefix, device_name.", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-06-07", "version": "1.0.0", "notes": "Initial release. MQTT-driven ON AIR tally light with pulsing red glow, state feedback topic, and Home Assistant switch compatibility.", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" } ], "default_duration": 5, diff --git a/plugins/static-image/manifest.json b/plugins/static-image/manifest.json index 9ff04c0f..64eb9d06 100644 --- a/plugins/static-image/manifest.json +++ b/plugins/static-image/manifest.json @@ -21,23 +21,23 @@ { "released": "2026-07-08", "version": "1.0.4", - "notes": "Correct the README config docs: document all rotation_mode values (sequential/random/time_based/date_based), describe images as scheduled image entries rather than plain paths, and add a Per-Image Scheduling section. Normalize the versions changelog key to ledmatrix_min.", - "ledmatrix_min": "2.0.0" + "notes": "Correct the README config docs: document all rotation_mode values (sequential/random/time_based/date_based), describe images as scheduled image entries rather than plain paths, and add a Per-Image Scheduling section. Normalize the versions changelog key to ledmatrix_min_version.", + "ledmatrix_min_version": "2.0.0" }, { "released": "2026-05-15", "version": "1.0.3", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "version": "1.0.2", "released": "2025-11-05", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" }, { "released": "2025-10-19", "version": "1.0.1", - "ledmatrix_min": "2.0.0" + "ledmatrix_min_version": "2.0.0" } ], "last_updated": "2026-07-08",