Fully self-hosted
Runs entirely on your own box. Nothing phones home — your data stays on your network.
SELF-HOSTED DASHBOARD SERVER
Compose in a browser, render dithered frames on your own server, and push them to the panel on your wall over MQTT or REST.
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"
Gallery
Weather, transit, home status, dev metrics, now-playing — composed in the browser and rendered to crisp e-ink frames.
Architecture
Compose once in the browser. Tesserae renders the frame and fans it out to whatever hardware you run — 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.
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.mainPrinciples
The defaults Tesserae picks, and the trade-offs they imply.
Runs entirely on your own box. Nothing phones home — your data stays on your network.
Drag-and-drop dashboards with live preview. No YAML, no rebuilds, no redeploys.
Frames are rasterized on the server, so panels stay simple, cheap, and low-power.
Push frames over MQTT, or let devices pull over REST. Fits the network you already run.
AGPL-3.0, plugin widgets, and drop-in adapters to add new hardware in-tree.
No sign-up, no subscription, no telemetry. Yours to run for as long as you like.
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.