Replaces the hand-written Tailwind subset in app.css with a real, purged Tailwind build: scripts/build_css.py runs the pinned, SHA-256-checked standalone Tailwind CLI (no Node), the generated tailwind.css and plugin-frame.css are committed, and CI fails when they are stale. The Pi never builds anything. The login page (#683) now links tailwind.css too, and the load-order test covers every template that links app.css. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5.1 KiB
Contributing to LEDMatrix
Thanks for considering a contribution! LEDMatrix is built with help from the community and we welcome bug reports, plugins, documentation improvements, and code changes.
Quick links
- Bugs / feature requests: open an issue using one of the templates
in
.github/ISSUE_TEMPLATE/. - Real-time discussion: the LEDMatrix Discord.
- Plugin development:
docs/PLUGIN_DEVELOPMENT_GUIDE.mdand theledmatrix-pluginsrepository. - Security issues: see
SECURITY.md. Please don't open public issues for vulnerabilities.
Setting up a development environment
- Clone with submodules:
git clone --recurse-submodules https://github.com/ChuckBuilds/LEDMatrix.git cd LEDMatrix - For development without hardware, run the dev preview server:
See
python3 scripts/dev_server.py # then open http://localhost:5001docs/DEV_PREVIEW.mdfor details. - To run the full display in emulator mode:
EMULATOR=true python3 run.py - To target real hardware on a Raspberry Pi, follow the install
instructions in the root
README.md.
Running the tests
pip install -r requirements.txt -r requirements-test.txt
pytest
See docs/HOW_TO_RUN_TESTS.md for details
on test markers, the per-plugin tests, and the web-interface
integration tests.
Submitting changes
- Open an issue first for non-trivial changes. This avoids wasted work on PRs that don't fit the project direction.
- Create a topic branch off
main:feat/<short-description>,fix/<short-description>,docs/<short-description>. - Keep PRs focused. One conceptual change per PR. If you find adjacent bugs while working, fix them in a separate PR.
- Follow the existing code style. The pre-commit hooks run
flake8(E9, F63, F7, F82 plus bugbearBchecks),bandit, andgitleaks— install the CLI withpython -m pip install pre-commit, then runpre-commit installso they run on every commit. Type checking is a ratchet while the existing mypy errors insrc/are paid down:mypy-clean.txtlists the modules that type-check clean, and CI runspython scripts/check_types.py(also the manual hookpre-commit run mypy --hook-stage manual) to keep every listed module clean. When you make another module clean, add it to the list (sorted); don't take one off to get CI green. Keep type fixes annotation-only where you can -- widen a hint rather than delete a defensive runtime check mypy calls unreachable. HTML/JS inweb_interface/follows the patterns already intemplates/v3/andstatic/v3/. If you change a template or a static JS file, runpython3 scripts/build_css.pyand commit the regeneratedstatic/v3/tailwind.csswith it -- CI fails when the committed CSS is out of date. It needs no Node; seeweb_interface/README.md. - Update documentation alongside code changes. If you add a
config key, document it in the relevant
*.mdfile (or, for plugins, inconfig_schema.jsonso the form is auto-generated). - Run the tests locally before opening the PR.
- Use the PR template —
.github/PULL_REQUEST_TEMPLATE.mdwill prompt you for what we need.
Commit message convention
Conventional Commits is encouraged but not strictly enforced:
feat: add NHL playoff bracket displayfix(plugin-loader): handle missing class_name in manifestdocs: correct web UI port in TROUBLESHOOTING.mdrefactor(cache): consolidate strategy lookup
Keep the subject under 72 characters; put the why in the body.
Contributing a plugin
LEDMatrix plugins live in their own repository:
ledmatrix-plugins.
Plugin contributions go through that repo's
SUBMISSION.md
process. The
hello-world plugin
is the canonical starter template.
Reviewing pull requests
Maintainer review is by @ChuckBuilds. Community review is welcome on any open PR — leave constructive comments, test on your hardware if applicable, and call out anything unclear.
Code of conduct
This project follows the Contributor Covenant. By participating you agree to abide by its terms.
License
LEDMatrix is licensed under the GNU General Public License v3.0 or later. By submitting a contribution you agree to license it under the same terms (the standard "inbound = outbound" rule that GitHub applies by default).
LEDMatrix builds on
rpi-rgb-led-matrix,
which is GPL-2.0-or-later. The "or later" clause makes it compatible
with GPL-3.0 distribution.