Self-hosted first
Runs entirely on infrastructure you control. No accounts, subscriptions, or mandatory cloud services.
SELF-HOSTED DASHBOARD SERVER
Build dashboards in your browser, render them server-side, and deploy them to Kindles, ESP32 displays, Raspberry Pis, TRMNL hardware, and custom e-paper devices.
AGPL-3.0-or-later · No telemetry · No cloud account required



Editor
Bind this page to one or more displays. The layout sizes to each device's panel.

1200 × 1600 · Pi Pico Plus + Inky Impression 13.3"
Architecture
A single Tesserae server drives Raspberry Pi, ESP32, Kindle, TRMNL and custom clients at the same time. Compose once; it renders server-side and fans frames out over MQTT or REST.
Supported hardware
Verified across the major e-ink families — with more on the bench. Add your own with a small adapter.
| Panel | Resolution | Status |
|---|---|---|
Seeed StudioTRMNL BYOS protocol All E Series and DIY Kit models share the TRMNL BYOS protocol. Pending rows mean hardware-side confirmation on Tesserae’s render path is in progress. | ||
| reTerminal E1001 | 800×480 | Pending |
| reTerminal E1002 | 800×480 | Pending |
| reTerminal E1003 | 1404×1872 | Verified |
| reTerminal E1004 | 1200×1600 | Pending |
| TRMNL 7.5" OG DIY Kit | 800×480 | Verified |
| XIAO 7.5" ePaper Panel | 800×480 | Pending |
Pimoroni Inkypi-png / pi-bin | ||
| Inky Impression 4" | 640×400 | Pending |
| Inky Impression 5.7" | 600×448 | Verified |
| Inky Impression 7.3" | 800×480 | Verified |
| Inky Impression 13.3" | 1600×1200 | Verified |
| Inky pHAT / wHAT | various | Verified |
WaveshareESP32 | ||
| Waveshare 13.3" Spectra 6 | 1200×1600 | Verified |
| Waveshare 7.3" PhotoPainter | 800×480 | Verified |
| Waveshare 4.2" B/W | 400×300 | Pending |
TRMNL-compatibleHTTP pull | ||
| TRMNL OG | 800×480 | Verified |
| TRMNL X | 1872×1404 | Pending |
| Kindle Paperwhite 2 (jailbroken) | 758×1024 | Verified |
Anything else: pick custom in Settings → Panel and set the dimensions. Statuses reflect real-hardware verification.
Gallery
Weather, transit, home status, dev metrics, now-playing — composed in the browser and rendered to crisp e-ink frames.
Why it exists
Tesserae wasn't built to compete with existing dashboard ecosystems. It solves a specific problem: how do you drive any e-paper display from a single, self-hosted system? Most projects optimise for one device family or one vendor — Tesserae takes a protocol-first approach instead.
Runs entirely on infrastructure you control. No accounts, subscriptions, or mandatory cloud services.
A single server drives Raspberry Pi panels, ESP32 devices, Kindles, TRMNL hardware, and custom clients at the same time.
Rendering, transport, and display hardware are separate concerns. MQTT and HTTP let clients with very different capabilities coexist.
New tiles, renderers, transports, and device clients can be added without changing the core architecture.
Designed for unusual hardware, custom firmware, prototypes, and one-off projects as well as polished installs.
Instead of asking “what dashboard should I run on this display?”Tesserae asks how one ecosystem can support every display.
That decision drives nearly every architectural choice in the project.
Lay out widgets in the browser editor.
The server rasterizes a dithered frame for the panel.
Send it over MQTT or REST to the panel.
The display refreshes. Done.
Built for hackers
No accounts, no black boxes. The rendering pipeline, transports, and device clients are all open and swappable.
Install
One container — or a one-line script, a Home Assistant App, an LXC container, or straight from source. Open the UI, set a password, and start composing.
mkdir ~/tesserae && cd ~/tesserae
curl -fsSLO https://raw.githubusercontent.com/dmellok/tesserae/main/docker-compose.yml
docker compose up -d# Settings → Apps → App store → ⋮ → Repositories
# Add this URL, then install "Tesserae" and click Start:
https://github.com/dmellok/homeassistant-tesserae-addon# macOS · Linux · Raspberry Pi
curl -fsSL https://raw.githubusercontent.com/dmellok/tesserae/main/install.sh | bashiwr https://raw.githubusercontent.com/dmellok/tesserae/main/install.ps1 -UseBasicParsing | iexlxc launch images:debian/trixie tesserae
lxc shell tesserae
apt update && apt install -y git python3 python3.13-venv
curl -fsSL https://raw.githubusercontent.com/dmellok/tesserae/main/install.sh | bashgit clone https://github.com/dmellok/tesserae.git
cd tesserae
python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"
.venv/bin/python -m app.main