Thanks for your interest! led-ticker is an asyncio Python toolkit that drives RGB
LED matrix panels from a Raspberry Pi. You can contribute without any hardware —
the test suite runs against a stub rgbmatrix package on any machine.
git clone https://github.com/JamesAwesome/led-ticker.git
cd led-ticker
make dev # uv sync — installs all deps + the git hooks
make test # pytest with coverage (no Docker, no hardware)
make lint # ruff
make format # ruff formatTests use a stub rgbmatrix so they run on any laptop (~2 min). Hardware is only
needed to validate real-panel rendering, which the maintainer does before release.
- Branch — work on a feature branch, never on
main. - Test-drive it — add or update tests alongside the change;
make testmust stay green. New behavior needs a test; bug fixes need a regression test. - Lint + format —
make lintandmake format(CI runs ruff; the hooks run on commit aftermake dev). - Docs — user-facing behavior is documented on the docs site
(https://docs.ledticker.dev). When you change docs-site pages, follow
docs/DOCS-STYLE.md(the style guide + per-page review rubric). - Open a PR against
main. Keep it focused; describe what changed and why. CI must be green before review.
CLAUDE.mdis the source of truth for the load-bearing invariants — the hardware-rendering constraints and per-subsystem rules that must hold when you touch the render path, widgets, transitions, or the scaling wrapper. Read the relevant section before changing that area.- Adding a widget / transition —
CLAUDE.mdhas step-by-step recipes (@register/@register_transition, thedraw()protocol, they_offsetcontract). The test-stub canvas contract (capture theSwapOnVSyncreturn,SetPixelworks everywhere, noGetPixel) is documented there too. - Plugins — extra widgets / transitions / emoji / fonts ship as plugins that
import only from the curated
led_ticker.pluginsurface. See the Plugin API reference and the authoring tutorial in the docs.
Open a thread in GitHub Discussions for questions, ideas, or show-and-tell. Use Issues for bugs and concrete feature requests.
By contributing, you agree your contributions are licensed under the project's MIT License, and you are expected to follow the Code of Conduct.