Free, open-source dashboard server
Compose a dashboard in the browser; Tesserae renders it, dithers it to your panel's bit depth, and pushes the frame over MQTT or REST. Thirteen panels verified on real hardware, twenty-nine supported. One server, no accounts, no cloud.
AGPL-3.0no trackingno accountsMelbourne

One shelf · one server · one houseWeather · now playing · F1 · calendar
No glow. No notifications. No refresh until something changes.
0.4W average per panel · weeks per charge
Two ways to compose
Cards editor · MCP canvas · 35 widgets, 18 community
The cards editor: split the panel with a layout, drop a widget into each cell, and tune it in the form. The preview re-renders after every change; 14 themes bundled, then bind to a panel and hit Push.
Widget editor
Place it yourself. Cell by cell.
Split the panel with a layout, drop a widget into each cell, and tune it in the form. The live preview re-renders after every change. No code, no agent.
Layout
Cell —
Click a cell in the preview to configure it.
Live preview
HTML viewPanel view
14°
Light rain · feels 12°
Now14°3pm16°9pm11°
09:41
Thursday 12 June
Week24Sunrise06:58
- 09:30Team standup
- 12:00Lunch — Ada
- 15:301:1 with Sam
800 × 480 · reTerminal E1001
A faithful mock of the built-in dashboard editor. The self-hosted app carries 35 bundled widgets, 18 more in the community catalog, a theme builder, per-cell overrides, scheduling and rotations.Read the source
Prefer to describe it? The same freeform editor, driven by an MCP agent: it runs the real tool loop — create the canvas, add a code element, append each source — and composes the panel while you watch. Entirely optional.
Canvas editor · MCP
Or just describe it. Watch it build.
The same freeform editor, driven by an MCP agent. Ask in plain language and it runs the real tool loop, composing the panel in the canvas while you watch.
Daily Briefexperimental Save Choose device… Send to panels
THURSDAY 12 JUNE
09:41
14°
Partly cloudy
Feels 12° · Melbourne
3PM 16°6PM 14°9PM 11°12A 9°
Up next
Team standup
9:30 AM · Zoom
12:00 · Lunch with Ada
A faithful mock of the editor being driven over MCP. The real tool loop (create_canvas_page → bind_devices → add_element → append_code → render_preview → push) composes the panel exactly like this. Read the source
Dashboard examples
Real renders · 16 dashboards · four panel sizes
Install
Yours, on your
own hardware.
One container, a one-line script, a Home Assistant app, an LXC container, or straight from source. Open the UI, set a password, start composing. Nothing leaves the house.
Run the server
One container on the box you already own. Open the UI, set a password. No account, no cloud.
Pair a panel
Flash Seeed/Waveshare from the browser, or install the Pi, Kindle or TRMNL client. It appears under Discovered.
Compose a dashboard
Drag widgets onto the grid — or ask the agent — then bind the page to a panel and hit Push.
Put it on a cadence
Every N minutes, or daily at a set time. Battery panels render just before each wake with smart sync.
$ mkdir ~/tesserae && cd ~/tesserae
$ curl -fsSLO tesserae.ink/docker-compose.yml
$ docker compose up -d
→ localhost:8765 · set a password
# Settings → Apps → app store → ⋮ → Repositories
# Add repo: github.com/dmellok/homeassistant-tesserae-addon
$ Install Tesserae, then Start
→ Open Web UI (no password; HA's own auth gates it)
$ curl -fsSL tesserae.ink/install.sh | bash
$ cd ~/tesserae && ./run.sh
→ localhost:8765 · set a password
# In an unprivileged Debian/Ubuntu container:
$ apt update && apt install -y git python3 python3.13-venv
$ curl -fsSL tesserae.ink/install.sh | bash
→ <ip>:8765 · set a password
$ 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.main --dev
→ localhost:8765 · hot-reload dev server
No accountNo cloudNo trackingRuns anywhere
One server, many panels
renderers/ · transports/ · devices/
BROWSER
EDITOR
compose ↓
TESSERAE
SERVER
render → dither → fan out ↓
Most e-paper projects are one firmware pinned to one panel. Tesserae splits rendering from transport from hardware.
MQTT
Raspberry Pi
Always-on. The server pushes a new frame the moment a page changes. Inky Impression, every size.
pi-png / pi-bin client
REST
ESP32
Wakes, pulls its frame over HTTP, sleeps again. Smart sync renders just before each wake.
tesserae-device-firmware
MQTT
Kindle
A jailbroken Paperwhite becomes a panel via the KOReader plugin. 758×1024, 1-bit.
koreader plugin
HTTP
TRMNL & custom
BYOS firmware points at your server. Anything else: a small adapter and a custom panel size.
openapi 3.0 · drop-a-folder plugins
16 panels, verified on real hardware
29 supported · report yours
PANELSETUPRESOLUTIONSTATUS
Some links here are affiliate links: buying a Seeed panel through one gets you a discount at checkout and pays a small commission back into Tesserae. Nothing is listed because of it, and a panel's verified status means exactly what it says.
Anything else: Settings → Panel → custom, set the dimensions. Report a working panel and it joins the table.
Open all the way down
No accounts · no black boxes
Drag-resize cells, live preview
14 themes bundled, 60+ community
Layout presets per panel
Schedules and rotations
Pi: Inky, every size
ESP32: Waveshare, PhotoPainter
Kindle via KOReader
TRMNL-compatible BYOS
Home Assistant + MQTT discovery
Open-Meteo, bundled
CalDAV, Google, iCloud
Spotify, GitHub, OctoPrint, F1
Drop-a-folder plugins
OpenAPI 3.0 REST API
AGPL-3.0-or-later
2,680 passing tests
Built in the open. PRs welcome.
Every feature, bug and design decision lives in the issue tracker. Pick one and send a PR — or run it on a panel nobody has tried yet and file the report.
Why AGPL, and what your server sends
The AGPL keeps the server free even when run as a service. No accounts. Online features are off by default — nothing is sent unless you enable them under Settings → System → Online features. With them on, the app contacts api.tesserae.ink for update checks and an anonymous count of which marketplace widgets are in use; a coarse country is derived from the IP, then discarded.
Why I built it
Beautiful ambient displays, tied to nobody's cloud.
Tesserae grew from a weekend project into a plugin platform spanning several hardware families and rendering pipelines. A solo project, built in Melbourne. If it earns a place on your wall, sponsor the work — or just send a panel report.
Tesserae
Self-hosted dashboards for e-ink displays. Compose, render, push. Your pixels, your walls.
AGPL-3.0-or-later · no tracking · no subscriptions · Melbourne