TRMNL Display
Generate content for TRMNL e-ink display devices using the TRMNL CSS framework and send via the trmnl CLI. Use when the user wants to display information on their TRMNL device, send messages to an e-i
Generate content for TRMNL e-ink display devices using the TRMNL CSS framework and send via the trmnl CLI. Use when the user wants to display information on their TRMNL device, send messages to an e-i
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
Generate HTML content for TRMNL e-ink display devices.
Install the
CLI to the latest version:trmnl
npm install -g trmnl-cli@latest
Configure a webhook plugin (one-time setup):
# Add a plugin trmnl plugin add home "https://trmnl.com/api/custom_plugins/{uuid}"Verify it's configured
trmnl plugin
npm install -g trmnl-cli@latesttrmnl plugin - if none, prompt user to add onetrmnl send --file /tmp/trmnl-content.html # Or to a specific plugin: trmnl send --file /tmp/trmnl-content.html --plugin office
From file (recommended):
# Write HTML content to file first cat > /tmp/trmnl-content.html << 'EOF' <div class="layout layout--col gap--space-between"> <div class="item"> <span class="value value--xlarge value--tnums">Hello TRMNL!</span> </div> </div> <div class="title_bar"> <span class="title">My Plugin</span> </div> EOFSend to display
trmnl send --file /tmp/trmnl-content.html
Validate before sending:
trmnl validate --file /tmp/trmnl-content.html
View send history:
trmnl history trmnl history --today trmnl history --failed
| Tier | Payload Size | Rate Limit |
|---|---|---|
| Free | 2 KB (2,048 bytes) | 12 requests/hour |
| TRMNL+ | 5 KB (5,120 bytes) | 30 requests/hour |
Set tier globally for accurate validation:
trmnl tier plus # or "free"
Read these files as needed:
| File | When to Read |
|---|---|
| Start here - Common plugin patterns |
| Device specs, e-ink constraints |
| Colors, typography, sizing, spacing |
| Flexbox, grid, overflow engines |
| Title bar, dividers, items, tables |
| Payload format, troubleshooting |
| Common mistakes to avoid |
Every plugin follows this pattern:
<div class="layout layout--col gap--space-between"> <!-- Content sections separated by dividers --> </div> <div class="title_bar"> <img class="image" src="icon.svg"> <span class="title">Plugin Name</span> <span class="instance">Context</span> </div>
layout + layout--col = vertical flex containergap--space-between = push sections to edgestitle_bar = always at bottom, outside layoutdivider = separate major sections.layout element per view<div class="grid"> <div class="col--span-3">30%</div> <div class="col--span-7">70%</div> </div>
<div class="item"> <div class="content"> <span class="value value--xlarge value--tnums">$159,022</span> <span class="label">Total Sales</span> </div> </div>
Always use
for numbers.value--tnums
| Class | Usage |
|---|---|
| Hero KPIs |
| Large prices |
| Secondary metrics |
| Required for numbers |
Use dithered classes, not inline colors:
bg--black, bg--gray-60, bg--gray-30, bg--gray-10, bg--whitetext--black, text--gray-50| Attribute | Purpose |
|---|---|
| Auto-resize text to fit |
| Limit to N lines |
| Enable overflow management |
layout + title_bar structurevalue--tnums for numbersdata-fit-value on primary metricsbg--gray-* dithered classes| Problem | Solution |
|---|---|
| Run |
| No plugins configured | Run |
| Webhook fails | - verify plugin URL |
| Payload too large | - check size |
| Numbers misaligned | Add class |
| Send history | |
No automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.