Tesserae · Self-hosted dashboards for e-ink displays

Tesserae

6 min read Original article ↗
Tesserae

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.

View on GitHubRead the docs

AGPL-3.0no trackingno accountsMelbourne

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

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

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

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

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

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.

Read the source Read the privacy page Security policy

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.

View on GitHubRead the docs

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