A collection of custom plugins for TRMNL e-ink displays, designed for BYOS (Build Your Own Server) users.
Note: These plugins have been developed and tested with LaraPaper. They may work with other BYOS implementations that support the plugin system, but compatibility is not guaranteed.
Full-featured calendar display using the FullCalendar library. Supports multiple event sources, webhook-based updates, and configurable view modes (one week, two weeks, or full month).
Interactive health metrics tracking with Highcharts. Displays trends for body weight, body fat percentage, BMI, muscle mass, and other health measurements from webhook data.
Package delivery tracking using the Parcel app. Polls the Parcel API directly to show active and recent deliveries with status badges, expected delivery dates, and latest tracking events. Based on the official TRMNL Parcel plugin.
Real-time stock price tracking using the Finnhub API. Displays up to 12 stock tickers with price, daily change, and percentage change. Supports multiple view layouts and configurable currency symbols. Based on the official TRMNL Stock Price plugin.
- BYOS Server: A running instance of LaraPaper or another BYOS implementation with plugin support
- Node.js: v16+ for local development
- Docker: For local testing with trmnlp
- API Access: Bearer token from your BYOS instance for publishing plugins
trmnl-plugins/
├── package.json # Workspace root with convenience scripts
├── packages/
│ └── trmnl-tools/ # Shared development & publishing tools
└── plugins/
├── .env # Shared API credentials (git-ignored)
├── calendar/ # Calendar plugin with FullCalendar
├── health-chart/ # Health metrics tracking chart plugin
├── parcel/ # Package delivery tracking with Parcel app
└── stock-price/ # Stock price tracking with Finnhub API
git clone https://github.com/jasonwaters/trmnl.git
cd trmnl
npm installThis installs all workspace packages and dependencies.
Create a shared .env file for publishing to your BYOS server:
cd plugins
cp calendar/.env.example .envEdit .env with your BYOS credentials:
LARAPAPER_URL=https://your-byos-instance.com
LARAPAPER_TOKEN=your-api-token-hereGetting your API token:
- For LaraPaper: Navigate to "Plugins & Recipes" → "API" tab (
/plugins/api) - For other BYOS: Consult your implementation's documentation
All plugins will use this shared configuration. Individual plugins can override by creating their own .env file.
From the workspace root, you can run:
# Start calendar plugin
npm run start:calendar
# Start health chart plugin
npm run start:health
# Start parcel plugin
npm run start:parcel
# Start stock price plugin
npm run start:stockOr navigate to specific plugins:
cd plugins/calendar
npm startThis starts the trmnlp development server at http://localhost:4567 with live reload.
Each plugin can be published to multiple recipes on your BYOS instance.
-
Configure recipe publishing for each plugin:
cd plugins/calendar cp publish.config.yml.example publish.config.yml -
Edit
publish.config.ymlwith your recipe IDs:recipes: - name: Family Calendar trmnlp_id: your-family-calendar-id - name: Work Calendar trmnlp_id: your-work-calendar-id
-
Get recipe IDs from your BYOS instance:
- LaraPaper: Recipe page → Recipe Settings modal → "TRMNL Recipe ID" field
- Other BYOS: Consult your implementation's documentation
From the workspace root:
# Publish specific plugins
npm run publish:calendar
npm run publish:health
npm run publish:parcel
npm run publish:stockOr from within a plugin directory:
cd plugins/calendar
npm run publish # Publish to your BYOS instance
npm run publish:prod # Publish to production TRMNL (usetrmnl.com)The publish script will:
- Read all recipes from
publish.config.yml - Create recipe-specific packages (injecting correct
idandnamefor each) - Upload via API to each recipe sequentially
- Preserve existing configuration fields in each recipe
- Display a success summary for all recipes
All plugins share a single Docker Compose configuration via trmnl-dev:
cd plugins/calendar
npm start # Start trmnlp + auto-load test data
npm run logs # View server logs
npm run webhook # Reload test data
npm stop # Stop servicesView your plugin at http://localhost:4567/full
Each plugin includes a tmp/data.example.json with demo data. Copy it to get started:
cp tmp/data.example.json tmp/data.jsonEdit tmp/data.json to simulate your own webhook payloads. After making changes, run:
npm run webhookThis reloads the data without restarting the server.
-
Create plugin directory:
mkdir -p plugins/my-plugin/src mkdir -p plugins/my-plugin/tmp
-
Copy configuration templates:
cp plugins/health-chart/{package.json,.trmnlp.yml,.env.example,.gitignore,publish.config.yml.example} plugins/my-plugin/ -
Update configuration:
- Edit
package.jsonwith your plugin name and details - Update
src/settings.ymlwith plugin metadata - Create your Liquid templates in
src/ - Copy
tmp/data.example.jsontotmp/data.jsonand customize
- Edit
-
Start developing:
cd plugins/my-plugin npm start
All plugins use the @trmnl-tools/core package which provides:
trmnl-dev: Wraps Docker Compose with a shared configuration -- updating the trmnlp version or dev setup happens in one placetrmnl-publish: Multi-recipe publishing with dynamic ZIP creation and API upload
- DRY Principle: No code duplication across plugins
- Consistency: Identical workflow for all plugins
- Maintainability: Bug fixes and improvements benefit all plugins
- Scalability: Easy to add new plugins to the workspace
These plugins are designed to work with BYOS implementations that support:
- ✅ Plugins: Custom plugin installation and hosting
- ✅ Recipes: Multiple recipe instances of the same plugin
- ✅ JSON Data API: Webhook-based data updates
- ✅ Liquid Templates: Dynamic rendering with Liquid templating
Tested with:
- ✅ LaraPaper (PHP/Laravel) - Full compatibility
Potentially compatible with:
⚠️ Terminus (Ruby/Hanami) - Untested⚠️ Inker (JavaScript) - Untested⚠️ Other BYOS implementations - See BYOS documentation
If you successfully use these plugins with another BYOS implementation, please open an issue or PR to update this compatibility list!
Each plugin has detailed documentation in its own directory:
Contributions are welcome! Please feel free to submit issues or pull requests.
MIT - See individual plugin directories for more details.