TRMNL Display
by @peetzweg
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-ink display, create dashboard content, show notifications, or update their terminal display. Supports rich layouts with the TRMNL framework (flexbox, grid, tables, progress bars, typography utilities).
clawhub install trmnlπ About This Skill
name: trmnl description: 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-ink display, create dashboard content, show notifications, or update their terminal display. Supports rich layouts with the TRMNL framework (flexbox, grid, tables, progress bars, typography utilities).
TRMNL Content Generator
Generate HTML content for TRMNL e-ink display devices.
Prerequisites
Install the trmnl CLI to the latest version:
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
Quick Start Workflow
1. Install/update CLI: Run npm install -g trmnl-cli@latest
2. Check plugins: Run trmnl plugin - if none, prompt user to add one
3. Confirm device type (default: TRMNL OG, 2-bit, 800x480)
4. Read relevant reference docs based on content needs
5. Generate HTML using TRMNL framework classes
6. Write HTML to a temp file and send:
trmnl send --file /tmp/trmnl-content.html
# Or to a specific plugin:
trmnl send --file /tmp/trmnl-content.html --plugin office
7. Minimal confirmation only - Do NOT echo content back to chatSending Content
From file (recommended):
# Write HTML content to file first
cat > /tmp/trmnl-content.html << 'EOF'
Hello TRMNL!
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
Webhook Limits
| 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"
Reference Documentation
Read these files as needed:
| File | When to Read |
|------|--------------|
| references/patterns.md | Start here - Common plugin patterns |
| references/framework-overview.md | Device specs, e-ink constraints |
| references/css-utilities.md | Colors, typography, sizing, spacing |
| references/layout-systems.md | Flexbox, grid, overflow engines |
| references/components.md | Title bar, dividers, items, tables |
| references/webhook-api.md | Payload format, troubleshooting |
| assets/anti-patterns.md | Common mistakes to avoid |
Standard Plugin Structure
Every plugin follows this pattern:
layout + layout--col = vertical flex containergap--space-between = push sections to edgestitle_bar = always at bottom, outside layoutdivider = separate major sections.layout element per viewQuick Reference
Grid System (10-Column)
30%
70%
Item Component
$159,022
Total Sales
Value Typography
Always use value--tnums for numbers.
| Class | Usage |
|-------|-------|
| value--xxxlarge | Hero KPIs |
| value--xxlarge | Large prices |
| value--xlarge | Secondary metrics |
| value--tnums | Required for numbers |
Grayscale Classes
Use dithered classes, not inline colors:
bg--black, bg--gray-60, bg--gray-30, bg--gray-10, bg--whitetext--black, text--gray-50Data Attributes
| Attribute | Purpose |
|-----------|---------|
| data-fit-value="true" | Auto-resize text to fit |
| data-clamp="N" | Limit to N lines |
| data-overflow="true" | Enable overflow management |
Best Practices
1. Use layout + title_bar structure
2. Always value--tnums for numbers
3. Use data-fit-value on primary metrics
4. Use bg--gray-* dithered classes
5. Keep payload under tier limit
6. Minimal confirmations - just "Sent to TRMNL"
Troubleshooting
| Problem | Solution |
|---------|----------|
| trmnl: command not found | Run npm install -g trmnl-cli@latest |
| No plugins configured | Run trmnl plugin add |
| Webhook fails | trmnl config - verify plugin URL |
| Payload too large | trmnl validate --file - check size |
| Numbers misaligned | Add value--tnums class |
| Send history | trmnl history --failed |
βοΈ Configuration
Install the trmnl CLI to the latest version:
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
π Tips & Best Practices
1. Use layout + title_bar structure
2. Always value--tnums for numbers
3. Use data-fit-value on primary metrics
4. Use bg--gray-* dithered classes
5. Keep payload under tier limit
6. Minimal confirmations - just "Sent to TRMNL"