SELF-HOSTED DASHBOARD SERVER
Self-hosted dashboards for e-ink displays.
Design dashboards in your browser and deploy them to Raspberry Pi, ESP32, Kindle and TRMNL-compatible displays.
AGPL-3.0-or-later · No telemetry · No cloud account required
Gallery
Dashboards I run at home
Weather, transit, home status, dev metrics, now-playing, composed in the browser and rendered to crisp e-ink frames.
Editor
Compose in the browser
Pick a display. The preview re-renders for that panel. The layout sizes to each device.
1872 × 1404 · Seeed reTerminal E1003 · real render, no backend
- Resizable cell grid
- Per-device targeting
- Themes & fonts
- Instant render preview
This is a live render of the preview surface. The full self-hosted editor does much more: resizable cell layouts, 30+ widgets, a theme builder, scheduling and rotations, and one-click push to every panel.See it in the app
Install
Self-host in under a minute
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.
- No account required
- No cloud required
- No telemetry
- One container
- Runs anywhere
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
# then the manual venv install:
git clone https://github.com/dmellok/tesserae.git && cd tesserae
python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"
.venv/bin/python -m app.maingit clone https://github.com/dmellok/tesserae.git
cd tesserae
python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"
.venv/bin/python -m app.mainQuick start
From a server to a panel on the wall
With the server running from the install above, here's the rest of the way to a panel on the wall. Pick your hardware: a Raspberry Pi driving a Pimoroni Inky, or a self-contained Seeed reTerminal E1003.
- 01
Install the Pi client
On the Raspberry Pi wired to your Inky, as your normal user:
git clone https://github.com/dmellok/tesserae-device-pi-bin.git cd tesserae-device-pi-bin ./scripts/install.shThe script enables SPI/I²C, asks for your server URL (REST, no broker needed) and panel size, then installs a tesserae-pi-bin-client systemd service.
- 02
Pair the panel
In Settings → Devices, your Pi appears under Discovered within a few seconds. Click Register to pair it. No tokens to copy.
- 03
Compose a dashboard
Dashboards → New. Drop in a weather widget, a calendar, a Spotify card, then bind the page to your Inky in the device picker. Hit Push and the Pi paints the frame.
- 04
Put it on a cadence
Add a schedule from the dashboard's Schedules card: Every N minutes or Daily at a set time. Battery panels can use smart sync to render just before each wake.
- 01
Flash TRMNL, point it at your server
The E1003 ships with Seeed's SenseCraft HMI, so flash the TRMNL firmware first, via the TRMNL web flasher or Seeed's reTerminal E-Series flasher. Then, on the device's Wi-Fi captive portal, set the BYOS server URL to http://<server>:8765.
- 02
It pairs itself
On first boot the device calls /api/setup with its MAC and auto-provisions, so it appears under Settings → Devices within seconds. No token to type.
- 03
Compose a dashboard
Dashboards → New. The E1003 is a 1404×1872 portrait, 16-level greyscale panel, so reach for a tall, monochrome-friendly layout. Bind the page to the device and hit Push.
- 04
Set the refresh
The E1003 polls on its own cadence (≥60s). Add a Schedule so Tesserae keeps a fresh frame ready, and lean on smart sync to render just before each wake. That's what gets the multi-month battery life.
Different hardware? The per-client setup guides cover ESP32, TRMNL, Kindle, and the Home Assistant App.Setup guides
Architecture
How it actually works
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.
- MQTT
- Server pushes new frames to always-on clients the moment a page changes.
- REST
- Battery devices wake, pull their frame over HTTP, then sleep again.
Supported hardware
One server, many panels
10 panels verified across the major e-ink families, with 7 more on the bench. Expand any vendor to see what’s in progress. Add your own with a small adapter.
- Runs on
- Raspberry Pi
- ESP32
- Kindle
- TRMNL
- Custom panels
| Panel | Resolution | Status |
|---|---|---|
Seeed StudioTRMNL BYOS protocol | ||
| reTerminal E1003 | 1404×1872 | Verified |
| TRMNL 7.5" OG DIY Kit | 800×480 | Verified |
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 E1004 | 1200×1600 | Pending |
| XIAO 7.5" ePaper Panel | 800×480 | Pending |
Pimoroni Inkypi-png / pi-bin | ||
| 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 |
| Inky Impression 4" | 640×400 | Pending |
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 |
| Kindle Paperwhite 2 (jailbroken) | 758×1024 | Verified |
| TRMNL X | 1872×1404 | Pending |
Anything else: pick custom in Settings → Panel and set the dimensions. “Pending” = awaiting real-hardware confirmation.
Built for hackers
Everything is yours to run, read, and extend
No accounts, no black boxes. From the rendering pipeline to the widget catalog, every layer is open, swappable, and runs on your own hardware.
Dashboard design
- Drag-resize cell editor with live preview
- 14 bundled themes, 60+ in the community catalog
- Layout presets per panel, composable type styles
- Scheduling and rotations on a wall-clock anchor
Device support
- Raspberry Pi — Inky Impression, every size
- ESP32 — Waveshare, PhotoPainter, custom panels
- Kindle — via the KOReader plugin
- TRMNL-compatible — BYOS firmware
- 10 panels verified on real hardware, 7 on the bench
Integrations
- Home Assistant app + MQTT discovery
- Open-Meteo weather, bundled
- Calendars — CalDAV, Google, iCloud
- Catalog widgets — Spotify, GitHub, OctoPrint, F1, AI images
Developer
- Drop-a-folder plugins — widgets, renderers, devices
- OpenAPI 3.0 REST API
- AGPL-3.0-or-later, no telemetry, no cloud account
- 1,140 passing tests
Most e-paper projects are one firmware pinned to one panel. Tesserae splits rendering from transport from hardware, so a single server drives every panel you own.
- Home Assistant users
- Makers
- E-paper enthusiasts
- Self-hosters
- Hardware hackers
- Digital-signage builders
Why I built it
I wanted beautiful, self-hosted ambient displays that weren't tied to cloud services or vendor ecosystems. Tesserae grew from a weekend project into a plugin platform spanning several hardware families and rendering pipelines.