How do I connect a TRMNL e-ink display?
collabDoo serves your household’s display under a secret address in three forms: web page, image (PNG) and data (JSON). On the TRMNL there are two ways, both via a private plugin: the finished image for full-screen use (recommended, no maintenance) and Liquid templates if collabDoo should share a screen with other plugins. No server of your own is needed.
Part 1
Prepare in the app
You need a TRMNL connected to the TRMNL cloud (trmnl.com) and an account with access to private plugins (developer access). In collabDoo you set up the display and generate the address – as an adult with the admin role.
- Switch the display on
Manage → Display (kitchen display) → switch on Public display address active.
- Calendar, location, photos
Up to 6 calendars via iCal address (Check address shows immediately whether the link works; with Apple replace
webcal://withhttps://), a location for the weather, photos with rotation. How to is in the display guide. - Choose the e-ink view
Under Ansicht E-Ink/Bild choose between Week and Today only. This is the default for image and web page; it can be overridden via the address.
- Generate the display address
Under E-ink / TRMNL tap Generate display address. The app shows three addresses once, with copy button and QR code: web page
https://team.collabdoo.app/d/<token>, imagehttps://team.collabdoo.app/d/<token>.png, datahttps://team.collabdoo.app/d/<token>.json. Way 1 needs the image address, way 2 the data address.
Anyone who knows the address sees tasks with first names, appointments and the photo. With both ways it ends up in the TRMNL cloud because TRMNL fetches it. Do not pass it on; if lost, Neue Adresse erzeugen (the old one dies immediately) or Adresse widerrufen. The plain text is shown only at the moment of generation.
Part 2
Way 1: the finished image as a private plugin (full screen, recommended)
On the TRMNL you create your own plugin. It fetches the data address regularly – that is only the trigger so TRMNL redraws at all – and shows the finished image from the collabDoo server as its content. Below is field by field what to enter; anything not mentioned stays empty or at its default.
- Create the plugin
At trmnl.com: Plugins → Private Plugin → Add new. The page My Plugin – Build your own opens.
- Name
Free choice, for example “collabDoo”. It only serves to tell several plugins apart.
- Strategy
Set to Polling. TRMNL then fetches data from an address by itself.
- Polling URL(s)
This is where the data address goes – one line, nothing else. The app shows it under E-Ink / TRMNL as the third address, ending in
.json:https://team.collabdoo.app/d/<token>.json<token>is the long string from your address. The Parse button does not fetch anything yet: it only fills in placeholders in the address (we need none) and shows the finished address under Parsed. So seeing the very same address there is correct. Whether data really arrives you will see in the markup editor preview and later in the timeline. - Polling Verb, Headers, Body, Form Fields
Polling Verb stays on
GET. Polling Headers, Polling Body and Form Fields stay empty – the address already carries the secret. - Remove Bleed Margin
Switch it on. The image then runs to the edge of the display instead of sitting in a white frame.
- Save and paste the markup
Save, then Edit Markup at the top. In the Full tab delete everything and paste exactly this one line. Then Save again.
<img src="https://team.collabdoo.app/d/<token>.png?w=1872&h=1404&mode=gray16&view=today&cb={{ updated | replace: ':', '' }}" style="width:100%;height:100%;object-fit:contain;">Replace
<token>here too. Only this one line – with two<img>tags in the markup TRMNL shows two images below each other. The line above is set up for the TRMNL X; for the TRMNL OG usew=800&h=480&mode=einkinstead. Thecb=…at the end is filled in by TRMNL itself (the server time); it makes sure the image is fetched fresh. The other parameters control the image – all are optional:Parameter Values Effect viewweek·todayWeek tiles or day view. Without it, the app setting “Ansicht E-Ink/Bild” applies. w200 … 2000 Width in pixels – your display’s resolution. h200 … 2000 Height in pixels. The layout scales by height (template 780 px). At most 3.2 megapixels in total. modeeink·gray·gray16·color1-bit dithered (TRMNL OG) · 4 grey levels · 16 grey levels (TRMNL X) · colour (browser, tablet). rotate0·90·180·270Rotation in degrees, for a portrait-mounted display, say. - Refresh rate and playlist
On the right set Maximale Aktualisierungsrate (max refresh rate) to 15 minutes – the display rarely changes faster. Then enable the plugin in the Wiedergabeliste (playlist). Done.
- Check: timeline
On the right under Timeline you see what happened on each refresh. It must show Rendered. If it permanently says Render skipped — no change in data, the polling address or the
cb=…in the markup is missing. - Optional: alternate day and week
Create a second private plugin the same way and replace
view=todaywithview=weekin the markup. The playlist order is the alternation rhythm.
It can show an image from an address, but it only redraws the screen when its data changes – and for this plugin that is only the address you entered. That never changes, so the timeline keeps saying Render skipped — no change in data and the display shows the first image forever, even though the server has long since produced a new one. Hence the detour via polling.
The same lines are available as a ready-made file at collabdoo-image.liquid – open it, select all, copy. An overview of all templates with a short guide is at team.collabdoo.app/trmnl/.
The server caches an image for 5 minutes per address and parameters and serves it as an 8-bit greyscale PNG. If a service prefers JPEG: the same address with .jpg instead of .png, same parameters.
Part 3
Way 2: private plugin with Liquid templates (mashups)
Needed when collabDoo should sit next to other plugins on one screen (half or quadrant). TRMNL then renders from the data itself – with our ready-made templates.
- Create the plugin and set up polling
Steps 1 to 6 from part 2 – only the name differs, for example “collabDoo week”. Strategy: Polling, and the data address again as Polling URL(s):
https://team.collabdoo.app/d/<token>.json - Paste the template
Under Edit Markup there is a tab per layout. For each tab you want to use, open the matching template, select all, copy and paste. The templates are text files on our server (table below, names are clickable).
- Check the preview
If no entries appear, the data sits under a root node (happens with several polling URLs). Then replace
dayswithIDX_0.daysin the template – likewisetoday,labels,household,weather,unassigned,title,updated,photo_url. - Playlist or mashup
Add the plugin to the playlist. In a Mashup, collabDoo sits as a quadrant next to weather or news, for example.
| Layout | Template | Shows |
|---|---|---|
| Full (week) | collabdoo-full.liquid | Day tiles 4×2, weather and photo on the right, with 7 days an eighth tile “up for grabs” |
| Image only | collabdoo-image.liquid | The finished server image; polling only serves as the render trigger |
| Full (day) | collabdoo-full-today.liquid | Appointments · tasks (two lines, circle checkbox) · weather and photo |
| Half Horizontal | collabdoo-half_horizontal.liquid | Today left, next day right |
| Half Vertical | collabdoo-half_vertical.liquid | Today large, the next days below |
| Quadrant | collabdoo-quadrant.liquid | Today only, compact |
The full templates load Public Sans and Roboto Condensed from Google Fonts plus weather symbols and photo from the collabDoo server. TRMNL renders in the cloud, which is why all addresses are absolute.
Part 4
Image address parameters and recommendations per device
Append the parameters to the image address with ? and &. Without view the app setting “Ansicht E-Ink/Bild” applies.
| Parameter | Values | Meaning |
|---|---|---|
view | week · today | Week tiles or day view |
w, h | 200 … 2000 | Image size in pixels; the layout scales by height (template 780 px) |
mode | eink · gray · gray16 · color | 1-bit dithered · 4 grey levels · 16 grey levels · colour |
rotate | 0 · 90 · 180 · 270 | Rotation |
TRMNL X (10.3″, 16 grey levels, 1872 × 1404): ?w=1872&h=1404&mode=gray16&view=week
TRMNL OG (7.5″, 1 bit, 800 × 480): ?w=800&h=480&mode=eink&view=today – the day view is more legible on the small display than the week.
Browser or tablet: the web page address https://team.collabdoo.app/d/<token> refreshes itself, ?view=today is possible.
Week: one tile per day with weekday, “TODAY” badge, date and the entries in chronological order – appointments with time and calendar, tasks with time and person (“07:00 · Max”, open ones as “07:00 · open”). Weather with an hourly bar 06–20 top right, the photo of the day bottom right. Day: appointments on the left, tasks in the middle as a list with a circle (empty = open, filled = done), time and assignee, then “Tomorrow” if there is room. A clear tile design, made for e-ink.
Part 5
Troubleshooting
| Symptom | Cause and fix |
|---|---|
| “Render skipped — no change in data” – old image stays | The plugin gets no changing data. With the “Image Display” catalogue plugin that is by design; use the private plugin from part 2 with Polling on https://team.collabdoo.app/d/<token>.json. If you already have that, the cache buster &cb={{ updated }} is missing from the markup. |
| Preview or display stays white | Until 22 Sep 2026 the server delivered an image format and a security header that TRMNL’s renderer rejected. Both are fixed – use Aktualisierung erzwingen (force refresh) in the plugin. If it stays white: try the same address with .jpg instead of .png. |
| Response “Bad parameters” (400) | Size out of bounds: at most 2000 pixels per side and 3.2 megapixels in total. w=1872&h=1404 is enough for the TRMNL X. |
| Response “Too many requests” (429) | At most 60 requests per hour per display address. Trying things out in browser and plugin editor can hit this briefly – it clears after a few minutes. |
| Image or page returns 404 | Address wrong, revoked or display switched off. Generate a new address in the app. |
| Old rendering in the browser | Browser cache (60 seconds). Reload with Shift or change a parameter. |
| Image too small or blurry on the TRMNL X | w=1872&h=1404&mode=gray16 |
| Liquid template shows nothing | Root node: days → IDX_0.days and the other fields likewise (part 3, step 4). |
| All tasks say “up for grabs” or “open” | The tasks have no assigned person. Set the assignee in the app or let someone take them. |
| Calendar missing | The iCal address must start with https:// and be publicly reachable; use “check address” in the app. Refresh every 15 minutes. |
| Exclamation mark after the time | The task is overdue – the time has already passed today. |
All templates, symbols and a short guide are publicly available at team.collabdoo.app/trmnl/.
collabDoo · All for one. Done by all.
The week on the wall – without wasting power.
One image plugin, one address, done.
iPhone & iPad from iOS 17 · Android from 8.0

