Skip to main content

led-ticker-telnet

Watch your led-ticker sign live in any ANSI-capable terminal — the same content that drives your LED panels streams over TCP as true-color ANSI escape sequences.

Every client sees the current frame the moment swap() fires, at panel cadence. Open two terminals, disconnect one, start another — the sign keeps rendering without interruption.

Prerequisites

  • A working led-ticker install (core ≥ 2.2).
  • An ANSI-capable terminal (any modern terminal on macOS, Linux, or Windows Terminal). True-color support (24-bit) recommended; most terminals released after 2017 support it.
  • telnet or nc on the connecting machine (both are standard on macOS and most Linux distros).

Install

This plugin auto-registers via the led_ticker.plugins entry point — once the package is installed, no [plugins] config change is needed.

Into a containerized led-ticker (recommended): add the package to your config/requirements-plugins.txt and rebuild:

led-ticker-telnet
# in your led-ticker checkout
docker compose up -d --build

Standalone (a venv that already has led-ticker):

pip install led-ticker-telnet

See the led-ticker Plugins docs for the constraint-based install the Docker image uses.

Select the backend

In your config/config.toml, set the backend field under [display]:

[display]
backend = "telnet.telnet"
rows = 16
cols = 32
chain_length = 5
brightness = 80
default_scale = 1

The backend name is telnet.telnet — the first telnet is the plugin namespace (from the entry-point registration), and the second names the backend within that namespace.

All other [display] fields (rows, cols, chain_length, default_scale, etc.) work exactly as they do with the rgbmatrix backend. Your widgets, sections, and transitions config is unchanged.

Connect

Once led-ticker starts with the telnet backend, connect from any machine on the same network:

telnet <host> 2300  # default; see Configuration to change
nc <host> 2300  # default; see Configuration to change

Replace <host> with the hostname or IP of the machine running led-ticker. When connecting locally: telnet localhost 2300.

The terminal renders one text row per two canvas rows, using the Unicode UPPER HALF BLOCK character (▀) with the top pixel as the foreground color and the bottom pixel as the background color. This doubles the vertical pixel density in most terminals.

Disconnecting cleanly (Ctrl-C or closing the terminal window) is safe — led-ticker logs the departure and continues running.

Configuration via environment variables

The telnet backend reads two environment variables at startup:

Variable Default Description
LED_TICKER_TELNET_PORT 2300 TCP port to listen on
LED_TICKER_TELNET_HOST 0.0.0.0 Bind address (all interfaces)

Set them in your shell or in Docker Compose:

# shell
export LED_TICKER_TELNET_PORT=3000
# docker compose (compose.yaml)
environment:
  LED_TICKER_TELNET_PORT: "3000"
  # LED_TICKER_TELNET_HOST: "0.0.0.0"   # bind address; default is all interfaces

Known limitations

brightness is a no-op. The [display] brightness field is required by led-ticker's backend protocol but has no effect on ANSI output — adjust brightness/contrast in your terminal instead.

pixel_mapper_config is accepted but ignored. The telnet backend accepts the pixel_mapper_config argument (required by led-ticker's backend constructor convention) but does not apply any chain-folding or U-mapper remapping — it renders the logical canvas directly to the terminal. Physical-panel layout concerns (serpentine chains, rotation) are a hardware-level concern irrelevant to a terminal preview.

TOML [display] sub-keys are not readable by plugin backends today. The port and host are therefore environment-only — there is no port = 2300 or host = "0.0.0.0" key in the [display] block.

A future led-ticker-core [display.<backend>] → from_config(cls, cfg) mechanism would close this: plugins could define their own sub-table and receive a typed config object at startup. Port and host would then be first-class TOML knobs alongside brightness, rows, and the rest. This is the key usability gap to resolve in a follow-up core change.

Behavior under error conditions

  • Bind failure (port in use, insufficient permissions): the backend logs a warning and continues without a server. The sign renders normally; clients simply cannot connect until the conflict is resolved and led-ticker restarts.
  • Slow or stalled client: swap() writes to the client without waiting for a drain, so the render loop never blocks. Bytes a client hasn't read accumulate in that connection's in-process write buffer; to keep a stalled client (suspended nc, terminal under Ctrl-S flow control, congested link) from growing that buffer without bound, swap() checks each client's write-buffer size and skips the write for any client over a ~4 MiB cap — that frame is dropped for that client, which recovers automatically once it starts reading again. The render loop and other clients are unaffected.
  • Client disconnect mid-session: detected on the next swap() write; the client is pruned and rendering continues.

Development

cd plugins/telnet
uv sync --extra dev      # resolves led-ticker-core from PyPI
uv run pytest -q
uv run ruff check src tests
uv run pyright src

The plugin imports only the public led_ticker.plugin surface — tests/test_import_purity.py enforces it.

Headless smoke / profiling image

Dockerfile.smoke runs led-ticker fully headless (no rgbmatrix, no hardware) with this backend and the bundled smoke config — handy for a quick visual check or profiling the render path on any machine:

cd plugins/telnet
make smoke-run            # build + run, then: telnet localhost 2300
make smoke-stop           # stop + remove the container

Profile a different engine/Python or change the port:

docker build -f Dockerfile.smoke --build-arg CORE_VERSION=2.3.0 -t led-ticker-telnet-smoke .
docker run -d -p 3000:3000 -e LED_TICKER_TELNET_PORT=3000 led-ticker-telnet-smoke

Metadata

Release files for led-ticker-telnet 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for led-ticker-telnet 0.1.0
File Size Uploaded Provenance
led_ticker_telnet-0.1.0.tar.gz 17.2 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for led-ticker-telnet 0.1.0
File Interpreter ABI Platform
led_ticker_telnet-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 26.2 kB

Release files / led_ticker_telnet-0.1.0.tar.gz

Download URL led_ticker_telnet-0.1.0.tar.gz
Size 17.2 kB
Tags Source
SHA-256 checksum
How to use checksums
454de3b62bf8300b56fdb26f081fa165c106531461174b2b4bedb810fd4e3336
BLAKE2b-256 checksum
How to use checksums
bde68a2f9faa2c7831c8ede587d1bfb6bee69d5803374ce242ccd01971bb8442
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 29, 2026.

Transparency log

Release files / led_ticker_telnet-0.1.0-py3-none-any.whl

Download URL led_ticker_telnet-0.1.0-py3-none-any.whl
Size 9.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
733281bacf23319b9a4ce1e0923ec075e13c1be89cadb947d25b70c9e55102d0
BLAKE2b-256 checksum
How to use checksums
ddd9add5870daef54493d0c14c087aaca206b72600dddfa593dd03a250c5b356
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 29, 2026.

Transparency log

Security for led-ticker-telnet 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for led_ticker_telnet-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 29, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page