Skip to content

TrmnlTelegram

Dennis Lee edited this page Jul 23, 2026 · 3 revisions

title: trmnl-telegram radar_quadrant: Tools radar_ring: Assess radar_position: outer

trmnl-telegram

TRMNL is a networked e-ink display device that shows content through integrations. Getting an arbitrary document onto it normally means building a custom plugin. trmnl-telegram is a self-hosted bridge that turns a Telegram chat into the input channel: a user sends an image, PDF, or EPUB to a bot and it renders to the device. The project is a small MIT-licensed Python tool.

Radar Assessment

Assess. The repository is a convenience bridge for one specific device, small in scope and adoption (11 stars, last pushed September 2025, no open issues at the time of writing). Outer position reflects the niche use case, low adoption, and the absence of first-person production use; it is worth exploring rather than committing to.

What It Does

  • Receives files through a Telegram bot, with an optional user-ID allowlist for access control.
  • Converts EPUB files to PDF, then extracts PDF pages as images with page navigation.
  • Pushes rendered images to TRMNL through a Private Plugin webhook.
  • Deploys via Docker, uses uv for dependency management, and supports configurable display dimensions (default 480x800).

Hosting Requirement

trmnl-telegram runs as a persistent process that long-polls Telegram for messages. It is not ephemeral and does not fit a scheduled or serverless host: PDF page navigation uses interactive buttons, and each button press is a live callback the process must answer within seconds. A fire-and-forget host can push a single page but loses navigation. Practical deployment is an always-on host, such as a small VPS, a home device, or a hobby-tier container platform, using the project's Docker Compose file.

Trial Path

The intended way to trial this on an always-on host, recorded so the decisions do not have to be re-derived later. Not yet executed; running the bot in production against this pipeline is the gate to promote this blip to Trial.

The approach is a manual "image-mirror and reconcile" pipeline: because upstream ships no published image, a CI job builds the tool's source into a private registry image, and a deploy job reconciles it onto the host with an idempotent docker compose up -d. The build runs off the host, so the small VPS stays a pull-only target.

Decision Choice Why
CI platform GitLab CI on the self-hosted dbmacm3 runner Reuses the existing SSH-to-host deploy precedent
Registry GHCR, image tagged by upstream commit SHA Traceable, rollback-able; SHA tag enables the skip check
Idempotent build Skip build+push if the SHA image already exists Unchanged upstream is a no-op end to end
Trigger Manual No push to react to; upstream is third-party
Build source Build from src/ in CI Upstream ships no prebuilt image (build: ./src/.)
Deploy auth SSH as root by key Non-interactive; sudo has no TTY in a pipeline
Reconcile docker compose up -d against the pinned tag No-op if current, self-heals if the container died
Reboot survival restart: unless-stopped Container returns after a host reboot, no pipeline run
Secrets Bot token + plugin UUID in the lpass global/env note Never baked into the image or the repo

The runnable pipeline (.gitlab-ci.yml, image-based compose, CI/CD variables) will live in a separate deployment repository; this section records the reasoning, not the executable spec.

Why It Matters

The bridge removes the need to hand-build a plugin for the common case of pushing a document or image to a TRMNL screen, using a chat app most people already have open.

References

Clone this wiki locally