Tesserae

Free, open-source dashboard server

Self-hosted dashboards for e-ink displays.

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
Morning board800×480
The Morning board dashboard rendered on an e-ink panelThe Brutalist Daily dashboard rendered on an e-ink panelThe Nexus · HOME.OS dashboard rendered on an e-ink panelThe Mesh · Radar dashboard rendered on an e-ink panelThe KDN · Ops dashboard rendered on an e-ink panelThe GitHub dashboard rendered on an e-ink panelThe Calendar dashboard rendered on an e-ink panelThe Analytics dashboard rendered on an e-ink panel
A dresser lined with framed e-paper panels showing weather, now-playing, F1 and calendar dashboards
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
01 · Place it yourself

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.

Morning board Saved 800 × 480 Save Push

Layout

Cell

Click a cell in the preview to configure it.

Live preview

HTML viewPanel view
Weather
Weather
14°
Light rain · feels 12°
Now14°3pm16°9pm11°
Clock
Clock
09:41
Thursday 12 June
Week24Sunrise06:58
Calendar
Today
  • 09:30Team standup
  • 12:00Lunch — Ada
  • 15:301:1 with Sam
Climate
Living room
21.5°
Target 22° · 48% RH

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

02 · Or describe it

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
87%
14°
Partly cloudy
Feels 12° · Melbourne
3PM 16°6PM 14°9PM 11°12A
Up next
Team standup
9:30 AM · Zoom
12:00 · Lunch with Ada
Now playing
Avril 14th
Aphex Twin
0:472:03
tesserae · mcp agent

you

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

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.

01
Run the server
One container on the box you already own. Open the UI, set a password. No account, no cloud.
02
Pair a panel
Flash Seeed/Waveshare from the browser, or install the Pi, Kindle or TRMNL client. It appears under Discovered.
03
Compose a dashboard
Drag widgets onto the grid — or ask the agent — then bind the page to a panel and hit Push.
04
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
Full docker guide →
# 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)
Full home assistant guide →
$ curl -fsSL tesserae.ink/install.sh | bash
$ cd ~/tesserae && ./run.sh
→ localhost:8765 · set a password
Full shell guide →
# 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
Full lxc guide →
$ 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
Full source guide →
No accountNo cloudNo trackingRuns anywhere
13
Panels verified
2,680
Passing tests
0
Accounts

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

13 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.
The Seeed reTerminal E-Series e-paper panels
Shortest path
The Seeed reTerminal E-Series

Four pre-assembled, battery-powered ePaper devices sharing one Tesserae-native firmware you flash from the browser. No assembly, no soldering, no toolchain.

E1001
7.5" mono · 800×480
E1002
7.3" Spectra 6 · 800×480
E1003
10.3" 16-grey · 1872×1404
E1004
13.3" Spectra 6 · 1200×1600
Firmware flasher
Flash your panel from this page.
Web Serial writes the firmware over USB. Every image checked against its SHA-256 before a byte lands.
Open the flasherCHROME OR EDGE

Open all the way down

No accounts · no black boxes
Design
Drag-resize cells, live preview
14 themes bundled, 60+ community
Layout presets per panel
Schedules and rotations
Devices
Pi: Inky, every size
ESP32: Waveshare, PhotoPainter
Kindle via KOReader
TRMNL-compatible BYOS
Integrations
Home Assistant + MQTT discovery
Open-Meteo, bundled
CalDAV, Google, iCloud
Spotify, GitHub, OctoPrint, F1
Developer
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.