← Help & docs

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.

  1. Switch the display on

    Manage → Display (kitchen display) → switch on Public display address active.

  2. Calendar, location, photos

    Up to 6 calendars via iCal address (Check address shows immediately whether the link works; with Apple replace webcal:// with https://), a location for the weather, photos with rotation. How to is in the display guide.

  3. 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.

  4. 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>, image https://team.collabdoo.app/d/<token>.png, data https://team.collabdoo.app/d/<token>.json. Way 1 needs the image address, way 2 the data address.

As secret as an invitation link

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.

  1. Create the plugin

    At trmnl.com: Plugins → Private Plugin → Add new. The page My Plugin – Build your own opens.

  2. Name

    Free choice, for example “collabDoo”. It only serves to tell several plugins apart.

  3. Strategy

    Set to Polling. TRMNL then fetches data from an address by itself.

  4. 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.

  5. 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.

  6. Remove Bleed Margin

    Switch it on. The image then runs to the edge of the display instead of sitting in a white frame.

  7. 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 use w=800&h=480&mode=eink instead. The cb=… 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:

    ParameterValuesEffect
    viewweek · todayWeek tiles or day view. Without it, the app setting “Ansicht E-Ink/Bild” applies.
    w200 … 2000Width in pixels – your display’s resolution.
    h200 … 2000Height 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.
  8. 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.

  9. 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.

  10. Optional: alternate day and week

    Create a second private plugin the same way and replace view=today with view=week in the markup. The playlist order is the alternation rhythm.

Why not the “Image Display” catalogue plugin?

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.

Templates to copy

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/.

Good to know

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.

  1. 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
  2. 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).

  3. Check the preview

    If no entries appear, the data sits under a root node (happens with several polling URLs). Then replace days with IDX_0.days in the template – likewise today, labels, household, weather, unassigned, title, updated, photo_url.

  4. Playlist or mashup

    Add the plugin to the playlist. In a Mashup, collabDoo sits as a quadrant next to weather or news, for example.

LayoutTemplateShows
Full (week)collabdoo-full.liquidDay tiles 4×2, weather and photo on the right, with 7 days an eighth tile “up for grabs”
Image onlycollabdoo-image.liquidThe finished server image; polling only serves as the render trigger
Full (day)collabdoo-full-today.liquidAppointments · tasks (two lines, circle checkbox) · weather and photo
Half Horizontalcollabdoo-half_horizontal.liquidToday left, next day right
Half Verticalcollabdoo-half_vertical.liquidToday large, the next days below
Quadrantcollabdoo-quadrant.liquidToday only, compact
Good to know

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.

ParameterValuesMeaning
viewweek · todayWeek tiles or day view
w, h200 … 2000Image size in pixels; the layout scales by height (template 780 px)
modeeink · gray · gray16 · color1-bit dithered · 4 grey levels · 16 grey levels · colour
rotate0 · 90 · 180 · 270Rotation
Recommendations

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.

What the image shows

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

SymptomCause and fix
“Render skipped — no change in data” – old image staysThe 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 whiteUntil 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 404Address wrong, revoked or display switched off. Generate a new address in the app.
Old rendering in the browserBrowser cache (60 seconds). Reload with Shift or change a parameter.
Image too small or blurry on the TRMNL Xw=1872&h=1404&mode=gray16
Liquid template shows nothingRoot 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 missingThe iCal address must start with https:// and be publicly reachable; use “check address” in the app. Refresh every 15 minutes.
Exclamation mark after the timeThe task is overdue – the time has already passed today.
Good to know

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

Stefan Wirtz

Stefan Wirtz · Managing director & founder of Code Piraten GmbH

“collabDoo was born in our own home – we build it the way we need it ourselves.”

Meet the whole team →

Get collabDoo

Free, no ads. Choose your device:

One account, every device: iPhone and Android share the same data.