
The TRMNL Diaries
Posted on by Maddy Miller
In Technology with tags Developer Experience, Retrospective
1314 words, 5 minutes to read
A few weeks after getting my TRMNL X e‑ink screen, I tried building my own plugins. The process was surprisingly different from what I expected.
https://madelinemiller.dev/blog/trmnl-diaries/A few weeks ago, my TRMNL X arrived. If you’re not familiar with this device, it’s basically a little e-ink screen which shows a rotation of updating information screens. I mostly use mine for family calendars, trivia, and “word of the day” screens, but when it arrived, I felt a strong urge to have a go at making a few plugins of my own. It’s been an interesting experience that differed a bit from what I expected, so I decided to write about it.
The plugins I’ve made
So first up, this is what I actually made. I made three plugins, all following the same base architecture with a fair amount of shared code/concepts.
The first is “TRMNL Mod Analytics”, an analytics plugin, displaying download counts for mods published on various game modding platforms. While I personally don’t really care much about the download counts of my own projects, it felt like a natural fit for the device and a good first plugin idea to make. I initially focused on the mod sites I was familiar with from my time writing Minecraft mods, or downloading Sims 4 mods, then expanded based on suggestions from a few people in other game modding communities. As of writing, the plugin supports Modrinth, Nexus Mods, CurseForge, Thunderstore, and Steam Workshop.
The second plugin is “TRMNL RuneScape HiScores”, a plugin to display leaderboard ranks for the two MMO RuneScape games. Technically it’s two plugins from a user perspective, one for RuneScape 3 and one for Old School RuneScape, as splitting them felt a lot easier to model rather than complicated configuration options for the user. I mostly made this one so that I could track my own progression in the Leagues leaderboards for both games, as there’s something about the Leagues game mode that my brain absolutely loves. I also wanted to be able to track the RuneScape 3 Group Ironman team that my partner and I play, but alas that data was not easily accessible to actually display.
The third and final plugin is “TRMNL Rebigulator” which displays the daily challenge from my Rebigulator Simpsons trivia game (which honestly deserves an article of its own). At the time of writing this plugin is not yet accepted on the public TRMNL marketplace, but I am hoping it’ll eventually be added. Otherwise, I’ll add better instructions for adding it as a private plugin on the site.
The plugin process
The way to write TRMNL plugins honestly differs greatly from what I assumed before getting into it, with it having an entire frontend framework. They publish a responsive CSS framework called “Framework” which makes it easier to handle different device capabilities. Scaling, layouts, orientations, colour support, etc. While I’ve not used Tailwind, it’s reminiscent of the way Tailwind has been described to me.
Deviating from this framework is not recommended and actually triggers a fairly strict range of hard-blockages to soft-warnings when attempting to publish a plugin for public use. For private use you can make use of as much CSS/JavaScript as you want, so I feel a market of sideloaded plugins might pop up at some point (if it hasn’t already). Overall, I found the framework mostly useful, aside from a few issues I ran into when making my Rebigulator plugin which were mostly due to it being too custom.
While this has gotten substantially better over time, I found the online editor to be fairly buggy, especially when it came to responsive layouts and dynamic grid/list content. I did find funnily enough that it’s seemingly more stable if I upload changes via the MCP server rather than the web UI. As of the time of writing though, I still see dynamic grid/ issues on the visual editor for my RuneScape HiScores plugins.
My architecture
I opted to use TRMNL “polling” system for my plugins, which is basically just a GET request to a custom link with substitutions based on form options. The UI templates (which TRMNL calls “Recipes”) then use the polled data to then control how it displays on the device itself. These requests only happen when data is polled to repopulate the display, so it’s not much of a load on a server.
I used CloudFlare Workers for the polled APIs, as they are very quick to spin up and fairly simple to write. They also provide a fairly decent caching API, which comes in handy when I want to minimise upstream API requests, and works extremely well when the intended use case is an infrequently updating device. The landing pages of the above plugins are all served by these workers too. These workers converted whatever API requests came from upstream into a format that my recipe files could read.
For my mod analytics plugin for example, I basically designed a common interface through which the actual recipe files rendered and repackaged the responses from all mod platforms to fit that interface. It worked decently well, although each platform had their own quirks and requirements. I also was surprisingly not able to extend the revenue stats that I’d set up with the Modrinth integration with any other platforms.
Review process
Once you’re ready to make a plugin public, you send it off for review. Having mostly dealt with review processes from larger companies (Apple, Google, etc), this one was significantly friendlier. It ended up being a back-and-forth conversation with someone at TRMNL (shoutout to Mario, who reviewed my plugins), with a focus on improving the plugin to the point it’s ready to release. I was always given very in-depth feedback on what needed improving, and the reviewer even fixed up a few small things for me here and there to speed up the process.
All the plugins I’ve published so far have been super smooth, and for the most part the review felt like it was actively improving the plugin rather than fitting it to an arbitrary checklist. It makes me more comfortable about the overall quality of plugins on the marketplace.
The device
Finally, this article would feel a bit empty if I didn’t go over the device itself. Overall, I feel the TRMNL X is great at what it’s made for. It is fundamentally a screen that displays static information on a timer, so don’t expect anything super dynamic. I do find the inbuilt gesture to swap to the next screen is far too slow to use outside of testing, so it needs to truly be treated as a rotating billboard on a timer. If that’s what you want, it’s great.
I did have a few issues during the initial setup, though. I’m not sure if I did something wrong, or if this was a quirk due to it being one of the earlier TRMNL X devices, but I did need to re-flash the firmware to get it out of a reboot loop. It wasn’t really an issue that bothered me as I worked around it quickly, but I’d hesitate to recommend the device to someone not comfortable with that level of troubleshooting due to it.
Overall, though, the device looks nice, does what it claims to fairly well, and is fairly fun to develop for. If you do want one of your own, I have an affiliate code (“madelinemiller”) which gives you USD$15 off the purchase price of their devices.
Final thoughts
In the end, these plugins have been a nice little side project. It’s a fairly different user model from most other things I work on, due to it being incredibly non-interactive. I’m unsure whether I’ll write more plugins, unless I think of anything that’d be a perfect fit or genuinely useful to me, but I’m glad that I now understand how to build them. Having owned the device for a few weeks now though, I’ve found that “less is more” when it comes to the number of screens. Too many and you never see each one enough. I do hope though that the ones I have made can be helpful or enjoyable to someone.



