Skip to main content

Asyncio LED matrix display for news, weather, crypto, and more

Project description

led-ticker

CI License: MIT

An asyncio Python toolkit that drives RGB LED matrix panels from a Raspberry Pi via a TOML config. It runs HUB75 panels through an Adafruit RGB Matrix HAT (or Bonnet) on top of jamesawesome/rpi-rgb-led-matrix — our modified fork of hzeller/rpi-rgb-led-matrix that adds Raspberry Pi 5 (RP1) support and a few patches — so anything that library drives, led-ticker drives. Two reference builds share one codebase and one Docker image:

  • Smallsign — Pi 4 + 5× chained 16×32 panels = 160×16 logical canvas
  • Bigsign — Pi 5 + 8× P3 32×64 panels in a 2×4 vertical-serpentine layout = 256×64 canvas

New to LED signs? Why led-ticker? covers when a Raspberry Pi HUB75 sign is the right tool — and when WLED, Tidbyt, or an ESP32 clock fits better.

Full documentation: https://docs.ledticker.dev

Quick start

git clone https://github.com/JamesAwesome/led-ticker.git
cd led-ticker
make dev
cp config/config.example.toml config/config.toml  # or config.bigsign.example.toml
led-ticker --config config/config.toml

For hardware setup, BOM, and wiring diagrams see docs.ledticker.dev/hardware/building-your-own.

Configuration

Everything is configured via a TOML file. Three reference configs ship in config/:

  • config.example.toml — smallsign starter (160×16)
  • config.bigsign.example.toml — bigsign with pixel_mapper_config, scaling, RP1 tuning (256×64)
  • config.firebird.example.toml — realistic bigsign storefront layout (Firebird Yoga)

Full config reference: https://docs.ledticker.dev/reference/config-options/. Per-widget pages document every knob: https://docs.ledticker.dev/widgets/.

Engine

The display engine is published on PyPI as led-ticker-core:

pip install led-ticker-core

Plugins

Extra widgets (and other extension points) are installed as plugins, declared in a pip-requirements file. The first-party plugins live in the led-ticker-plugins monorepo — one package each, each with its own README. Install them like this:

cp config/requirements-plugins.example.txt config/requirements-plugins.txt
# edit to add/remove plugins, then restart (no image rebuild needed):
docker compose restart

