From easiest to hardest:
Difficulty
| Public | Server required? | OAuth required? | Language |
Private Plugin | no | no | no | |
Recipe | yes | no | no | |
Screenshot | no | yes | no | any |
3rd Party | yes | yes | yes | any |
BYOS | no | yes | no | any |
Private Plugin
The simplest way to write a custom plugin is as a Private Plugin. Feed it data via HTTP polling or webhooks, even Oauth2. Design a beautiful dashboard with (or without) our Framework UI and we handle the rest.
Private plugins can remain private forever, shared offline via exporting, or "Unlisted" for with a hidden URL.
Recipe
Recipes are simply Private Plugins that have been approved by the TRMNL team to be listed publicly.
As recipe master, any changes you make will automatically propagate to others who have installed your recipe.
Learn more about building and submitting Recipes.
Screenshot
Another way to get custom content to a TRMNL is to leverage the Screenshot plugin.
Point this plugin to any website that looks decent in your TRMNL device's screen dimensions and TRMNL will periodically poll it to generate images. Common use cases for this plugin include publicly posted schedules, PDFs, school lunch menus, or even news sites.
Third Party Plugin
A third party plugin is the most flexible - and the most complex - custom plugin type.
You provide a web application that connects to TRMNL via our simplified OAuth2 authentication flow, and in return get per-user settings management, and full control over generated markup. TRMNL servers will periodically poll your application to generate images for the device.
While third party require the most effort, they have a couple unique benefits:
User's full name + email is shared with you (for building a newsletter, etc)
You can control how often you allow data to be refreshed, keeping your server and API costs under control, by simply throttling inbound markup requests
Learn how to build and submit a public plugin.
BYOS
For complete control over your TRMNL device you can Bring Your Own Server. This capability bypasses all plugin functionality provided above.
