self-hosted 5 min read

Tesserae – Self-Hosted Dashboards for E-Ink Displays

Turn your e-ink panel into a live dashboard with this open-source server. Compose in a browser, push over MQTT or REST, no cloud required.

By
Share: X in
Tesserae dashboard server for e-ink displays

TL;DR

TL;DR: Tesserae is a free, open-source dashboard server for e-ink displays. You compose dashboards in HTML, it renders them headless via Playwright, dithers the output to your panel’s color palette, and pushes frames over MQTT or REST. No cloud account, no telemetry.

What Is Tesserae?

Tesserae is a self-hosted dashboard companion for e-ink displays. If you have a Raspberry Pi driving a Pimoroni Inky, a Waveshare panel, a TRMNL device, or even a jailbroken Kindle gathering dust, Tesserae can turn it into a live, auto-refreshing dashboard.

The core idea is simple: dashboards are plain HTML pages. The editor loads the same URL the production render does — a headless Chromium (via Playwright) screenshots the composition at panel resolution, so what you see in the editor is exactly what appears on the wall.

From the Tesserae README:

Self-hosted dashboard companion for e-ink displays. Compose tile-based dashboards in a browser, render the frame headless, push it to one or more panels over MQTT or HTTP. Open source under AGPL-3.0-or-later. No SaaS, no telemetry, no cloud account required.

Source and Accuracy Notes

⚠️ This section is MANDATORY. All links must be verified from actual source, not guessed.

Hardware Supported

  • Pimoroni Inky Impression (via client daemon)
  • Waveshare panels (via custom firmware)
  • Seeed reTerminal
  • TRMNL devices
  • Jailbroken Kindles (via TRMNL client)

Setup Workflow

Step 1: Run the Server via Docker

The fastest path is Docker Compose:

mkdir tesserae && cd tesserae
curl -fsSLO https://raw.githubusercontent.com/dmellok/tesserae/main/docker-compose.yml
docker compose up -d

Open http://localhost:8765. The first request walks through password setup and an onboarding wizard.

Other install options are documented at docs.tesserae.ink/install:

  • Home Assistant App
  • LXC / Proxmox / MicroCloud
  • macOS / Linux / Pi shell installer
  • Windows PowerShell
  • Manual venv

Step 2: Pair Your Panel

Choose a hardware quickstart for your specific panel. The general flow:

  1. Install the Pi client (for always-on panels like Inky) or configure the REST endpoint (for battery clients like ESP32 or Kindle).
  2. The client daemon registers with the Tesserae server.
  3. From the compose UI, pair the panel to your account.

Step 3: Compose a Dashboard

  1. Open the editor at http://localhost:8765/compose.
  2. Add widgets — each is a plain HTML page. A widget gallery and community catalog are available.
  3. Preview renders at panel resolution in real time.
  4. Assign the dashboard to one or more panels and set a refresh cadence.

Step 4: Frames Reach the Panel

When a dashboard changes (or on a timer), Tesserae:

  1. Renders the HTML via headless Playwright.
  2. Runs Floyd-Steinberg dithering against the panel’s measured color palette.
  3. Packs bytes into the panel’s native format (4-bit Spectra 6, 1-bit mono, or 4-bit grayscale).
  4. Pushes over MQTT (always-on clients) or serves via REST with If-None-Match / 304 caching (battery clients).

How the Rendering Works

The README explains the rendering pipeline in detail:

The frame then goes through a per-device renderer: Floyd-Steinberg dithering against the panel’s measured color palette (Spectra 6 and ACeP panels don’t actually produce sRGB primaries; calibrated measurements come from epdoptimize), then packing into the exact byte format the panel wants.

This means color accuracy on multi-color e-ink panels depends on actual color measurements of your specific panel — not guesswork. Tesserae includes a calibration tool via epdoptimize to get those measurements.

Widget Architecture

Widgets, renderers, and device kinds are all drop-in plugins (folders). The developer documentation covers how to build a custom widget. The hardware support guide covers adding a new panel type.

Security Notes

  • No telemetry. The server phones home for nothing.
  • No cloud account required — everything runs on your own hardware.
  • MQTT can be secured with TLS; REST clients use If-None-Match to avoid redundant frame downloads.
  • Password setup is enforced on first launch.

FAQ

Q: Does this work with a Kindle Paperwhite? A: Yes — jailbroken Kindles with the TRMNL client can receive frames via REST. TRMNL is a supported Tesserae target.

Q: How does the panel update? Does it stay on Wi-Fi constantly? A: For always-on clients (Raspberry Pi + Inky), frames are pushed over MQTT the moment a dashboard changes. For battery clients (ESP32, Kindles), the device wakes, fetches only if the ETag changed (304 = skip), posts battery/RSSI telemetry, and deep-sleeps. No constant Wi-Fi draw.

Q: Can I use a custom HTML widget without writing code? A: Yes. The widget gallery has community-built widgets. You can also paste any public URL into the composer if it renders well at your panel’s resolution.

Q: Is there a Home Assistant integration? A: Yes — Tesserae has a Home Assistant App install path.

Conclusion

Tesserae solves a niche but satisfying problem: you already own e-ink panels that could be showing useful information, but the existing tools are either cloud-dependent or too rigid for custom dashboards. Tesserae’s HTML-first, self-hosted approach means you own the whole stack — from the widget HTML to the dithered bytes on your panel.

If you have any e-ink hardware gathering dust, Tesserae is worth a look. The Docker Compose install takes under five minutes.