The live config/requirements-plugins.txt is gitignored (it's yours to customize); the tracked .example lists all the first-party plugins (pool, baseball, crypto, calendar, RSS, weather, and the flair transitions) as a starting point — trim it to what your sign uses. Installed plugins auto-register via their led_ticker.plugins entry point — no [plugins] config change needed.

First-party data plugins are on PyPI — add them by name:

Plugin PyPI package Widget types
Pool led-ticker-pool pool.monitor
Baseball / MLB led-ticker-baseball baseball.scores, .standings, .promotions, .statcast, .attendance
CoinGecko crypto led-ticker-crypto crypto.coingecko
Calendar (.ics) led-ticker-calendar calendar.events
RSS/Atom feeds led-ticker-rss rss.feed
Weather led-ticker-weather weather.current

The homage sprite-trail transitions (nyancat, pokeball, pacman, sailor_moon) ship together on PyPI as led-ticker-flair — one install adds all four (transition = "nyancat.forward" etc.) plus the :pokeball.ball: emoji.

Browse the first-party plugins in the led-ticker-plugins monorepo — they double as worked examples. Building your own? The plugin authoring guide walks you through shipping it as a standalone package in your own repo — no fork, no monorepo PR needed.

Pre-flight a config before deploying:

make validate CONFIG=config/config.toml

led-ticker validate checks the config against a registry of decision rules — bad font sizes, scroll-mode + stretch collisions, content-height overflow. Exits non-zero on errors. Useful in CI. Full output format: https://docs.ledticker.dev/tools/validate/.

Development

make dev        # Install deps (requires uv)
make test       # Run tests (no Docker needed; uses test stubs for rgbmatrix)
make lint       # Run ruff linter
make format     # Auto-format code
make validate CONFIG=config/config.toml  # Pre-flight a config

Tests use a stub rgbmatrix package so they run on any machine — no Raspberry Pi or Docker required. ~1450 tests, ~2 min on a laptop.

New contributors: start with CONTRIBUTING.md (setup, the change flow, where things live). CLAUDE.md holds the load-bearing invariants — the hardware-rendering constraints and per-subsystem rules — and has the step-by-step recipes for adding a widget or transition + the test-stub canvas contract.

Deployment

Docker on Raspberry Pi

docker compose up -d

The compose file mounts ./config read-only into the container; edit TOML on the host and the running display hot-reloads most changes live (widgets, sections, schedule, brightness) — a restart is needed only for hardware-level fields like the panel chain or scaling.

Web UI (optional)

An optional sidecar serves a read-only status dashboard (live preview, monitors, plugins, inventory) plus a token-gated config editor. Enable it with the webui compose profile — COMPOSE_PROFILES=webui docker compose up -d. Details: https://docs.ledticker.dev/concepts/web-status-ui/.

The header shows the deployed build (build <branch>@<sha>). Rebuild the sign so the display and the webui sidecar both land on the new code with make rebuild (a stamped docker compose up -d --build --force-recreate with the webui profile) — a bare docker compose up -d --build rebuilds the image but leaves the profile-gated webui container on the old one.

Systemd

deploy/led-ticker.service and deploy/install.sh manage auto-start and auto-restart-on-crash. Full deploy walkthrough: https://docs.ledticker.dev/hardware/building-your-own/.

Hardware

The single Docker image detects the SoC at runtime and selects the BCM2711 GPIO backend (Pi 4) or the RP1 PIO/RIO backend (Pi 5). On the Pi 5 the RP1 RIO backend is the default; the runtime CLI accepts --led-rp1-pio=1 to force the low-CPU PIO backend. For chain ≥ 2 with flicker raise gpio_slowdown from 2 to 3+.

Hardware reference (BOM, wiring, panel-tuning knobs): https://docs.ledticker.dev/hardware/building-your-own/.

Hardware compatibility

led-ticker works with the same hardware as the underlying jamesawesome/rpi-rgb-led-matrix library (our fork of hzeller/rpi-rgb-led-matrix):

  • Controller boards: Adafruit RGB Matrix HAT and RGB Matrix Bonnet (hardware_mapping = "adafruit-hat"). Other HUB75 wiring/GPIO mappings supported by the library also work.
  • Panels: HUB75 RGB LED matrix panels — any pitch (P3, P4, P5, …). The reference builds use P3 32×64 and 16×32 panels; chains and serpentine layouts are configured in TOML.
  • Raspberry Pi: Pi 4 (BCM2711 GPIO backend) and Pi 5 (RP1 PIO/RIO backend). The single Docker image detects the SoC at runtime.

See the hardware reference for BOMs, wiring diagrams, and panel-tuning knobs.

Community

Origins & transparency

led-ticker began as an original asyncio LED-ticker library written by James Awesome, and was developed further with the use of Claude AI.

License

MIT © James Awesome

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

led_ticker_core-2.3.0.tar.gz (18.7 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

led_ticker_core-2.3.0-py3-none-any.whl (957.8 kB view details)

Uploaded Python 3

File details

Details for the file led_ticker_core-2.3.0.tar.gz.

File metadata

  • Download URL: led_ticker_core-2.3.0.tar.gz
  • Upload date:
  • Size: 18.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for led_ticker_core-2.3.0.tar.gz
Algorithm Hash digest
SHA256 0c71eb5a0f2d10e60f28278042bdaf9ee50bf9e69527cbf25687d04b532596f9
MD5 6664e485fd13357092e3415f8a2afad3
BLAKE2b-256 cc04e24c58ba651b1465c34cbdcf007f2f4a1a3a66934e05fd06ab420d36fdd2

See more details on using hashes here.

Provenance

The following attestation bundles were made for led_ticker_core-2.3.0.tar.gz:

Publisher: publish.yml on JamesAwesome/led-ticker

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file led_ticker_core-2.3.0-py3-none-any.whl.

File metadata

  • Download URL: led_ticker_core-2.3.0-py3-none-any.whl
  • Upload date:
  • Size: 957.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for led_ticker_core-2.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 cac858a5dec2b46aca2aa1f2443677f88afa1fa1ad33cbcd0e6d3946665874bf
MD5 609fc5a5934fc21605c32e13e7b11443
BLAKE2b-256 db44773230c48e1c48b05c9252c1937f6bcee7fba8e5977c1c884f8c24f1c8c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for led_ticker_core-2.3.0-py3-none-any.whl:

Publisher: publish.yml on JamesAwesome/led-ticker

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page