<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/">
  <author>
    <name>Ryan Kulp</name>
    <uri>https://trmnl.com</uri>
  </author>
  <author>
    <name>Mario Lurig</name>
    <uri>https://trmnl.com</uri>
  </author>
  <author>
    <name>community</name>
    <uri>https://trmnl.com</uri>
  </author>
  <category term="trmnl"
    label="TRMNL"/>
  <generator uri="https://trmnl.com"
    version="0.0.0">TRMNL</generator>
  <icon>https://trmnl.com/favicon.ico</icon>
  <id>https://trmnl.com/blog</id>
  <link href="https://trmnl.com/blog"
    rel="alternate"
    type="text/html"
    title="TRMNL: Blog (web)"/>
  <link href="https://trmnl.com/feeds/blog.xml"
    rel="self"
    type="application/atom+xml"
    title="TRMNL: Blog (feed)"/>
  <logo>https://trmnl.com/images/brand/icons/icon--brand.png</logo>
  <rights>Copyright 2026</rights>
  <subtitle>The latest site news and information.</subtitle>
  <title>TRMNL: Blog</title>
  <updated>2026-05-26T00:00:00+00:00</updated>
  <entry>
    <author>
      <name>Ryan Kulp</name>
      <uri>https://trmnl.com</uri>
    </author>
    <category term="trmnl"
      label="TRMNL"/>
    <content type="html">&lt;div data-controller=&quot;blog-syntax-highlighter&quot; class=&quot;lexxy-content&quot;&gt;&lt;p&gt;thousands of people have built their own TRMNL device. last week we shared a survey to better understand the &lt;a href=&quot;https://docs.trmnl.com/go/diy/byod&quot;&gt;BYOD&lt;/a&gt; ecosystem, below are those results and what we&#39;re doing about it.&lt;/p&gt;&lt;h3&gt;ease of setup&lt;/h3&gt;&lt;p&gt;of 230 responses, 135 purchased a BYOD license. this is not necessary if you want to go fully open source (&lt;a href=&quot;https://docs.trmnl.com/go/diy/byos&quot;&gt;BYOS&lt;/a&gt;), but i&#39;m glad we can bifurcate results by this answer. you&#39;ll see why in a bit.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTczODY0OTk_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--c4fc3745b0c3db27891c5111ee19d4377b290d93&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczODY0OTksInB1ciI6ImJsb2JfaWQifX0=--51c54e5439893f9094ffc910759ea137463d25f7/trmnl-byod-intuitive-survey-result.png&quot; filename=&quot;trmnl-byod-intuitive-survey-result.png&quot; filesize=&quot;22387&quot; width=&quot;755&quot; height=&quot;313&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;1 - difficult; 5 - easy&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczODY0OTksInB1ciI6ImJsb2JfaWQifX0=--51c54e5439893f9094ffc910759ea137463d25f7/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/trmnl-byod-intuitive-survey-result.png&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          1 - difficult; 5 - easy
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;the majority (54.9%) of license holders said it was easy to set up their device, but i want this metric to be at least 70%.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;insight&lt;/strong&gt;&lt;/b&gt;: create smarter (device model specific) onboarding versus general guides.&lt;/p&gt;&lt;h3&gt;does size matter?&lt;/h3&gt;&lt;p&gt;here it appears we&#39;re already in the sweet spot.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTczODY1MDA_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--d4df78755567b5f0d975fa3dcc5434bfebad129d&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczODY1MDAsInB1ciI6ImJsb2JfaWQifX0=--76f1b438e61b6e31c2b1fd9f0e2c10988ed86783/trmnl-byod-display-size-interest.png&quot; filename=&quot;trmnl-byod-display-size-interest.png&quot; filesize=&quot;27413&quot; width=&quot;721&quot; height=&quot;287&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Interest by display size&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczODY1MDAsInB1ciI6ImJsb2JfaWQifX0=--76f1b438e61b6e31c2b1fd9f0e2c10988ed86783/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/trmnl-byod-display-size-interest.png&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Interest by display size
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;although 43.1% of responses are seeking devices larger than 11&quot;, that number drops to 35% when considering only BYOD license holders. i think can be explained by how prohibitively expensive displays become past the ~13 inch threshold.&lt;/p&gt;&lt;p&gt;a license holder is aware of ePaper price jumps, a non license holder may not be and is living in fantasy land. which is OK, we live there too. let&#39;s be neighbors?&lt;/p&gt;&lt;p&gt;larger displays are also a lot more complex to set up. as your screen interface jumps from SPI to parallel, driver boards change, so does power consumption, and of course so does the enclosure needed to fit it all. designing a 3D printable case for a large display would be a 20+ hour print and require multiple joints to connect disparate pieces.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;insight&lt;/strong&gt;&lt;/b&gt;: focus on 7.5 - 13.3&quot; displays. if you need something much bigger, stay tuned for an announcement later this Summer.&lt;/p&gt;&lt;h3&gt;ecosystem compatibility&lt;/h3&gt;&lt;p&gt;this was a curious set of answers, inconclusive from a prioritization standpoint and an obvious indication that we (i) do a poor job communicating the myriad devices already supported.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTczODY1MDM_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--efd7eb8b67a652d8a6d422ba0c34837e6f06448a&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczODY1MDMsInB1ciI6ImJsb2JfaWQifX0=--4a46e0c19ac21ab620f033665d403a431b8211b2/trmnl-byod-device-compatibility-demand.png&quot; filename=&quot;trmnl-byod-device-compatibility-demand.png&quot; filesize=&quot;36884&quot; width=&quot;717&quot; height=&quot;281&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Demand by device&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczODY1MDMsInB1ciI6ImJsb2JfaWQifX0=--4a46e0c19ac21ab620f033665d403a431b8211b2/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/trmnl-byod-device-compatibility-demand.png&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Demand by device
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;insight&lt;/strong&gt;&lt;/b&gt;: ask this question again after increasing ecosystem visibility.&lt;/p&gt;&lt;h3&gt;quickstart wishlist&lt;/h3&gt;&lt;p&gt;for the impulsive shopper i wanted to understand which singular optimization might have swayed their purchase decision. we&#39;re not in the business of selling things people don&#39;t need, but we are in the business of creating &lt;i&gt;&lt;em&gt;aha&lt;/em&gt;&lt;/i&gt; moments.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTczODY1MTA_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--6ea993937f4678339305256f4343db68054aaaf5&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczODY1MTAsInB1ciI6ImJsb2JfaWQifX0=--dbc5004922cb38aaabb180d98f1a936210bd6dd0/trmnl-byod-quickstart-wishlist.png&quot; filename=&quot;trmnl-byod-quickstart-wishlist.png&quot; filesize=&quot;19872&quot; width=&quot;589&quot; height=&quot;360&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;What would help you get started?&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczODY1MTAsInB1ciI6ImJsb2JfaWQifX0=--dbc5004922cb38aaabb180d98f1a936210bd6dd0/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/trmnl-byod-quickstart-wishlist.png&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          What would help you get started?
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;here we&#39;ll look at only &lt;i&gt;&lt;em&gt;non&lt;/em&gt;&lt;/i&gt; BYOD license holder responses. a whopping 58.8% said a Free Trial would have helped them make a decision, whereas only 41.9% of license holders would have preferred a free trial.&lt;/p&gt;&lt;p&gt;and nearly double the number of license holders (31.8%) prefer better documentation to non license holders (17.6%). this makes sense given you don&#39;t know the strength of a guide until you actually try to follow it.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;insight&lt;/strong&gt;&lt;/b&gt;: implement a free trial &lt;i&gt;&lt;em&gt;or&lt;/em&gt;&lt;/i&gt; interactive demo.&lt;/p&gt;&lt;h3&gt;open-ended requests&lt;/h3&gt;&lt;p&gt;this is the most valuable part of the survey because it&#39;s a bummer to read. below are a few random examples, copy/pasted verbatim, along with our reaction.&lt;/p&gt;&lt;figure class=&quot;lexxy-content__table-wrapper&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th class=&quot;lexxy-content__table-cell--header&quot;&gt;&lt;p&gt;Request&lt;/p&gt;&lt;/th&gt;&lt;th class=&quot;lexxy-content__table-cell--header&quot;&gt;&lt;p&gt;TRMNL note&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Amazon Kindle (jailbroken)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;already supported [&lt;a href=&quot;https://github.com/usetrmnl/trmnl-kindle&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;https://github.com/usetrmnl/trmnl-koreader&quot;&gt;2&lt;/a&gt;]&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;android tablets&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;already supported [&lt;a href=&quot;https://play.google.com/store/apps/details?id=ink.trmnl.android&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;https://play.google.com/store/apps/details?id=ink.trmnl.android.buddy&amp;amp;pli=1&quot;&gt;2&lt;/a&gt;]&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Inkplate&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;already supported [&lt;a href=&quot;https://trmnl.com/api/models&quot;&gt;1&lt;/a&gt;]&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Tidbyt&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;already supported [&lt;a href=&quot;https://help.trmnl.com/en/articles/12430929-tidbyt&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;https://help.trmnl.com/en/articles/12881005-plugin-composer&quot;&gt;2&lt;/a&gt;]&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Apparently the Raspberry Pi repo does not support E-Ink displays last time I checked. If this is still the case, I’d love to see support for that case (please). I’d like to get a Pi and a big e-ink screen and put them together&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;already supported [&lt;a href=&quot;https://github.com/usetrmnl/trmnl-display/releases/tag/v0.1.0&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;https://www.reddit.com/r/eink/comments/1r2vixv/pimoroini_133_impression_eink_framed_powered_by/&quot;&gt;2&lt;/a&gt;]&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Full color epaper displays&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;already supported [&lt;a href=&quot;https://github.com/lanrat/homeplate&quot;&gt;1&lt;/a&gt;]&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;clearly we have an education problem. &lt;i&gt;&lt;em&gt;a deep rabbit hole does no good if it&#39;s hard to find&lt;/em&gt;&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;insight&lt;/strong&gt;&lt;/b&gt;: make it easy (+ fun) to figure out which household devices can run TRMNL.&lt;/p&gt;&lt;h3&gt;what&#39;s next&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/bitbank2/&quot;&gt;Larry Bank&lt;/a&gt; leads our BYOD effort. for an introduction to some of his impact at TRMNL see &lt;a href=&quot;https://trmnl.com/blog/no-more-flicker&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://trmnl.com/blog/power-efficiency&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://trmnl.com/blog/environment-sensors&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Larry can reverse engineer and improve just about any device &amp;lt;&amp;gt; display combo, making it TRMNL friendly and power efficient.&lt;/p&gt;&lt;p&gt;for the past several months we&#39;ve expanded our BYOD offering largely on a set of hunches, mine and his, about what people want. today we&#39;re beginning to mix those gut decisions with community feedback.&lt;/p&gt;&lt;p&gt;to the thousands of customers who purchased BYOD licenses, thank you. a portion of your funds go directly to &lt;a href=&quot;https://trmnl.com/blog/creator-fund&quot;&gt;TRMNL Creators&lt;/a&gt; and your live chats, public reviews, and emails will continue guiding us.&lt;/p&gt;&lt;p&gt;to prospective DIY-ers, stay tuned for better docs, faster and risk-free demos, and less digging around our website to figure out if the device in your hand is TRMNL compatible.&lt;/p&gt;&lt;p&gt;for all the raw data used in this post, go &lt;a href=&quot;https://docs.google.com/spreadsheets/d/14mMk5gvusTobRWSvGaxG74cvDwhAYJUtTKShUeccC7w/edit?usp=sharing&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
    <id>https://trmnl.com/blog/state-of-byod</id>
    <link href="https://trmnl.com/blog/state-of-byod"/>
    <published>2026-05-26T00:00:00+00:00</published>
    <rights>Copyright 2026</rights>
    <title>State of BYOD</title>
    <updated>2026-05-26T00:00:00+00:00</updated>
    <dc:date>2026-05-26T00:00:00+00:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>Mario Lurig</name>
      <uri>https://trmnl.com</uri>
    </author>
    <category term="trmnl"
      label="TRMNL"/>
    <content type="html">&lt;div data-controller=&quot;blog-syntax-highlighter&quot; class=&quot;lexxy-content&quot;&gt;&lt;blockquote&gt;This post is part of a series, featuring the incredible work of plugin authors who grow the TRMNL plugin ecosystem with every contribution. The TRMNL team has individually selected these plugins and authors to be featured.&lt;/blockquote&gt;&lt;h2&gt;&lt;a href=&quot;https://trmnl.com/integrations/brick-storage&quot;&gt;Brick Storage&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Community member Daniel Boberg created the &lt;a href=&quot;https://trmnl.com/integrations/brick-storage&quot;&gt;Brick Storage&lt;/a&gt; plugin; here are their words on how it was created.&lt;/p&gt;&lt;h3&gt;Why did you want this plugin to exist?&lt;/h3&gt;&lt;p&gt;I built Brick Storage to track my LEGO collection. Market values, ROI, what&#39;s gaining value. But I kept opening the app just to glance at my portfolio total. When I got my TRMNL, it clicked immediately: this number belongs on my desk, updating quietly, not behind a browser tab. A passive, always-there glance at your collection&#39;s worth. No login, no app, no notification. Just the data, on e-ink, beautiful.&lt;/p&gt;&lt;h3&gt;Why were you the person to make it?&lt;/h3&gt;&lt;p&gt;I&#39;m a LEGO collector who couldn&#39;t find a tool that treated collections like real portfolios so I built Brick Storage myself. It started as a side project for tracking my own sets, and grew into a platform with 25,000+ sets, live market data from multiple sources, and a small but passionate community. When my TRMNL arrived, the first thing I wanted to see on it was my collection&#39;s value. I&#39;m not just the developer, I&#39;m the first user. Every feature exists because I wanted it on my own desk first.&lt;/p&gt;&lt;h3&gt;How did you balance look vs functionality?&lt;/h3&gt;&lt;p&gt;Data first. On e-ink you don&#39;t have color or animation, so the information hierarchy has to carry everything. I spent most of my time figuring out what to show vs. what to cut. The portfolio view packs a lot into one screen (value, ROI, sparkline, top performers), but it only works because TRMNL&#39;s CSS framework handles the typography well. For the random discovery view I let the set image do the heavy lifting and kept the text minimal.&lt;/p&gt;&lt;h3&gt;What was your process for creating the plugin?&lt;/h3&gt;&lt;p&gt;I already had the full data pipeline running on Supabase. So the plugin was mostly about building a new rendering layer on top of existing data. I wrote the markup endpoint that generates HTML for all four TRMNL sizes. No Liquid, no external template engine. Just raw HTML strings with TRMNL&#39;s CSS classes.&lt;/p&gt;&lt;h3&gt;Did you learn anything you want to apply to future recipes?&lt;/h3&gt;&lt;p&gt;Start with all four layout sizes from day one. I built the full view first and then had to rethink everything for half and quadrant. If I&#39;d designed quadrant first, the full view would have come together much faster. Small screen first, then scale up.&lt;/p&gt;&lt;h3&gt;Is there a tip you would give to a new plugin developer?&lt;/h3&gt;&lt;p&gt;Use the TRMNL &lt;a href=&quot;https://trmnl.com/framework/docs/v3&quot;&gt;CSS Framework&lt;/a&gt; classes instead of writing custom styles. I wasted time with inline CSS before realizing the built-in classes handle e-ink rendering way better. Also, test with actual data early. The preview on trmnl.com looks different from the real device, especially with images and contrast.&lt;/p&gt;&lt;h3&gt;What is your favorite plugin that someone else created and why?&lt;/h3&gt;&lt;p&gt;The &lt;a href=&quot;https://trmnl.com/integrations/youtube-analytics&quot;&gt;YouTube Stats&lt;/a&gt; plugin. Simple idea, clean execution. Subscriber count and recent video stats on your desk without opening YouTube Studio. It&#39;s the same principle I follow: Data you check too often deserves a passive e-ink display.&lt;/p&gt;&lt;h3&gt;Do you have a LEGO addiction?&lt;/h3&gt;&lt;p&gt;My TRMNL shows my LEGO portfolio at all times. I caught myself rearranging my desk so it&#39;s the first thing I see in the morning.&lt;/p&gt;
&lt;/div&gt;
</content>
    <id>https://trmnl.com/blog/featured-plugin-brick-storage</id>
    <link href="https://trmnl.com/blog/featured-plugin-brick-storage"/>
    <published>2026-05-19T00:00:00+00:00</published>
    <rights>Copyright 2026</rights>
    <title>Featured Community Plugin - Brick Storage</title>
    <updated>2026-05-19T00:00:00+00:00</updated>
    <dc:date>2026-05-19T00:00:00+00:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>Ryan Kulp</name>
      <uri>https://trmnl.com</uri>
    </author>
    <category term="trmnl"
      label="TRMNL"/>
    <content type="html">&lt;div data-controller=&quot;blog-syntax-highlighter&quot; class=&quot;lexxy-content&quot;&gt;&lt;p&gt;We &lt;a href=&quot;https://usetrmnl.com/blog/introducing-trmnl-x&quot;&gt;introduced X&lt;/a&gt; on July 30, 2025. We began assembly + fulfillment on March 18, 2026. Below are live updates since launch.&lt;/p&gt;&lt;h3&gt;When will I receive my TRMNL X?&lt;/h3&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;Live in USA, Canada, India, Mexico, or Australia?&lt;/strong&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Your TRMNL will ship from our USA warehouse. Due to lost freight this warehouse is short some case components, see ”May” section further down this post for more details.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;Live in Europe, Asia, Africa, South America, etc?&lt;/strong&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Your TRMNL will ship from our Berlin warehouse. Due to Customs issues and supplier theft, this warehouse has only received some case colors and did not receive magnets until May 21. See “May” section further below for more updates&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;Magnets are here!&lt;/strong&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Both warehouses have strong (N52 grade) magnets. USA has been shipping with them since April 26 and is further ahead in its order queue. Magnets arrived at our Berlin, Germany warehouse on May 21.&lt;/p&gt;&lt;p&gt;*For more details about magnet issues see the March and April sections further down this post.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;Estimating queue &amp;lt;&amp;gt; delivery timeline&lt;/strong&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Each warehouse is shipping ~50% of X orders, so if your spot in the queue is 4,000, it&#39;s actually spot 2,000 from your respective origin. As of May 20 we’re shipping 400-500+ devices per business day.&lt;/p&gt;&lt;p&gt;So if you&#39;re in the USA and your spot is 4000 =&amp;gt; 2000, your order will ship in around 10 business days. The (big) caveat here is your device color. USA and Germany have been receiving expedited re-shipments of lost freight which includes charing docks and wall mounts.&lt;/p&gt;&lt;h3&gt;Tech Specs&lt;/h3&gt;&lt;p&gt;Highlights below, or see everything &lt;a href=&quot;https://trmnl.com/products/x/spec-sheet&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;10.3&quot; 1872x1404 EPD resolution with 16 shades of gray&lt;/li&gt;&lt;li&gt;Dust and basic waterproofing with a hacker-friendly enclosure&lt;/li&gt;&lt;li&gt;ESP32-S3 with 16MB of flash and 8MB of PSRAM as a core processor with fallback 2.4GHz WiFi&lt;/li&gt;&lt;li&gt;5GHz WiFi support via ESP32-C5 as a modem (external antenna)&lt;/li&gt;&lt;li&gt;Support up to 2x 6000mAh 3.8V LiPo batteries with automatic detection&lt;/li&gt;&lt;li&gt;Battery gas gauge from TI for battery SOC/SOH/capacity tracking&lt;/li&gt;&lt;li&gt;Bosch accelerometer for portrait/landscape orientation&lt;/li&gt;&lt;li&gt;Gesture touch-bar based on Azotech IC&lt;/li&gt;&lt;li&gt;Magnetic pogo pin-based mount for charging and accessories (Coming 2026)&lt;/li&gt;&lt;li&gt;OTG support with 5V 2A output&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Dimensions&lt;/h3&gt;&lt;p&gt;These values may change as we scale production. last updated December 15, 2025.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTY2MzIxMjU_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--afd8df5339ded2d0dbc6f0a9c022b8a90db3d452&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://usetrmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY2MzIxMjUsInB1ciI6ImJsb2JfaWQifX0=--4fe9bcea7ce6f5b07810b792a3e4769bd9b3ec05/TRMNL-X-dimensions-2025-12-15.jpg&quot; filename=&quot;TRMNL-X-dimensions-2025-12-15.jpg&quot; filesize=&quot;40897&quot; width=&quot;1278&quot; height=&quot;832&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;X enclosure dimensions (mm)&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY2MzIxMjUsInB1ciI6ImJsb2JfaWQifX0=--4fe9bcea7ce6f5b07810b792a3e4769bd9b3ec05/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--d5e667c0137ab726f37f5f3b8ccaf980246e425b/TRMNL-X-dimensions-2025-12-15.jpg&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          X enclosure dimensions (mm)
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;Weight (device only, no attachments)&lt;/p&gt;&lt;p&gt;1 battery - 362 grams&lt;br&gt;2 batteries - 448 grams&lt;/p&gt;&lt;h3&gt;&lt;b&gt;&lt;strong&gt;August 2025&lt;/strong&gt;&lt;/b&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Multiple boards and controllers support touch gestures, battery charging, and 5ghz WiFi&lt;/li&gt;&lt;li&gt;The circular area interfaces with a waterproof &quot;puck&quot; shaped charging connector, and several test points on the motherboard&#39;s bottom will let us build a QA jig for our warehouse&lt;/li&gt;&lt;li&gt;Prior to release we&#39;ll prototypes to your favorite creators for first-look reviews&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;September 2025&lt;/h3&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTY0Njk4MDc_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--e65fee844581cfc51ea6b1464022c1afb0ca026c&quot; content-type=&quot;image/png&quot; url=&quot;https://usetrmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY0Njk4MDcsInB1ciI6ImJsb2JfaWQifX0=--3848d7bc1ccc9b3f6dbae3f418cdc08223198ba7/trmnl-x-board-preview.png&quot; filename=&quot;trmnl-x-board-preview.png&quot; filesize=&quot;187997&quot; width=&quot;2636&quot; height=&quot;2066&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;PCB preview&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY0Njk4MDcsInB1ciI6ImJsb2JfaWQifX0=--3848d7bc1ccc9b3f6dbae3f418cdc08223198ba7/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/trmnl-x-board-preview.png&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          PCB preview
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;ol&gt;&lt;li&gt;We ordered 50x more prototypes with stronger magnets so devices can attach directly to a surface (e.g. refrigerator) without&amp;nbsp;&lt;a href=&quot;https://github.com/usetrmnl/mounts&quot;&gt;mounts&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Dual band WiFi will be powered by the ESP32-C5 and we&#39;ve benchmarked faster speeds + better range with custom modem firmware&lt;/li&gt;&lt;li&gt;Orders with the Battery Upgrade (or Clarity Kit) will now enjoy 10,000mAh versus the announced 7,000mAh variant&lt;/li&gt;&lt;li&gt;Our &quot;charging puck&quot; (name TBD) now has a universal connector for kickstands and other peripheral accessories that will debut in 2026&lt;/li&gt;&lt;li&gt;The same firmware that runs all OG + BYOD devices has&amp;nbsp;&lt;a href=&quot;https://github.com/usetrmnl/trmnl-firmware/tree/trmnl_x_alpha&quot;&gt;been extended&lt;/a&gt;&amp;nbsp;and is already running my own X prototype, &lt;a href=&quot;https://x.com/useTRMNL/status/1979637211412017281&quot;&gt;preview here&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;October 2025&lt;/h3&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTY0ODQyMzM_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--a5a50e0b90ef76e5acdf6beea3f046c57655527b&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://usetrmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY0ODQyMzMsInB1ciI6ImJsb2JfaWQifX0=--11ea7b6379735e1dea6bf5387f6192ba4adb2b2b/TRMNL-X-robin-williams-test.jpeg&quot; filename=&quot;TRMNL-X-robin-williams-test.jpeg&quot; filesize=&quot;265844&quot; width=&quot;960&quot; height=&quot;1280&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Grayscale testing with a GOAT&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpeg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY0ODQyMzMsInB1ciI6ImJsb2JfaWQifX0=--11ea7b6379735e1dea6bf5387f6192ba4adb2b2b/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGVnIiwicmVzaXplX3RvX2xpbWl0IjpbMTAyNCw3NjhdfSwicHVyIjoidmFyaWF0aW9uIn19--b5fc5af83c336b0fe3eb199eed01a2c85b3a702d/TRMNL-X-robin-williams-test.jpeg&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Grayscale testing with a GOAT
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;ol&gt;&lt;li&gt;The first batch of screens arrived at our USA warehouse, more en route to our &lt;a href=&quot;https://usetrmnl.com/blog/slashing-postage-rates-again&quot;&gt;Berlin warehouse&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Gesture bar + charging pucks are in small batch production&lt;/li&gt;&lt;li&gt;Received and approved packaging samples. Model X packaging will be more premium and protective than OG packaging.&lt;/li&gt;&lt;li&gt;Consolidating WiFi antennas (2.4 + 5gh) to a single component&lt;/li&gt;&lt;li&gt;Added 3 angle options (degrees) to the kickstand&lt;/li&gt;&lt;li&gt;[Work in progress] battery options may grow another 20% to 6000/12000mAh variants pending more testing&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;November 2025&lt;/h3&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTY1MTg1ODA_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--d8a89686dba4f4b04bc16dcb136c95eab525f0bd&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://usetrmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY1MTg1ODAsInB1ciI6ImJsb2JfaWQifX0=--c1477124c066c9bfa66b9ccd6f09cb176c30b9d9/TRMNL-X-assembly.jpeg&quot; filename=&quot;TRMNL-X-assembly.jpeg&quot; filesize=&quot;296326&quot; width=&quot;1280&quot; height=&quot;960&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Full assembly (3D printed parts, not final)&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpeg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY1MTg1ODAsInB1ciI6ImJsb2JfaWQifX0=--c1477124c066c9bfa66b9ccd6f09cb176c30b9d9/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGVnIiwicmVzaXplX3RvX2xpbWl0IjpbMTAyNCw3NjhdfSwicHVyIjoidmFyaWF0aW9uIn19--b5fc5af83c336b0fe3eb199eed01a2c85b3a702d/TRMNL-X-assembly.jpeg&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Full assembly (3D printed parts, not final)
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTY1MTc0OTY_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--824732486c8578547d16075875d06a33df483cc4&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://usetrmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY1MTc0OTYsInB1ciI6ImJsb2JfaWQifX0=--74089f2a8c4c8b2d415181e16336639c0fca35f4/TRMNL-X-prototype-back.jpeg&quot; filename=&quot;TRMNL-X-prototype-back.jpeg&quot; filesize=&quot;173771&quot; width=&quot;1280&quot; height=&quot;674&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Fully functional prototype (3D printed case, non-branded silicone pads)&quot;&gt;  &lt;/action-text-attachment&gt;&lt;/p&gt;&lt;figure class=&quot;attachment attachment--preview attachment--jpeg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY1MTc0OTYsInB1ciI6ImJsb2JfaWQifX0=--74089f2a8c4c8b2d415181e16336639c0fca35f4/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGVnIiwicmVzaXplX3RvX2xpbWl0IjpbMTAyNCw3NjhdfSwicHVyIjoidmFyaWF0aW9uIn19--b5fc5af83c336b0fe3eb199eed01a2c85b3a702d/TRMNL-X-prototype-back.jpeg&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Fully functional prototype (3D printed case, non-branded silicone pads)
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTY1MTc0OTc_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--3cf5cb7b951505b570349e23af70950eec7fd0cd&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://usetrmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY1MTc0OTcsInB1ciI6ImJsb2JfaWQifX0=--aaf5c4631331eaf1ee4fbc0f8b97cab4cdc71593/TRMNL-X-prototype-front.jpeg&quot; filename=&quot;TRMNL-X-prototype-front.jpeg&quot; filesize=&quot;238857&quot; width=&quot;1280&quot; height=&quot;960&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Prototype running latest (public) firmware release&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpeg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY1MTc0OTcsInB1ciI6ImJsb2JfaWQifX0=--aaf5c4631331eaf1ee4fbc0f8b97cab4cdc71593/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGVnIiwicmVzaXplX3RvX2xpbWl0IjpbMTAyNCw3NjhdfSwicHVyIjoidmFyaWF0aW9uIn19--b5fc5af83c336b0fe3eb199eed01a2c85b3a702d/TRMNL-X-prototype-front.jpeg&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Prototype running latest (public) firmware release
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Added extra reset buttons to S3 and C5 MCUs for hacker friendliness, board design is final&lt;/li&gt;&lt;li&gt;Batteries are in production and we can confirm the improved 6k / 12kmAh sizing (announced size: 5k / 7k)&amp;nbsp;&lt;/li&gt;&lt;li&gt;Enclosure injection molds are in production, purchase order placed for thousands of cases in different colors&lt;/li&gt;&lt;li&gt;Magnet deliveries from Chinese factories have been delayed due to recent&amp;nbsp;&lt;a href=&quot;https://www.cnbc.com/2025/11/10/china-suspends-some-critical-mineral-export-curbs-to-the-us-as-trade-truce-takes-hold.html&quot;&gt;Critical Mineral Export Bans&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;December 2025&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Battery production complete, shipping to our warehouses next week&lt;/li&gt;&lt;li&gt;EC licenses underway at testing facilities&lt;/li&gt;&lt;li&gt;Packaging in mass production&lt;/li&gt;&lt;li&gt;Magnets in mass production&lt;/li&gt;&lt;li&gt;[New] OTG functionality - power other devices from your TRMNL&#39;s charging puck&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;January 2026&lt;/h3&gt;&lt;p&gt;From my desk to yours, a &lt;a href=&quot;https://www.youtube.com/watch?v=LNcoAZJP3hk&quot;&gt;video update&lt;/a&gt;.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTY3NTYyNDE_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--ff980753fe59bd5c1d900042c94b672cb7df22bd&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY3NTYyNDEsInB1ciI6ImJsb2JfaWQifX0=--4a9e8b1d8020df4a822132b47790326a0e899297/trmnl-x-fulfillment-update-jan-2026.jpg&quot; filename=&quot;trmnl-x-fulfillment-update-jan-2026.jpg&quot; filesize=&quot;102241&quot; width=&quot;1280&quot; height=&quot;720&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY3NTYyNDEsInB1ciI6ImJsb2JfaWQifX0=--4a9e8b1d8020df4a822132b47790326a0e899297/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--d5e667c0137ab726f37f5f3b8ccaf980246e425b/trmnl-x-fulfillment-update-jan-2026.jpg&quot;&gt;

  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;h3&gt;February 2026&lt;/h3&gt;&lt;p&gt;From our warehouse to your desk, a &lt;a href=&quot;https://www.youtube.com/watch?v=hiUiWCy93kg&quot;&gt;video update&lt;/a&gt;.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTY4MDMzNzA_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--552e5837128e6639a6a9fcb2642fef5ad103b626&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY4MDMzNzAsInB1ciI6ImJsb2JfaWQifX0=--8d3563708b4c2953b5f4e0585a21d05396a8fbe9/model-x-fulfillment-update-2.jpeg&quot; filename=&quot;model-x-fulfillment-update-2.jpeg&quot; filesize=&quot;227933&quot; width=&quot;1280&quot; height=&quot;720&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpeg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY4MDMzNzAsInB1ciI6ImJsb2JfaWQifX0=--8d3563708b4c2953b5f4e0585a21d05396a8fbe9/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGVnIiwicmVzaXplX3RvX2xpbWl0IjpbMTAyNCw3NjhdfSwicHVyIjoidmFyaWF0aW9uIn19--b5fc5af83c336b0fe3eb199eed01a2c85b3a702d/model-x-fulfillment-update-2.jpeg&quot;&gt;

  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;h3&gt;March 2026&lt;/h3&gt;&lt;p&gt;From my desk to yours, a &lt;a href=&quot;https://www.youtube.com/watch?v=TVSFlB5-ldk&quot;&gt;video update&lt;/a&gt;.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTY5MDQ5NjM_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--871782b71aa9639d525d2c027127dc00c01ca445&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY5MDQ5NjMsInB1ciI6ImJsb2JfaWQifX0=--e75e94298c78b2288a20d9f90d48226ddd589d1f/trmnl-x-now-shipping-video-update.jpg&quot; filename=&quot;trmnl-x-now-shipping-video-update.jpg&quot; filesize=&quot;184157&quot; width=&quot;1280&quot; height=&quot;720&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTY5MDQ5NjMsInB1ciI6ImJsb2JfaWQifX0=--e75e94298c78b2288a20d9f90d48226ddd589d1f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--d5e667c0137ab726f37f5f3b8ccaf980246e425b/trmnl-x-now-shipping-video-update.jpg&quot;&gt;

  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;If you prefer not to watch the video, in summary we&#39;re shipping single-battery devices only from our USA warehouse because our magnet supplier ripped us off and sent thousands of weak magnets, following multiple sample shipments with the correct (strong) magnets.&lt;/p&gt;&lt;p&gt;As of Wednesday, March 18:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Berlin warehouse has all 3 types of PCBs&lt;/li&gt;&lt;li&gt;Berlin warehouse should receive device enclosures in 1-2 weeks&lt;/li&gt;&lt;li&gt;USA warehouse has everything and has begun assembly + fulfillment&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;To check your place in the queue go here:&lt;br&gt;&lt;a href=&quot;https://trmnl.com/order-tracker&quot;&gt;https://trmnl.com/order-tracker&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you already have a TRMNL, install the Order Tracker plugin to stay up to date:&lt;br&gt;&lt;a href=&quot;https://trmnl.com/recipes/260817&quot;&gt;https://trmnl.com/recipes/260817&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;How can I estimate the time it will take to receive mine?&lt;/strong&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Devices will be shipped in the order they were purchased and we intend to scale to 100s of fulfillments per day, as we have done for past releases and back-in-stock periods.&lt;/p&gt;&lt;p&gt;Our 2x warehouses have trained 15+ individuals to flash, assemble, and ship devices. We do not outsource to 3rd party logistics companies. You can learn more about our end to end philosophy and technology &lt;a href=&quot;https://trmnl.com/blog/in-house-fulfillment&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://trmnl.com/blog/logistics-tech&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;April 2026&lt;/h3&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcwMzQ3NzA_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--67bc3d1334c8268ecdb70e1f782f074bf1d264b6&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcwMzQ3NzAsInB1ciI6ImJsb2JfaWQifX0=--4cfe457627cf9aeecbf3fd623d1ecbe4ccb149ab/trmnl-x-magnet-performance.jpeg&quot; filename=&quot;trmnl-x-magnet-performance.jpeg&quot; filesize=&quot;122001&quot; width=&quot;1280&quot; height=&quot;720&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpeg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcwMzQ3NzAsInB1ciI6ImJsb2JfaWQifX0=--4cfe457627cf9aeecbf3fd623d1ecbe4ccb149ab/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGVnIiwicmVzaXplX3RvX2xpbWl0IjpbMTAyNCw3NjhdfSwicHVyIjoidmFyaWF0aW9uIn19--b5fc5af83c336b0fe3eb199eed01a2c85b3a702d/trmnl-x-magnet-performance.jpeg&quot;&gt;

  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;See a live demonstration of strong, N52 grade magnets on various refrigerator surfaces in &lt;a href=&quot;https://youtu.be/_0_XQ63_Hf0&quot;&gt;this video update&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;On April 26, &lt;a href=&quot;https://www.reddit.com/r/trmnl/s/niT6hBdSUT&quot;&gt;N52 magnets arrived&lt;/a&gt; at our USA warehouse and assembly/fulfillment pace will increase dramatically beginning Monday, April 27.&lt;/p&gt;&lt;p&gt;On April 27, white + gray cases arrived at our Berlin warehouse and they are building half-assemblies (docks, kickstands) as they await N52 magnets.&lt;/p&gt;&lt;h3&gt;May 2026&lt;/h3&gt;&lt;p&gt;Between May 2-6th the USA warehouse was out of stock of charging docks for several colors due to a supplier mistake. To mitigate we assembled devices of all colors, but only fulfilled in-stock (charging dock) orders, some of which may sequentially be &lt;a href=&quot;https://trmnl.com/order-tracker&quot;&gt;behind yours&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;May 7 - black and sage charging docks arrived, allowing us to mostly ship in sequential order. This ensures the highest throughput overall, as punishing later orders with in-stock colors does not increase the speed of out-of-stock colors arriving&lt;b&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;May 19 - USA warehouse is still waiting for white + gray docks and thus cannot ship those colors, despite having all the other parts. These were lost in transit and a new batch has been sent by our supplier.&lt;/p&gt;&lt;p&gt;May 21 - Berlin, Germany warehouse received a batch of N52 magnets. They are now shipping black, sage, clear.&lt;/p&gt;&lt;p&gt;May 27 - Berlin, Germany warehouse received white u-mounts and is now able to ship white devices.&lt;/p&gt;&lt;p&gt;May 29 - USA warehouse received missing white charging docks and is finally shipping white devices.&lt;/p&gt;
&lt;/div&gt;
</content>
    <id>https://trmnl.com/blog/model-x-progress</id>
    <link href="https://trmnl.com/blog/model-x-progress"/>
    <published>2026-05-19T00:00:00+00:00</published>
    <rights>Copyright 2026</rights>
    <title>Model X Progress Report</title>
    <updated>2026-05-19T00:00:00+00:00</updated>
    <dc:date>2026-05-19T00:00:00+00:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>Ryan Kulp</name>
      <uri>https://trmnl.com</uri>
    </author>
    <category term="trmnl"
      label="TRMNL"/>
    <content type="html">&lt;div data-controller=&quot;blog-syntax-highlighter&quot; class=&quot;lexxy-content&quot;&gt;&lt;p&gt;most startups are founded in big cities with expensive rents. TRMNL started in a basement in the middle of nowhere and later moved to my barn.&lt;/p&gt;&lt;p&gt;with unlimited space it made sense to &lt;a href=&quot;https://trmnl.com/blog/in-house-fulfillment&quot;&gt;fulfill in-house&lt;/a&gt; and &lt;a href=&quot;https://trmnl.com/blog/logistics-tech&quot;&gt;create an assembly line&lt;/a&gt; and &lt;a href=&quot;https://trmnl.com/blog/slashing-postage-rates-again&quot;&gt;open a 2nd warehouse&lt;/a&gt;. what did &lt;i&gt;&lt;em&gt;not&lt;/em&gt;&lt;/i&gt; make sense was writing a bunch of courier API integrations.&lt;/p&gt;&lt;p&gt;so last April we signed an annual contract to use ShipHero&#39;s fulfillment software at our warehouses in Georgia and Germany. it worked OK but wasn&#39;t great.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;support tickets often ignored&lt;/li&gt;&lt;li&gt;mobile layouts are non-existent&lt;/li&gt;&lt;li&gt;web portal is split across 2x domains with poor SSO between them&lt;/li&gt;&lt;li&gt;it&#39;s generally ugly (we value &lt;a href=&quot;https://trmnl.com/framework&quot;&gt;aesthetics&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;on March 31, 2026 it stopped working at our Berlin warehouse&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;the last point was our breaking point. for weeks we tried being helpful to our account manager and ShipHero&#39;s support team. first they gaslighted us, saying it was normal for postage that usually costs $12 to now cost $140. then a few of my emails landed in their spam. finally they said they&#39;re &quot;looking into it.&quot; insert the Jennifer Lawrence meme.&lt;/p&gt;&lt;p&gt;when they stopped replying to our messages we decided to replace ShipHero with Claude. and holy crap, it worked.&lt;/p&gt;&lt;h3&gt;AI responsibility disclaimer thing&lt;/h3&gt;&lt;p&gt;everything you&#39;ll see below &lt;i&gt;&lt;em&gt;could&lt;/em&gt;&lt;/i&gt; have been done by our team, by hand. but what&#39;s the point? nobody was put on this earth to read FedEx documentation.&lt;/p&gt;&lt;h3&gt;if it ain&#39;t broke...&lt;/h3&gt;&lt;p&gt;ShipHero provided us 2 essential functions:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;adding holds + notes to orders&lt;/li&gt;&lt;li&gt;shipping packages&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;here&#39;s the ShipHero order feed.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTczMTczODM_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--f5a11793bbc1251a3ae7ff7f27439aec090477f7&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTczODMsInB1ciI6ImJsb2JfaWQifX0=--d53293d9fb7e0f70f346ac41381915924adb76b5/ShipHero-orders-index.jpeg&quot; filename=&quot;ShipHero-orders-index.jpeg&quot; filesize=&quot;99526&quot; width=&quot;1280&quot; height=&quot;632&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;ShipHero Orders - we canceled so it&#39;s empty&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpeg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTczODMsInB1ciI6ImJsb2JfaWQifX0=--d53293d9fb7e0f70f346ac41381915924adb76b5/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGVnIiwicmVzaXplX3RvX2xpbWl0IjpbMTAyNCw3NjhdfSwicHVyIjoidmFyaWF0aW9uIn19--b5fc5af83c336b0fe3eb199eed01a2c85b3a702d/ShipHero-orders-index.jpeg&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          ShipHero Orders - we canceled so it&#39;s empty
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;and here&#39;s the ShipHero shipping feed. when you click an order it helps you pack + buy postage.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTczMTczODY_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--d2befe6a1163a0f199e6bba1148660ef0ef0535f&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTczODYsInB1ciI6ImJsb2JfaWQifX0=--5804bdaa5f9fc995a4754c38e119d3ac0bf18692/ShipHero-shipping-index.png&quot; filename=&quot;ShipHero-shipping-index.png&quot; filesize=&quot;483969&quot; width=&quot;2356&quot; height=&quot;1404&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;ShipHero Shipping - click an order to pack&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTczODYsInB1ciI6ImJsb2JfaWQifX0=--5804bdaa5f9fc995a4754c38e119d3ac0bf18692/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/ShipHero-shipping-index.png&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          ShipHero Shipping - click an order to pack
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;each of these interfaces is fine. support engineers use the first one to tweak orders, and the warehouse team leverages those notes while packing.&lt;/p&gt;&lt;p&gt;now let&#39;s rebuild it all with $100 in tokens.&lt;/p&gt;&lt;h3&gt;high fidelity mockups&lt;/h3&gt;&lt;p&gt;we took screenshots of each portal and fed them to Claude Design the day it launched. here&#39;s the Order edit page, with fake data of course. sorry Pat Sterling.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTczMTczOTg_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--5999fb4347a9e1e0355437ec9c72f3294644633c&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTczOTgsInB1ciI6ImJsb2JfaWQifX0=--0a4ff2777f3fd25689f017bd9a5829ca28ecd4a4/trmnl-order-edit-page.jpeg&quot; filename=&quot;trmnl-order-edit-page.jpeg&quot; filesize=&quot;147823&quot; width=&quot;1280&quot; height=&quot;873&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Order management&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpeg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTczOTgsInB1ciI6ImJsb2JfaWQifX0=--0a4ff2777f3fd25689f017bd9a5829ca28ecd4a4/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGVnIiwicmVzaXplX3RvX2xpbWl0IjpbMTAyNCw3NjhdfSwicHVyIjoidmFyaWF0aW9uIn19--b5fc5af83c336b0fe3eb199eed01a2c85b3a702d/trmnl-order-edit-page.jpeg&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Order management
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;what&#39;s particularly impressive is how Claude figured out the &quot;&lt;i&gt;&lt;em&gt;click item on left, item moves to the right&lt;/em&gt;&lt;/i&gt;&quot; shipping portal UX. we did not offer before/after states.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTczMTczNjQ_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--20b3546a87ffba6945e74ea124b0a88205d8ef1b&quot; content-type=&quot;video/mp4&quot; url=&quot;/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTczNjQsInB1ciI6ImJsb2JfaWQifX0=--08e3b3853169fccfdfa9aabd754f3d99226c0589/eyJfcmFpbHMiOnsiZGF0YSI6eyJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--eb1e585edddca0ed00a56e344c9a8f5723873e51/ShipHero-packing-feature-claude-design.mp4&quot; filename=&quot;ShipHero-packing-feature-claude-design.mp4&quot; filesize=&quot;1264302&quot; width=&quot;1024&quot; height=&quot;488&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;ShipHero + Claude Design&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--video attachment--mp4&quot;&gt;
    &lt;video autoplay=&quot;autoplay&quot; muted=&quot;muted&quot; playsinline=&quot;playsinline&quot; loop=&quot;loop&quot; preload=&quot;metadata&quot; class=&quot;max-w-[100%] pointer-events-none&quot; src=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTczNjQsInB1ciI6ImJsb2JfaWQifX0=--08e3b3853169fccfdfa9aabd754f3d99226c0589/ShipHero-packing-feature-claude-design.mp4&quot;&gt;&lt;/video&gt;
      &lt;figcaption class=&quot;attachment__caption&quot;&gt;ShipHero + Claude Design&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;this may not win awards but it&#39;s perfect for our needs.&lt;/p&gt;&lt;p&gt;part of that need was inertia-friendliness. more than a dozen team members developed UI/UX muscle memory from shipping things the Old Way. for a successful same-day switchover you don&#39;t want anything to feel new.&lt;/p&gt;&lt;h3&gt;scope creep&lt;/h3&gt;&lt;p&gt;if a bunch of people depend on a tool and you replace it overnight, prepare for a barrage of feature requests. to mitigate only a couple of us had permission to file tickets or touch the code.&lt;/p&gt;&lt;p&gt;our ShipHero contract was set to renew on May 1 so D-Day was April 30. after some margaritas and gas station snacks we swerved into the critical path: deploying live API integrations with UPS and FedEx. DHL and USPS came a couple weeks later. until this point we worked in sandbox environments but now we required live postage rates to resume fulfillment the following day without downtime.&lt;/p&gt;&lt;p&gt;some courier JSON payloads are upwards of 1,000 LOC thanks to our &quot;hazardous materials&quot; status and the dozens of countries we ship to. this step was the most supercharged by LLMs. if we had to write these integrations by hand it might have made more sense to pay ShipZero for another year of shoddy service.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTczMTc1ODQ_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--0e648688613715e9ec58ea55335c83bf31179695&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTc1ODQsInB1ciI6ImJsb2JfaWQifX0=--363045562bb41193c3210da5b6bcda13375f8782/warehouse-web-tickets.jpeg&quot; filename=&quot;warehouse-web-tickets.jpeg&quot; filesize=&quot;153632&quot; width=&quot;1280&quot; height=&quot;962&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;GH Issues → Production&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpeg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTc1ODQsInB1ciI6ImJsb2JfaWQifX0=--363045562bb41193c3210da5b6bcda13375f8782/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGVnIiwicmVzaXplX3RvX2xpbWl0IjpbMTAyNCw3NjhdfSwicHVyIjoidmFyaWF0aW9uIn19--b5fc5af83c336b0fe3eb199eed01a2c85b3a702d/warehouse-web-tickets.jpeg&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          GH Issues → Production
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;filing async tickets for Liz made our rollout as calm as possible. we even had time for Whataburger and a walk around Callaway Gardens.&lt;/p&gt;&lt;h3&gt;build methodology&lt;/h3&gt;&lt;p&gt;to actually write the code we used Claude (CLI) and the Superpowers skill:&lt;br&gt;&lt;a href=&quot;https://github.com/obra/superpowers&quot;&gt;https://github.com/obra/superpowers&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Superpowers takes a Socratic approach with seemingly endless loops of clarifying questions to determine exactly what you want. where it really shines is architecture.&lt;/p&gt;&lt;p&gt;i personally enjoy architecture design and admittedly we had a head start: observing ShipHero&#39;s nouns and verbs for a year. one of the harrier aspects in my opinion was multi-warehouse support and determining which objects should support &lt;code&gt;null&lt;/code&gt; friendly foreign keys.&lt;/p&gt;&lt;p&gt;another great Superpowers feature is tests. lots and lots of tests. there is probably room for a new term like &lt;code&gt;Clanker&#39;s Harness&lt;/code&gt; which states that slop is 80% as safe as it is tested.&lt;/p&gt;&lt;p&gt;big shout out to &lt;a href=&quot;https://blog.fsck.com/&quot;&gt;Jesse Vincent&lt;/a&gt; for creating this systematic approach to turning huge projects into chewable nuggets.&lt;/p&gt;&lt;h3&gt;final product&lt;/h3&gt;&lt;p&gt;shipping physical products requires 4x6 postage labels. we built a network printer utility in Swift that spits out packing slips and shipping labels from any computer to any thermal printer at either of our warehouses in 1 click.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTczMTc0MDk_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--4f50da4cdea15abb8da9c559f9d69c3968f2901f&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTc0MDksInB1ciI6ImJsb2JfaWQifX0=--075d9d057ec74b7082bb0855e02d964c01a8e986/trmnl-logistics-shipping-station.jpeg&quot; filename=&quot;trmnl-logistics-shipping-station.jpeg&quot; filesize=&quot;75426&quot; width=&quot;1280&quot; height=&quot;690&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Setting up shipping stations&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpeg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTc0MDksInB1ciI6ImJsb2JfaWQifX0=--075d9d057ec74b7082bb0855e02d964c01a8e986/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGVnIiwicmVzaXplX3RvX2xpbWl0IjpbMTAyNCw3NjhdfSwicHVyIjoidmFyaWF0aW9uIn19--b5fc5af83c336b0fe3eb199eed01a2c85b3a702d/trmnl-logistics-shipping-station.jpeg&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Setting up shipping stations
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;next you&#39;ll want to filter orders for shipment based on priority, what&#39;s in stock, and whatever other logistics challenge you may be contending with that day.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTczMTc0MTc_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--bebd7ce3df7e6dd261476a5c575b8614c1a6ee5d&quot; content-type=&quot;video/mp4&quot; url=&quot;/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTc0MTcsInB1ciI6ImJsb2JfaWQifX0=--aa441d913893ad02f852b9f2a75f6f6064607977/eyJfcmFpbHMiOnsiZGF0YSI6eyJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--eb1e585edddca0ed00a56e344c9a8f5723873e51/trmnl-whweb-shipping-queue.mp4&quot; filename=&quot;trmnl-whweb-shipping-queue.mp4&quot; filesize=&quot;1552772&quot; width=&quot;1024&quot; height=&quot;576&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Filtering orders for shipment&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--video attachment--mp4&quot;&gt;
    &lt;video autoplay=&quot;autoplay&quot; muted=&quot;muted&quot; playsinline=&quot;playsinline&quot; loop=&quot;loop&quot; preload=&quot;metadata&quot; class=&quot;max-w-[100%] pointer-events-none&quot; src=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTc0MTcsInB1ciI6ImJsb2JfaWQifX0=--aa441d913893ad02f852b9f2a75f6f6064607977/trmnl-whweb-shipping-queue.mp4&quot;&gt;&lt;/video&gt;
      &lt;figcaption class=&quot;attachment__caption&quot;&gt;Filtering orders for shipment&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;once an order is selected, WebSockets lock it to that warehouse team member to prevent another person from creating a double shipment.&lt;/p&gt;&lt;p&gt;if the same person places multiple orders they&#39;re bubbled up in a Merge Orders interface where we can save on postage fees and reduce customer confusion.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTczMTc0MzM_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--e31238b84e735c02b210ffb6d33ef56d10e6c6f1&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTc0MzMsInB1ciI6ImJsb2JfaWQifX0=--c9be8855d098dc58c3cb9205d35dd12095eb3aba/trmnl-whweb-merge-orders.jpeg&quot; filename=&quot;trmnl-whweb-merge-orders.jpeg&quot; filesize=&quot;57345&quot; width=&quot;1280&quot; height=&quot;430&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Merging orders from the same customer&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpeg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTc0MzMsInB1ciI6ImJsb2JfaWQifX0=--c9be8855d098dc58c3cb9205d35dd12095eb3aba/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGVnIiwicmVzaXplX3RvX2xpbWl0IjpbMTAyNCw3NjhdfSwicHVyIjoidmFyaWF0aW9uIn19--b5fc5af83c336b0fe3eb199eed01a2c85b3a702d/trmnl-whweb-merge-orders.jpeg&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Merging orders from the same customer
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;when you&#39;re ready to ship, clicking SKUs on the left side loads up a package on the right side. for bulk orders we can instantiate multiple boxes and print unique labels + packing slips for each one.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTczMTc0NDc_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--9ff7dbb02a0547b703e96299b1c755b372b2691d&quot; content-type=&quot;video/mp4&quot; url=&quot;/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTc0NDcsInB1ciI6ImJsb2JfaWQifX0=--e15be772debd1a90f9d6bbf58399e27049b2ecf5/eyJfcmFpbHMiOnsiZGF0YSI6eyJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--eb1e585edddca0ed00a56e344c9a8f5723873e51/trmnl-whweb-packing-orders.mp4&quot; filename=&quot;trmnl-whweb-packing-orders.mp4&quot; filesize=&quot;2842039&quot; width=&quot;1024&quot; height=&quot;633&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Packing + buying postage&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--video attachment--mp4&quot;&gt;
    &lt;video autoplay=&quot;autoplay&quot; muted=&quot;muted&quot; playsinline=&quot;playsinline&quot; loop=&quot;loop&quot; preload=&quot;metadata&quot; class=&quot;max-w-[100%] pointer-events-none&quot; src=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTc0NDcsInB1ciI6ImJsb2JfaWQifX0=--e15be772debd1a90f9d6bbf58399e27049b2ecf5/trmnl-whweb-packing-orders.mp4&quot;&gt;&lt;/video&gt;
      &lt;figcaption class=&quot;attachment__caption&quot;&gt;Packing + buying postage&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;h3&gt;other wild features&lt;/h3&gt;&lt;p&gt;logistics is not as simple as &quot;get money, ship device.&quot;&lt;/p&gt;&lt;p&gt;pending the customer&#39;s location, line items, or special requests, we may need to adjust details on the fly regarding including where the order is shipped from, which courier/method is used, Incoterms, and many other details.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTczMTc1MDI_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--19fdb55c52d894cd201aa018e652486eea2bbc4b&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTc1MDIsInB1ciI6ImJsb2JfaWQifX0=--f3c1a2dac90fa23c2cafd33a113ca6db5962c61c/trmnl-whweb-automation-rules.jpeg&quot; filename=&quot;trmnl-whweb-automation-rules.jpeg&quot; filesize=&quot;124027&quot; width=&quot;1280&quot; height=&quot;729&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Automation Rules&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpeg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTc1MDIsInB1ciI6ImJsb2JfaWQifX0=--f3c1a2dac90fa23c2cafd33a113ca6db5962c61c/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGVnIiwicmVzaXplX3RvX2xpbWl0IjpbMTAyNCw3NjhdfSwicHVyIjoidmFyaWF0aW9uIn19--b5fc5af83c336b0fe3eb199eed01a2c85b3a702d/trmnl-whweb-automation-rules.jpeg&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Automation Rules
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;for this we built Automation Rules. it leverages the same infrastructure as our &lt;a href=&quot;https://help.trmnl.com/en/articles/14130649-serverless&quot;&gt;Serverless&lt;/a&gt; function, allowing us to finesse orders automatically following webhooks from our storefront.&lt;/p&gt;&lt;p&gt;here&#39;s one such rule which sets US-origin shipments to either UPS Ground or UPS SurePost pending the SKU and customer location.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTczMTc1Mzk_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--a9485d058c537517c645352af118e50a92bd3e7f&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTc1MzksInB1ciI6ImJsb2JfaWQifX0=--e7374dd887086ce16fc713c1fadb1527da743203/trmnl-automation-rule-example.jpeg&quot; filename=&quot;trmnl-automation-rule-example.jpeg&quot; filesize=&quot;137872&quot; width=&quot;1280&quot; height=&quot;848&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Automation Rule - UPS Method&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpeg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTczMTc1MzksInB1ciI6ImJsb2JfaWQifX0=--e7374dd887086ce16fc713c1fadb1527da743203/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGVnIiwicmVzaXplX3RvX2xpbWl0IjpbMTAyNCw3NjhdfSwicHVyIjoidmFyaWF0aW9uIn19--b5fc5af83c336b0fe3eb199eed01a2c85b3a702d/trmnl-automation-rule-example.jpeg&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Automation Rule - UPS Method
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;we can write these rules in Python, Ruby, or Node. Clicking &quot;actions&quot; on the right side injects the relevant return values for the parser. it&#39;s flexible and easy to simulate outcomes with a Test Rule and Execution Log below the code editor.&lt;/p&gt;&lt;p&gt;even more features not depicted:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;SKU and Box management with HS codes, Customs Invoice setters, and weight/dimensions&lt;/li&gt;&lt;li&gt;Carrier and Storefront CRUD with wholesale partner CSV import&lt;/li&gt;&lt;li&gt;User management with roles/permissions&lt;/li&gt;&lt;li&gt;Payroll automation&lt;/li&gt;&lt;li&gt;Firmware flashing and PCB provisioning, detailed further &lt;a href=&quot;https://trmnl.com/blog/logistics-tech&quot;&gt;here&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;by the numbers&lt;/h3&gt;&lt;p&gt;we (&lt;a href=&quot;https://trmnl.com/about&quot;&gt;Liz&lt;/a&gt;) spent 80-100 hours building this, then another week on-site to deploy and live debug with the USA warehouse team. our German warehouse was up and running the following Monday.&lt;/p&gt;&lt;p&gt;using ShipHero we sent 30,000+ packages for about $0.76 each. accounting for ongoing maintenance to this platform, that cost should decrease by 2-3x. it&#39;s also much, much better than ShipHero. pages load faster, labels &lt;i&gt;&lt;em&gt;print&lt;/em&gt;&lt;/i&gt; faster, filtering is more powerful, there are no contracts, and we own it.&lt;/p&gt;&lt;h3&gt;what this means&lt;/h3&gt;&lt;p&gt;from a customer perspective, TRMNL switching logistics platforms is a distinction without a difference. from ShipHero&#39;s perspective this should be a wakeup call.&lt;/p&gt;&lt;p&gt;enterprise software providers who don&#39;t take their responsibility seriously and rely on 10 page legal contracts to prevent churn deserve every bit of pain that a smart person with a subscription to an autocomplete CLI can incur.&lt;/p&gt;&lt;p&gt;if &lt;i&gt;&lt;em&gt;you&lt;/em&gt;&lt;/i&gt; have a need for hackable 3PL software, let us know and we might open source ours. it&#39;s kind of what we do.&lt;/p&gt;
&lt;/div&gt;
</content>
    <id>https://trmnl.com/blog/vibe-coding-shiphero</id>
    <link href="https://trmnl.com/blog/vibe-coding-shiphero"/>
    <published>2026-05-15T00:00:00+00:00</published>
    <rights>Copyright 2026</rights>
    <title>Vibe Coding a $20k /year Enterprise Logistics Platform</title>
    <updated>2026-05-15T00:00:00+00:00</updated>
    <dc:date>2026-05-15T00:00:00+00:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>community</name>
      <uri>https://trmnl.com</uri>
    </author>
    <category term="trmnl"
      label="TRMNL"/>
    <content type="html">&lt;div data-controller=&quot;blog-syntax-highlighter&quot; class=&quot;lexxy-content&quot;&gt;&lt;p&gt;for more context see the &lt;a href=&quot;https://trmnl.com/blog/creator-fund&quot;&gt;Creator Fund announcement&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;our 7th payout rewards community contributions between April 6, 2026 and May 6, 2026.&lt;/p&gt;&lt;h2&gt;source of funds&lt;/h2&gt;&lt;p&gt;each payout period, a portion of developer-specific revenue goes directly to creators.&lt;/p&gt;&lt;figure class=&quot;lexxy-content__table-wrapper&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th class=&quot;lexxy-content__table-cell--header&quot;&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;source&lt;/strong&gt;&lt;/b&gt;&lt;/p&gt;&lt;/th&gt;&lt;th class=&quot;lexxy-content__table-cell--header&quot;&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;revenue&lt;/strong&gt;&lt;/b&gt;&lt;/p&gt;&lt;/th&gt;&lt;th class=&quot;lexxy-content__table-cell--header&quot;&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;share&lt;/strong&gt;&lt;/b&gt;&lt;/p&gt;&lt;/th&gt;&lt;th class=&quot;lexxy-content__table-cell--header&quot;&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;amount&lt;/strong&gt;&lt;/b&gt;&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th class=&quot;lexxy-content__table-cell--header&quot;&gt;&lt;p&gt;Stripe&lt;/p&gt;&lt;p&gt;Developer Edition&lt;br&gt;TRMNL+&lt;/p&gt;&lt;p&gt;Shopify&lt;/p&gt;&lt;p&gt;Developer Edition&lt;br&gt;Clarity Kit (X)&lt;br&gt;Clarity Kit (OG)&lt;br&gt;BYOD&lt;/p&gt;&lt;/th&gt;&lt;td&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;$3,980&lt;br&gt;$538&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;$149.65&lt;br&gt;$12,139.38&lt;br&gt;$14,379.29&lt;br&gt;$18,095.15&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;15%&lt;br&gt;80%&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;15%&lt;br&gt;10%&lt;br&gt;10%&lt;br&gt;10%&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;$697&lt;br&gt;$430.40&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;$22.45&lt;br&gt;$1,213.94&lt;br&gt;$1,437.93&lt;br&gt;$1,809.52&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th class=&quot;lexxy-content__table-cell--header&quot;&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;/th&gt;&lt;td&gt;&lt;p&gt;$49,281.47&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;mark style=&quot;background-color:var(--highlight-bg-7);&quot;&gt;$5,511.23&lt;/mark&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2&gt;by the numbers&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;total payout: $5,511.23&lt;/li&gt;&lt;li&gt;plugin author share: $3,857.86 (70% of base total)&lt;/li&gt;&lt;li&gt;strategic contributors share: $1,653.37 (30% of base total)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;plugin author&lt;/strong&gt;&lt;/b&gt;&amp;nbsp;earnouts are calculated automatically by a collection of factors including a plugin&#39;s age (on live playlists), presence (by % dominance on playlists), and impressions (times displayed on device), relative to all other community plugins. there is a minimum threshold of 50 total connections (installs + forks) to qualify for monthly payouts. see the algorithm in action &lt;a href=&quot;https://www.youtube.com/watch?v=FJA_tOYcMbI&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;strategic contributors&lt;/strong&gt;&lt;/b&gt;&amp;nbsp;are those who contribute to&amp;nbsp;&lt;a href=&quot;https://github.com/usetrmnl&quot;&gt;TRMNL open source projects&lt;/a&gt;. these earnouts are calculated with a mix of automation + human touch. relative to the funding available, below are allocations by category:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Firmware, 6%&lt;/li&gt;&lt;li&gt;3D Models, 0%&lt;/li&gt;&lt;li&gt;BYOS, 52%&lt;/li&gt;&lt;li&gt;Localizations, 5%&lt;/li&gt;&lt;li&gt;BYOD, 34%&lt;/li&gt;&lt;li&gt;Documentation/Resources, 0%&lt;/li&gt;&lt;li&gt;Tooling, 3%&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;note that these allocations change monthly based on contributions by category.&lt;/p&gt;&lt;h2&gt;algorithm?&lt;/h2&gt;&lt;p&gt;over time the above weights, revenue share percentages, and minimum thresholds may change. reporting will become more transparent. our goal is an open sourced algorithm and self-service calculations with daily (or faster) resolution.&lt;/p&gt;&lt;p&gt;candid feedback is welcome, email&amp;nbsp;&lt;a href=&quot;mailto:team@trmnl.com&quot;&gt;team@trmnl.com&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
    <id>https://trmnl.com/blog/creator-fund-04-2026</id>
    <link href="https://trmnl.com/blog/creator-fund-04-2026"/>
    <published>2026-05-07T00:00:00+00:00</published>
    <rights>Copyright 2026</rights>
    <title>Creator Fund - April 2026</title>
    <updated>2026-05-07T00:00:00+00:00</updated>
    <dc:date>2026-05-07T00:00:00+00:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>Mario Lurig</name>
      <uri>https://trmnl.com</uri>
    </author>
    <category term="trmnl"
      label="TRMNL"/>
    <content type="html">&lt;div data-controller=&quot;blog-syntax-highlighter&quot; class=&quot;lexxy-content&quot;&gt;&lt;blockquote&gt;This post is part of a series, featuring the incredible work of plugin authors who grow the TRMNL plugin ecosystem with every contribution. The TRMNL team has individually selected these plugins and authors to be featured.&lt;/blockquote&gt;&lt;h2&gt;&lt;a href=&quot;https://trmnl.com/recipes/260558&quot;&gt;Supercars Drivers&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Community member Sam Sharp created the &lt;a href=&quot;https://trmnl.com/recipes/260558&quot;&gt;Supercars Drivers&lt;/a&gt; plugin; here are their words on how it was created.&lt;/p&gt;&lt;h3&gt;Why did you want this plugin to exist?&lt;/h3&gt;&lt;p&gt;I wanted this plugin to exist because Supercars is one of my favorite racing series and I liked the idea of having the standings visible in a clean, simple format while giving me one less excuse to check my phone. It also felt like a good addition to the marketplace because Australian sports had not yet been well represented. More broadly, it became part of a fun hobby of extending the project to cover the sports I enjoy that had not been built yet.&lt;/p&gt;&lt;h3&gt;How did you balance look vs functionality?&lt;/h3&gt;&lt;p&gt;Primarily wanted a clean and functional design so it&#39;s easily readable and makes use of all the screen real estate afforded by each device/layout. As I have begun to branch out and try new designs I&#39;ve started to increase my use of images and more appealing design elements from the framework.&lt;/p&gt;&lt;h4&gt;TRMNL OG&lt;/h4&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcxOTIwOTI_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--fab3b9d96f3315695023967ffe11d099fdfd57c5&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxOTIwOTIsInB1ciI6ImJsb2JfaWQifX0=--4a8fb8060abc9fd45988023edec5062607170f88/Supercars%20Drivers%20260558.png&quot; filename=&quot;Supercars Drivers 260558.png&quot; filesize=&quot;7803&quot; width=&quot;800&quot; height=&quot;480&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxOTIwOTIsInB1ciI6ImJsb2JfaWQifX0=--4a8fb8060abc9fd45988023edec5062607170f88/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/Supercars%20Drivers%20260558.png&quot;&gt;

  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;h4&gt;TRMNL X&lt;/h4&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcxOTIxMDQ_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--a4ee5fcc8768358513f1686b4d269c3b0649c3a3&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxOTIxMDQsInB1ciI6ImJsb2JfaWQifX0=--2a6b1e678d0bafa3d81d26eb6a7d485b0d8ca7bb/Supercars%20Drivers%20X%20260558.png&quot; filename=&quot;Supercars Drivers X 260558.png&quot; filesize=&quot;141703&quot; width=&quot;1039&quot; height=&quot;778&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxOTIxMDQsInB1ciI6ImJsb2JfaWQifX0=--2a6b1e678d0bafa3d81d26eb6a7d485b0d8ca7bb/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/Supercars%20Drivers%20X%20260558.png&quot;&gt;

  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;h3&gt;Were you inspired by any other recipes or plugin creators?&lt;/h3&gt;&lt;p&gt;Main inspirations on content and design were Daniel Sitnik&#39;s &lt;a href=&quot;https://trmnl.com/recipes/11914&quot;&gt;Formula 1 Races&lt;/a&gt; and &lt;a href=&quot;https://trmnl.com/recipes/30563&quot;&gt;Formula 1 Constructor Standings&lt;/a&gt; plugins.&lt;/p&gt;&lt;h3&gt;What was your process for creating the plugin?&lt;/h3&gt;&lt;p&gt;Was initially writing everything manually and updating static JSON as a PoC and test rendering on a real device. Recently getting a Github Copilot subscription and OpenCode has really sped up the building and testing. Incorporating the preview and API tools in the &lt;a href=&quot;https://github.com/usetrmnl/trmnlp&quot;&gt;trmnlp&lt;/a&gt; repo has been especially helpful with iterating locally before easily updating all layouts through the API (once instating a beta plugin strategy to prevent over eager agents pushing changes to published recipes).&lt;/p&gt;&lt;h3&gt;What, if any, challenges did you face while creating it?&lt;/h3&gt;&lt;p&gt;The plugin categories were a bit buried in the docs so took me a while to find which values were allowed. Making changes to layout when they are relevant to multiple layouts/plugins got tedious when performing manually. Only gap I&#39;ve found is the inability to adjust the custom fields easily through the preview GUI. I&#39;ve written a wrapper to handle this when launching the preview but would be more convenient through the GUI. Would also be useful to access the Chef linter prior to requesting publishing.&lt;/p&gt;&lt;h3&gt;Did you learn anything you want to apply to future recipes?&lt;/h3&gt;&lt;p&gt;More rounded backgrounds / info tiles, icons and horizontal/rounded gauges. Also trying to think about more custom fields that may be useful and applying them to more devices and layouts as mine primarily focus on the v3 Full layout.&lt;/p&gt;&lt;h3&gt;Is there a tip you would give to a new plugin developer?&lt;/h3&gt;&lt;p&gt;Keep as close to the UI &lt;a href=&quot;https://trmnl.com/framework/docs/v3&quot;&gt;Framework&lt;/a&gt; as possible as some styling may appear to work in the preview but not once rendered on device. Try to think about how best to use all real estate afforded on each device and what custom fields might be useful/fun to incorporate early as refactoring later on can get tedious.&lt;/p&gt;&lt;h3&gt;What is your favorite plugin that someone else created and why?&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://trmnl.com/integrations/strmnl&quot;&gt;STRMNL Activity&lt;/a&gt; - Has been really satisfying seeing my activities stack as the week progresses and being laid out in a really nice format.&lt;/p&gt;
&lt;/div&gt;
</content>
    <id>https://trmnl.com/blog/featured-plugin-supercars-drivers</id>
    <link href="https://trmnl.com/blog/featured-plugin-supercars-drivers"/>
    <published>2026-05-06T00:00:00+00:00</published>
    <rights>Copyright 2026</rights>
    <title>Featured Community Plugin - Supercars Drivers</title>
    <updated>2026-05-06T00:00:00+00:00</updated>
    <dc:date>2026-05-06T00:00:00+00:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>Ryan Kulp</name>
      <uri>https://trmnl.com</uri>
    </author>
    <category term="trmnl"
      label="TRMNL"/>
    <content type="html">&lt;div data-controller=&quot;blog-syntax-highlighter&quot; class=&quot;lexxy-content&quot;&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;March 29, 2024&lt;/strong&gt;&lt;/b&gt;. pre-production samples arrived and we tested our first plugin. it looked like crap.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcxMzQ1MzY_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--9707859005498c18858b6aceca905f2f8085e048&quot; content-type=&quot;image/jpeg&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ1MzYsInB1ciI6ImJsb2JfaWQifX0=--408a7e451d8e14528029f79c807fb6ad37c9b496/trmnl-prototype-march-2024.jpeg&quot; filename=&quot;trmnl-prototype-march-2024.jpeg&quot; filesize=&quot;76511&quot; width=&quot;640&quot; height=&quot;480&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;TRMNL OG, March 2024&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--jpeg&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ1MzYsInB1ciI6ImJsb2JfaWQifX0=--408a7e451d8e14528029f79c807fb6ad37c9b496/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGVnIiwicmVzaXplX3RvX2xpbWl0IjpbMTAyNCw3NjhdfSwicHVyIjoidmFyaWF0aW9uIn19--b5fc5af83c336b0fe3eb199eed01a2c85b3a702d/trmnl-prototype-march-2024.jpeg&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          TRMNL OG, March 2024
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;minutes later, &lt;a href=&quot;https://www.youtube.com/watch?v=hqi0114mwtY&quot;&gt;anti-aliasing&lt;/a&gt; became a topic of daily conversation. with my colleagues and with my wife. our little consumer grade panel couldn&#39;t handle font smoothing, we needed a bitmap option.&lt;/p&gt;&lt;h2&gt;MVP&lt;/h2&gt;&lt;p&gt;enter &lt;a href=&quot;https://emhuo.itch.io/nico-pixel-fonts-pack&quot;&gt;Nico&lt;/a&gt; and &lt;a href=&quot;https://www.fontriver.com/font/blockkie/&quot;&gt;BlockKie&lt;/a&gt;. a huge thanks to creators &lt;a href=&quot;https://emhuo.itch.io/&quot;&gt;Emily Huo&lt;/a&gt; and &lt;a href=&quot;https://www.fontriver.com/foundry/joohn_fonts/&quot;&gt;Joohn&lt;/a&gt; for their excellent work and gracious OSS licensing.&lt;/p&gt;&lt;p&gt;soon after we added &lt;a href=&quot;https://fonts.google.com/specimen/Inter&quot;&gt;Inter&lt;/a&gt; to the lineup, which is great for brief + large values like numbers and dates.&lt;/p&gt;&lt;p&gt;before Inter:&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcxMzQ1ODE_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--3448144136133216db8e785645376ded4d07e1cc&quot; content-type=&quot;image/bmp&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ1ODEsInB1ciI6ImJsb2JfaWQifX0=--fe817d8fadb4f37b9408fd117cf110acdfde47c1/trmnl-days-left-bitmap-example.bmp&quot; filename=&quot;trmnl-days-left-bitmap-example.bmp&quot; filesize=&quot;48062&quot; width=&quot;800&quot; height=&quot;480&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--bmp&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ1ODEsInB1ciI6ImJsb2JfaWQifX0=--fe817d8fadb4f37b9408fd117cf110acdfde47c1/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/trmnl-days-left-bitmap-example.bmp&quot;&gt;

  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;after Inter:&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcxMzQ1OTA_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--f126a6d607d5853f987a146ce4d466d43010920e&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ1OTAsInB1ciI6ImJsb2JfaWQifX0=--36a3f4ebbc7edcf4256fa204dce00576485449d3/trmnl-days-left-inter-example.png&quot; filename=&quot;trmnl-days-left-inter-example.png&quot; filesize=&quot;3086&quot; width=&quot;800&quot; height=&quot;480&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ1OTAsInB1ciI6ImJsb2JfaWQifX0=--36a3f4ebbc7edcf4256fa204dce00576485449d3/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/trmnl-days-left-inter-example.png&quot;&gt;

  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;with fonts mostly figured out we shifted design effort to &lt;a href=&quot;https://trmnl.com/blog/design-system&quot;&gt;Framework&lt;/a&gt;, our UI library for ePaper displays generally.&lt;/p&gt;&lt;h2&gt;whole product&lt;/h2&gt;&lt;p&gt;making Framework a viable resource took a couple years and is the brainchild of &lt;a href=&quot;https://trmnl.com/about&quot;&gt;Lucian&lt;/a&gt;. as fewer developers reached for &lt;code&gt;&amp;lt;import tailwind&amp;gt;&lt;/code&gt; in their markup, we knew we were on the right track.&lt;/p&gt;&lt;p&gt;just last month we shipped &lt;a href=&quot;https://trmnl.com/framework/docs/3.0&quot;&gt;v3.0&lt;/a&gt; with color support, dark mode, and so much more.&lt;/p&gt;&lt;p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcxMzQ2NjY_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--a03f7042cd43c3613e0541cc66444e22aab17844&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ2NjYsInB1ciI6ImJsb2JfaWQifX0=--840d619f60a5b8248442a0d5fe6709080c3335cf/trmnl-framework-colors.png&quot; filename=&quot;trmnl-framework-colors.png&quot; filesize=&quot;41260&quot; width=&quot;740&quot; height=&quot;421&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Spectra 6 and BWRY palettes&quot;&gt;  &lt;/action-text-attachment&gt;&lt;/p&gt;&lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ2NjYsInB1ciI6ImJsb2JfaWQifX0=--840d619f60a5b8248442a0d5fe6709080c3335cf/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/trmnl-framework-colors.png&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Spectra 6 and BWRY palettes
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcxMzQ2NzA_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--f2da22119b951caf891ebb15de9423154942dcf6&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ2NzAsInB1ciI6ImJsb2JfaWQifX0=--27cdfc7a7377da82c200e49cb22487310e178310/trmnl-framework-dark-mode.png&quot; filename=&quot;trmnl-framework-dark-mode.png&quot; filesize=&quot;27798&quot; width=&quot;933&quot; height=&quot;551&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Progress bars, grayscale, dark mode&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ2NzAsInB1ciI6ImJsb2JfaWQifX0=--27cdfc7a7377da82c200e49cb22487310e178310/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/trmnl-framework-dark-mode.png&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Progress bars, grayscale, dark mode
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Framework is part CSS, part JavaScript.&lt;/p&gt;&lt;p&gt;the CSS does what you&#39;d expect: make things pretty. whereas JS &lt;a href=&quot;https://trmnl.com/framework/docs/3.1/overflow&quot;&gt;modulations&lt;/a&gt; do fancy stuff: truncate text, abbreviate large numbers, even &lt;a href=&quot;https://trmnl.com/framework/docs/3.1/pixel_perfect&quot;&gt;bump pixels&lt;/a&gt; to the very edge of a frame.&lt;/p&gt;&lt;h2&gt;final form&lt;/h2&gt;&lt;p&gt;today we&#39;re proud to announce Framework v3.1, which ships with &lt;a href=&quot;https://trmnl.com/framework/docs/3.1/font_family&quot;&gt;2x font bundles&lt;/a&gt;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;strong&gt;Classic&lt;/strong&gt;&lt;/b&gt; includes Nico, BlockKie, and Inter&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;strong&gt;TRMNL&lt;/strong&gt;&lt;/b&gt; includes three hand-made families in Regular and Bold weights&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;our starting sizes are 12, 16, and 21pt, optimized for the TRMNL OG 7.5&quot; display.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcxOTA1MTU_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--64546613608695f502cb80b97fcfbb799f6b8458&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxOTA1MTUsInB1ciI6ImJsb2JfaWQifX0=--ea60f8067f3d935b64732020c73bec2adc529c7d/cuts-in-tandem.png&quot; filename=&quot;cuts-in-tandem.png&quot; filesize=&quot;35378&quot; width=&quot;3080&quot; height=&quot;1732&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;TRMNL font cuts in tandem&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxOTA1MTUsInB1ciI6ImJsb2JfaWQifX0=--ea60f8067f3d935b64732020c73bec2adc529c7d/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/cuts-in-tandem.png&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          TRMNL font cuts in tandem
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;each weight contains 694 glyphs spanning Latin, Western/Eastern European, symbols, operators, even dingbats. &lt;a href=&quot;https://trmnl.com/font-family&quot;&gt;see them in action&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcxMzQ3NTc_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--ecc6ad13e17d6512145f1679d7dbbe8bd699b494&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ3NTcsInB1ciI6ImJsb2JfaWQifX0=--78db767ddacef6e2c8b37a28bd59941f084c83db/trmnl-font-before-after.png&quot; filename=&quot;trmnl-font-before-after.png&quot; filesize=&quot;5845&quot; width=&quot;820&quot; height=&quot;240&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Classic → TRMNL&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ3NTcsInB1ciI6ImJsb2JfaWQifX0=--78db767ddacef6e2c8b37a28bd59941f084c83db/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/trmnl-font-before-after.png&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Classic → TRMNL
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;TRMNL font is crunchy but smooth, tight but legible, bitmap-safe but ready to party. it&#39;s also going to be open source. friends don&#39;t let friends struggle with ePaper readability.&lt;/p&gt;&lt;h2&gt;get started&lt;/h2&gt;&lt;p&gt;if you build Private Plugins, upgrade to Framework v3.1 from the settings screen.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcxMzQ4MTA_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--d5f23a018cf4d361265ea1cba93d9362cd570481&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ4MTAsInB1ciI6ImJsb2JfaWQifX0=--3d1dc342467bce46f8dfb8eba3423392b1222769/trmnl-private-plugin-framework-version-picker.png&quot; filename=&quot;trmnl-private-plugin-framework-version-picker.png&quot; filesize=&quot;20543&quot; width=&quot;557&quot; height=&quot;187&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Pin a version or set to &amp;quot;track latest&amp;quot;&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ4MTAsInB1ciI6ImJsb2JfaWQifX0=--3d1dc342467bce46f8dfb8eba3423392b1222769/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/trmnl-private-plugin-framework-version-picker.png&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Pin a version or set to &quot;track latest&quot;
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;to try the TRMNL font on specific plugins, navigate to your Playlist and hover the (•••) icon &amp;gt; Presentation &amp;gt; Font Family &amp;gt; TRMNL.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcxMzQ4MDE_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--53168c7a076f6a96c57f29c8424aa02941ad04f5&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ4MDEsInB1ciI6ImJsb2JfaWQifX0=--f26c0f78819329ccffd883b90dcdeedafff5fc21/trmnl-playlist-item-presentation-font-family.png&quot; filename=&quot;trmnl-playlist-item-presentation-font-family.png&quot; filesize=&quot;48703&quot; width=&quot;780&quot; height=&quot;508&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Switch fonts on a per-plugin basis&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzQ4MDEsInB1ciI6ImJsb2JfaWQifX0=--f26c0f78819329ccffd883b90dcdeedafff5fc21/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/trmnl-playlist-item-presentation-font-family.png&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Switch fonts on a per-plugin basis
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;to upgrade all your plugins to the TRMNL font, visit your &lt;a href=&quot;https://trmnl.com/devices/current/palette/edit&quot;&gt;Device settings &amp;gt; Palette configuration&lt;/a&gt;:&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcxMzY1OTY_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--9c22b59f1e3efa6fb4bf2a8ae77dce3b28def43f&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzY1OTYsInB1ciI6ImJsb2JfaWQifX0=--59321fbddaef53be9e4f6a54ecf3fa566d445ba2/trmnl-device-font-family-settings.png&quot; filename=&quot;trmnl-device-font-family-settings.png&quot; filesize=&quot;21363&quot; width=&quot;620&quot; height=&quot;248&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxMzY1OTYsInB1ciI6ImJsb2JfaWQifX0=--59321fbddaef53be9e4f6a54ecf3fa566d445ba2/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/trmnl-device-font-family-settings.png&quot;&gt;

  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;&lt;b&gt;&lt;strong&gt;note&lt;/strong&gt;&lt;/b&gt; that if a given plugin (native or otherwise) is pinned to an earlier Framework release (&amp;lt; 3.1), your font family preference will fall back to the Classic bundle until that plugin is updated.&lt;/p&gt;&lt;p&gt;for more information, read the docs:&lt;br&gt;&lt;a href=&quot;https://trmnl.com/framework/docs/3.1/font_family&quot;&gt;https://trmnl.com/framework/docs/3.1/font_family&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;what&#39;s next&lt;/h2&gt;&lt;p&gt;our first release has a few icons and some non-Latin characters. but we&#39;re thinking a native icon pack (&lt;code&gt;trmnl-icon-star&lt;/code&gt;) might be useful too. or even Korean, and maybe a bitmap take on emojis.&lt;/p&gt;&lt;p&gt;we look forward to your feedback and can&#39;t wait to see what you build.&lt;/p&gt;
&lt;/div&gt;
</content>
    <id>https://trmnl.com/blog/introducing-typography</id>
    <link href="https://trmnl.com/blog/introducing-typography"/>
    <published>2026-04-30T00:00:00+00:00</published>
    <rights>Copyright 2026</rights>
    <title>Introducing Typography</title>
    <updated>2026-04-30T00:00:00+00:00</updated>
    <dc:date>2026-04-30T00:00:00+00:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>Mario Lurig</name>
      <uri>https://trmnl.com</uri>
    </author>
    <category term="trmnl"
      label="TRMNL"/>
    <content type="html">&lt;div data-controller=&quot;blog-syntax-highlighter&quot; class=&quot;lexxy-content&quot;&gt;&lt;blockquote&gt;&lt;p&gt;I made something great, and now I want to share it with others!&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This sentiment has been thought by 100s of plugin authors, willing to transform their work from private benefit to public good. To do that, authors go through our &lt;i&gt;&lt;em&gt;recipe review &lt;/em&gt;&lt;/i&gt;process. This comes in two steps:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Automated feedback from CHEF, a tool to catch common mistakes or oversights before submission.&lt;/li&gt;&lt;li&gt;Manual feedback from a human, where we look over everything to make sure it meets our quality bar, then provide you with specific feedback and guidance about changes, if needed, that are required before publishing.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;While it is ever evolving, here is the steps we go through to make sure your recipe is ready to go, broken down into sections of the plugin. Some quick terminology:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;strong&gt;user&lt;/strong&gt;&lt;/b&gt;: Someone who installs or forks a plugin recipe.&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;strong&gt;author&lt;/strong&gt;&lt;/b&gt;: Creator and maintainer of a plugin recipe.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Plugin Ecosystem&lt;/h2&gt;&lt;p&gt;Recipes are evaluated on how they contribute to the plugin ecosystem overall. This includes a few core ideals:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;strong&gt;Collaboration over competition&lt;/strong&gt;&lt;/b&gt;. A new recipe should not be seen by a user as indistinguishable from an existing recipe. If there is a similar plugin, it should add easily identifiable value.&lt;br&gt;Efforts to improve existing plugins should be the first priority, but we understand that if the original author is non-responsive or your suggestions are outside of the goals they have for their recipe, that a new recipe can be appropriate.&lt;br&gt;Similar topics, but different data sources, are great examples of where &lt;i&gt;&lt;em&gt;competition&lt;/em&gt;&lt;/i&gt; is valuable and completely acceptable.&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;strong&gt;Depth, not numbers&lt;/strong&gt;&lt;/b&gt;. Variations on an idea should be encompassed within a single recipe. Whenever possible, a recipe that serves multiple themes, layouts, or even highlights different data &lt;i&gt;&lt;em&gt;from the same data source&lt;/em&gt;&lt;/i&gt; by using form fields is more valuable than multiple recipes creating &lt;i&gt;&lt;em&gt;noise&lt;/em&gt;&lt;/i&gt; in the search results. We consider &lt;i&gt;&lt;em&gt;omnibus&lt;/em&gt;&lt;/i&gt; plugins like &lt;a href=&quot;https://trmnl.com/recipes/180935&quot;&gt;Comic Library&lt;/a&gt; strong additions to the ecosystem.&lt;br&gt;TL;DR We want higher quality, not just more.&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;strong&gt;Family friendly&lt;/strong&gt;&lt;/b&gt;. The default option is always family friendly and non-offensive. If content (language, images) that wouldn&#39;t be appropriate for a 13-year-old could appear, it should be &lt;b&gt;&lt;strong&gt;default&lt;/strong&gt;&lt;/b&gt; filtered &lt;i&gt;&lt;em&gt;off&lt;/em&gt;&lt;/i&gt;. If a recipe cannot be, you can publish it as &lt;b&gt;&lt;strong&gt;unlisted&lt;/strong&gt;&lt;/b&gt;, which makes it available to others, but will not show up in any search results.&lt;br&gt;Additionally, we have special categories (set in Form Fields), for things that are on the edge. For instance, the &lt;code&gt;morbid&lt;/code&gt; category is searchable as a #category, but recipes are excluded from search results using normal terms.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Form Fields&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Make sure the &lt;code&gt;author_bio&lt;/code&gt; offers at least one way that a user could get in-touch with the author and that appropriate &lt;a href=&quot;https://trmnl.com/api/categories&quot;&gt;categories&lt;/a&gt; are chosen.&lt;/li&gt;&lt;li&gt;Check that &lt;code&gt;default&lt;/code&gt; and &lt;code&gt;placeholder&lt;/code&gt; is being used appropriately and there are no erroneous fields like &lt;code&gt;optional: false&lt;/code&gt; (you only need to include it if it is true).&lt;/li&gt;&lt;li&gt;Update any plain-text links to use HTML &lt;code&gt;href&lt;/code&gt; links and include &lt;code&gt;&amp;lt;br/&amp;gt;&lt;/code&gt; when it was clear the author intended a line break.&lt;/li&gt;&lt;li&gt;Test each of the form fields to make sure the functionality offered is &lt;i&gt;&lt;em&gt;actually&lt;/em&gt;&lt;/i&gt; working. This involves making adjustments, saving, and looking within &lt;i&gt;&lt;em&gt;edit markup&lt;/em&gt;&lt;/i&gt; to see the changes.&lt;br&gt;This also includes making use of &lt;code&gt;&quot;key&quot;:&quot;value&quot;&lt;/code&gt; pairs for &lt;a href=&quot;https://help.trmnl.com/en/articles/10513740-custom-plugin-form-builder#h_b1004334c8&quot;&gt;options&lt;/a&gt; if it improves readability to the user and usability for the author. Also check that &lt;i&gt;&lt;em&gt;truthy&lt;/em&gt;&lt;/i&gt; values like &lt;i&gt;&lt;em&gt;yes, true, 1&lt;/em&gt;&lt;/i&gt; are evaluated properly in Liquid logic.&lt;/li&gt;&lt;li&gt;Validate no personal information will leak and that, if necessary, &lt;a href=&quot;https://help.trmnl.com/en/articles/12772238-demo-data-for-publishing-plugins&quot;&gt;demo data&lt;/a&gt; is used.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Plugin Strategy&lt;/h2&gt;&lt;h3&gt;Polling&lt;/h3&gt;&lt;p&gt;We use the &lt;i&gt;&lt;em&gt;parse&lt;/em&gt;&lt;/i&gt; feature to make sure the URL is processing logically and to understand if the endpoint is privately hosted or a public API. If public, but requiring authorization, that appropriate links and instructions are included in the Form Fields. Usually this isn&#39;t a source for problems, but more of an opportunity for improvement because Liquid logic is supported in this field.&lt;/p&gt;&lt;p&gt;We also will look to see if it is forcing &quot;fresh data&quot; by calling a URL that returns randomized data every time. If it&#39;s external, we recommend switching it to ours: &lt;code&gt;https://trmnl.com/custom_plugin_example_data.json&lt;/code&gt;.&lt;/p&gt;&lt;h3&gt;Webhook&lt;/h3&gt;&lt;p&gt;A webhook requires extra steps by the user that need to be outlined or linked to in the &lt;code&gt;author_bio&lt;/code&gt; section of the Form Fields. Most commonly this is to a Github project page which has a detailed ReadMe (which we&#39;ll review for clarity and may even try).&lt;/p&gt;&lt;h3&gt;Static&lt;/h3&gt;&lt;p&gt;&lt;i&gt;&lt;em&gt;Rarely requires review unless other issues require us taking a look.&lt;/em&gt;&lt;/i&gt;&lt;/p&gt;&lt;h3&gt;Plugin Merge&lt;/h3&gt;&lt;p&gt;Make use of the &lt;code&gt;plugin_instance_select&lt;/code&gt; &lt;a href=&quot;https://help.trmnl.com/en/articles/10513740-custom-plugin-form-builder?q=private+plug#h_27304a1639&quot;&gt;form field&lt;/a&gt; to help the user select the proper plugin easily and that instructions are included in &lt;code&gt;author_bio&lt;/code&gt;&#39;s description.&lt;/p&gt;&lt;h2&gt;Markup&lt;/h2&gt;&lt;p&gt;For maximum compatibility, we require recipes authors to prioritize using our design &lt;a href=&quot;https://trmnl.com/framework/docs/v3&quot;&gt;Framework&lt;/a&gt; and &lt;a href=&quot;https://help.trmnl.com/en/articles/10671186-liquid-101&quot;&gt;Liquid&lt;/a&gt; markup for logic first, only followed by CSS and Javascript when these reach their limit. Javascript-driven recipes can be unique and amazing when a recipe goes beyond text and images, so we don&#39;t want discourage that creativity.&lt;/p&gt;&lt;h3&gt;Red Flags&lt;/h3&gt;&lt;p&gt;These are items that will cause problems.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;async&lt;/code&gt; API calls. Renderer will not wait more than 5 seconds; consider using &lt;a href=&quot;https://help.trmnl.com/en/articles/14130649-serverless&quot;&gt;Serverless&lt;/a&gt; or your own hosted middleware. 99% of the time, any API calls should be in your POLLING URLs section (you can have multiple URLs, one on each line).&lt;/li&gt;&lt;li&gt;Charting without using a &lt;a href=&quot;https://help.trmnl.com/en/articles/10347358-custom-plugin-filters#h_df3a9ceb58&quot;&gt;unique class identifier&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Javascript that is waiting for page load rather than the event listener &lt;a href=&quot;https://help.trmnl.com/en/articles/10693981-advanced-liquid#h_b7065921f8&quot;&gt;DOMContentLoaded&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Using the inline CSS property &lt;code&gt;opacity&lt;/code&gt;, which gives a false sense of &quot;working&quot; in preview, but will not work well when rendered in 1-bit (black and white). Instead, use Framework classes like &lt;code&gt;text--black 2bit:text--gray-30 4bit:text--gray-20&lt;/code&gt; to target &lt;a href=&quot;https://help.trmnl.com/en/articles/12386214-grayscale-1-bit-2-bit-4-bit-in-framework&quot;&gt;grayscale&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Custom fonts. For certain aesthetics, fine, but 9 out of 10 times you should stick to the fonts we provide and use for different Framework elements automatically. This ensures great legibility at different sizes.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Layouts&lt;/h3&gt;&lt;p&gt;We preview every &lt;i&gt;&lt;em&gt;view&lt;/em&gt;&lt;/i&gt; (e.g. Full, Quadrant) across both TRMNL OG and TRMNL X in &lt;i&gt;&lt;em&gt;landscape&lt;/em&gt;&lt;/i&gt; mode, as well as TRMNL X in &lt;i&gt;&lt;em&gt;portrait&lt;/em&gt;&lt;/i&gt; mode, to verify the screen is &lt;b&gt;&lt;strong&gt;mostly content, not whitespace&lt;/strong&gt;&lt;/b&gt;. We also check if any data is getting cutoff horizontally or pushed off vertically unintentionally.&lt;/p&gt;&lt;p&gt;Most recipes that fail at larger sizes haven&#39;t taken into account our responsive classes (e.g. &lt;code&gt;lg:&lt;/code&gt;or &lt;code&gt;portrait:&lt;/code&gt;) as outlined in our &lt;a href=&quot;https://trmnl.com/framework/docs/v3/trmnl_x_guide&quot;&gt;TRMNL X Framework Guide&lt;/a&gt; or are not using Framework. Here are some of our favorite Framework tricks for great layouts.&lt;/p&gt;&lt;h4&gt;Content Overflow&lt;/h4&gt;&lt;p&gt;Make use of automatic length limiting with:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Variable level &lt;a href=&quot;https://shopify.github.io/liquid/filters/truncate/&quot;&gt;Liquid truncate&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Line level &lt;a href=&quot;https://trmnl.com/framework/docs/v3/clamp&quot;&gt;data clamping&lt;/a&gt;&lt;/li&gt;&lt;li&gt;View level &lt;a href=&quot;https://trmnl.com/framework/docs/v3/overflow&quot;&gt;overflow&lt;/a&gt;, including &lt;a href=&quot;https://trmnl.com/framework/docs/v3/table_overflow&quot;&gt;table overflow&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Charts&lt;/h4&gt;&lt;p&gt;Rather than using a fixed &lt;code&gt;height&lt;/code&gt; for your &lt;a href=&quot;https://trmnl.com/framework/docs/v3/chart&quot;&gt;chart&lt;/a&gt;, setting height to &lt;code&gt;null&lt;/code&gt; will let it fill its container, so you can control it using your other markup.&lt;/p&gt;&lt;h4&gt;Using Liquid Templates&lt;/h4&gt;&lt;p&gt;&lt;a href=&quot;https://docs.trmnl.com/go/reusing-markup&quot;&gt;Liquid templates&lt;/a&gt; offer a great way to re-use content. However, any data used in the template needs to be passed &lt;i&gt;&lt;em&gt;into&lt;/em&gt;&lt;/i&gt; the template. This means that the &lt;code&gt;trmnl&lt;/code&gt; native variables need to be passed in as well if you are using them in your template. For example: &lt;code&gt;{% render &quot;my_template&quot;, trmnl: {{ trmnl }} %}&lt;/code&gt;.&lt;/p&gt;&lt;h4&gt;Flexibly Rearranging Content&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;Adjust the &lt;code&gt;layout&lt;/code&gt; or &lt;code&gt;flex&lt;/code&gt; direction in portrait mode. For instance, &lt;code&gt;flex flex--row portrait:flex--col&lt;/code&gt; can quickly reflow your content. You can even stack responsive classes &lt;code&gt;lg:portrait&lt;/code&gt; as noted in our &lt;a href=&quot;https://trmnl.com/framework/docs/v3/responsive#available-combinations&quot;&gt;docs&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Using &lt;code&gt;grid&lt;/code&gt; and the &lt;code&gt;grid--cols-#&lt;/code&gt; feature to reflow content. Here is an example:&lt;/li&gt;&lt;/ul&gt;&lt;pre data-language=&quot;html&quot;&gt;&amp;lt;div class=&quot;layout&quot;&amp;gt;&lt;br&gt;  &amp;lt;div class=&quot;grid grid--cols-3&quot;&amp;gt;&lt;br&gt;    &amp;lt;span class=&quot;value value--small lg:value--base&quot;&amp;gt;Column One&amp;lt;/span&amp;gt;&lt;br&gt;    &amp;lt;span class=&quot;value value--small lg:value--base&quot;&amp;gt;Column One&amp;lt;/span&amp;gt;&lt;br&gt;    &amp;lt;span class=&quot;value value--small lg:value--base&quot;&amp;gt;Column One&amp;lt;/span&amp;gt;&lt;br&gt;  &amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;p&gt;Landscape mode looks fine.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcwNjEwNDc_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--0f7017522623058c5e50f1dbdd4a44cb39ad6da5&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcwNjEwNDcsInB1ciI6ImJsb2JfaWQifX0=--b161ff533f05cf4bf2bb055645504a2e87dc4152/image.png&quot; filename=&quot;image.png&quot; filesize=&quot;7467&quot; width=&quot;399&quot; height=&quot;234&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcwNjEwNDcsInB1ciI6ImJsb2JfaWQifX0=--b161ff533f05cf4bf2bb055645504a2e87dc4152/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/image.png&quot;&gt;

  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;Switch to portrait and we have collisions.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcwNjEwNDU_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--bed1b0d3cdf51a0ff993ffe8ef6420967bb7c5a2&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcwNjEwNDUsInB1ciI6ImJsb2JfaWQifX0=--323985e5cfe371f89d3ac80fdccd1064a28104cc/image.png&quot; filename=&quot;image.png&quot; filesize=&quot;8163&quot; width=&quot;233&quot; height=&quot;395&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcwNjEwNDUsInB1ciI6ImJsb2JfaWQifX0=--323985e5cfe371f89d3ac80fdccd1064a28104cc/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/image.png&quot;&gt;

  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;A quick fix could be to shrink the text in portrait mode using &lt;code&gt;portrait:value--xxsmall&lt;/code&gt;, but that increases the whitespace dramatically.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcwNjEwNDY_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--396acfb51cab4f7b1bd5f93ccd6146bc8ce81fc3&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcwNjEwNDYsInB1ciI6ImJsb2JfaWQifX0=--286fb25c1b04ae5e87cf744151d56374f88e862c/image.png&quot; filename=&quot;image.png&quot; filesize=&quot;4386&quot; width=&quot;235&quot; height=&quot;394&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcwNjEwNDYsInB1ciI6ImJsb2JfaWQifX0=--286fb25c1b04ae5e87cf744151d56374f88e862c/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/image.png&quot;&gt;

  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;But instead by using &lt;code&gt;portrait:grid--cols-2&lt;/code&gt; we get to actually increase the size and reduce the whitespace.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcwNjEwNDI_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--a0aa2b7b32426108a5720801aa1082870c476a67&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcwNjEwNDIsInB1ciI6ImJsb2JfaWQifX0=--24b1faecc691e760e2af9d7d96825f593e60e930/image.png&quot; filename=&quot;image.png&quot; filesize=&quot;12395&quot; width=&quot;241&quot; height=&quot;402&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcwNjEwNDIsInB1ciI6ImJsb2JfaWQifX0=--24b1faecc691e760e2af9d7d96825f593e60e930/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/image.png&quot;&gt;

  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;pre data-language=&quot;html&quot;&gt;&amp;lt;div class=&quot;layout&quot;&amp;gt;&lt;br&gt;  &amp;lt;div class=&quot;grid grid--cols-3 portrait:grid--cols-2&quot;&amp;gt;&lt;br&gt;    &amp;lt;span class=&quot;value value--small lg:value--base&quot;&amp;gt;Column One&amp;lt;/span&amp;gt;&lt;br&gt;    &amp;lt;span class=&quot;value value--small lg:value--base&quot;&amp;gt;Column Two&amp;lt;/span&amp;gt;&lt;br&gt;    &amp;lt;span class=&quot;value value--small portrait:col--span-2 portrait:value--large lg:value--base&quot;&amp;gt;Column Three&amp;lt;/span&amp;gt;&lt;br&gt;  &amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;h2&gt;The Little Things&lt;/h2&gt;&lt;p&gt;We don&#39;t always notice these, and mostly they are nice-to-haves and not required for publishing.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;If you use a &lt;code&gt;title_bar&lt;/code&gt;, don&#39;t use the default TRMNL logo that is in our example docs, but instead use an image appropriate for the data source. Be careful with emoji, they often don&#39;t render as expected.&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;em&gt;Using a static image inserted via a &lt;/em&gt;&lt;/i&gt;&lt;i&gt;&lt;code&gt;&lt;em&gt;src&lt;/em&gt;&lt;/code&gt;&lt;/i&gt;&lt;i&gt;&lt;em&gt; URL?&lt;/em&gt;&lt;/i&gt; If you want to make sure that it always renders, you can encode it within the page rather than calling an external URL. Use our guide to &lt;a href=&quot;https://help.trmnl.com/en/articles/12391781-creating-inline-images-for-plugins&quot;&gt;inline images&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Keep things &lt;b&gt;&lt;strong&gt;DRY&lt;/strong&gt;&lt;/b&gt; [Don&#39;t Repeat Yourself]. The &lt;a href=&quot;https://help.trmnl.com/en/articles/13216853-reusing-markup-with-shared&quot;&gt;&lt;i&gt;&lt;em&gt;Shared&lt;/em&gt;&lt;/i&gt; view&lt;/a&gt; is a great way to accomplish this.&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;
</content>
    <id>https://trmnl.com/blog/plugin-recipe-publishing-tips</id>
    <link href="https://trmnl.com/blog/plugin-recipe-publishing-tips"/>
    <published>2026-04-27T00:00:00+00:00</published>
    <rights>Copyright 2026</rights>
    <title>A Checklist for Turning a Private Plugin into a Recipe for Others</title>
    <updated>2026-04-27T00:00:00+00:00</updated>
    <dc:date>2026-04-27T00:00:00+00:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>Mario Lurig</name>
      <uri>https://trmnl.com</uri>
    </author>
    <category term="trmnl"
      label="TRMNL"/>
    <content type="html">&lt;div data-controller=&quot;blog-syntax-highlighter&quot; class=&quot;lexxy-content&quot;&gt;&lt;blockquote&gt;This post is part of a series, featuring the incredible work of plugin authors who grow the TRMNL plugin ecosystem with every contribution. The TRMNL team has individually selected these plugins and authors to be featured.&lt;/blockquote&gt;&lt;h2&gt;&lt;a href=&quot;https://trmnl.com/recipes/250879&quot;&gt;Today: Beautiful Date &amp;amp; Countdown&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Community member med created the &lt;a href=&quot;https://trmnl.com/recipes/250879&quot;&gt;Today: Beautiful Date &amp;amp; Countdown&lt;/a&gt; plugin; here are their words on how it was created.&lt;/p&gt;&lt;h3&gt;Why did you want this plugin to exist?&lt;/h3&gt;&lt;p&gt;installing a date plugin on a TRMNL is almost a rite of passage. it’s one of the first things people reach for when they set up the device. if you’re going to look at something every single day, it makes sense today&#39;s date should be there. on a more personal level, i build because i&#39;m obsessed with UX. i can’t not refine things. so taking one of the most common, simplest plugins possible and rethinking it through a design-first lens felt great :) a date is a tiny problem, but it’s also a perfect opportunity for my obsession to bring value to the people.&lt;/p&gt;&lt;h3&gt;Why were you the person to make it?&lt;/h3&gt;&lt;p&gt;you have my obsession to thank (or blame) for that.i can&#39;t look at something every day and not want to have it just &lt;i&gt;&lt;em&gt;perfect&lt;/em&gt;&lt;/i&gt;, especially when it&#39;s simple. simplest things are the most dangerous sometimes; they&#39;re very easy to accept as good enough.&lt;/p&gt;&lt;h3&gt;&lt;mark style=&quot;color:rgb(67, 67, 67);&quot;&gt;Were you inspired by any other recipes or plugin creators?&lt;/mark&gt;&lt;/h3&gt;&lt;p&gt;since this was my first plugin, i spent a lot of time looking at what was already out there. there are some really solid recipes and a lot of creative approaches. i didn’t want to reinvent the wheel, i just wanted to reinterpret it through my own design lens.after building it, i joined the discord and was honestly impressed by the level of talent and experimentation happening in the community. great job guys.&lt;/p&gt;&lt;h3&gt;What was your process for creating the plugin?&lt;/h3&gt;&lt;p&gt;my process for most things creative is to sit down and figure out in an extensive way what problem(s) am i trying to solve and what would be the ideal solution. real life then comes into play and you try to keep and minimize the delta between the ideal scenario and the actual implementation to a minimum. in this example, a big notion for me was context. more than seeing the date, i wanted to get a deeper level of understanding of the context with just one glance.&lt;/p&gt;&lt;h3&gt;What, if any, challenges did you face while creating it?&lt;/h3&gt;&lt;p&gt;it was honestly pretty straightforward thanks to the awesome &lt;a href=&quot;https://github.com/usetrmnl/trmnlp&quot;&gt;trmnlp&lt;/a&gt; tool. having live preview during development and being able to quickly switch between device sizes and settings removed almost all the friction from the process.when you have a clear idea of what you’re trying to build, having tooling that stays out of the way makes all the difference. it made the whole experience super pleasant from start to finish.&lt;/p&gt;&lt;h3&gt;Did you learn anything you want to apply to future recipes?&lt;/h3&gt;&lt;p&gt;the most important thing i&#39;ve taken from this plugin is the dark mode dotted-matrix aesthetic that i’ve already started incorporating into my other plugins. i now have a daily unix tip, weather glance, and a world map “been there” dashboard; all matching this same visual language. i think it fits the trmnl purpose incredibly well. the high contrast works beautifully on e-ink, the dotted grid feels native to the device, and the whole control-panel vibe matches the audience using it. it’s glanceable, structured, and low noise.and yes… i am absolutely crazed about it right now :)&lt;/p&gt;&lt;h3&gt;What is your favorite plugin that someone else created and why?&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://trmnl.com/recipes/152705&quot;&gt;paperboy&lt;/a&gt; is the prime example of a &lt;i&gt;&lt;em&gt;perfect&lt;/em&gt;&lt;/i&gt; plugin for me. super cool idea, extremely clear signal, zero fluff. it does one thing and does it properly. big props to the author. the design probably looks effortless now, but i’m sure it took serious iteration to get to that level of clarity.&lt;/p&gt;
&lt;/div&gt;
</content>
    <id>https://trmnl.com/blog/featured-plugin-today-beautiful-date-countdown</id>
    <link href="https://trmnl.com/blog/featured-plugin-today-beautiful-date-countdown"/>
    <published>2026-04-21T00:00:00+00:00</published>
    <rights>Copyright 2026</rights>
    <title>Featured Community Plugin - Today: Beautiful Date &amp; Countdown</title>
    <updated>2026-04-21T00:00:00+00:00</updated>
    <dc:date>2026-04-21T00:00:00+00:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>Mario Lurig</name>
      <uri>https://trmnl.com</uri>
    </author>
    <category term="trmnl"
      label="TRMNL"/>
    <content type="html">&lt;div data-controller=&quot;blog-syntax-highlighter&quot; class=&quot;lexxy-content&quot;&gt;&lt;p&gt;Creating a plugin is an exciting way to use our &lt;a href=&quot;https://help.trmnl.com/en/articles/12410549-developer-edition-features&quot;&gt;Developer Edition&lt;/a&gt; license to bring your low-distraction dashboard to life with the content you want to see. Let&#39;s cover a few ways to get started; pick the one that fits you best.&lt;/p&gt;&lt;h2&gt;The Copycat&lt;/h2&gt;&lt;p&gt;You see a great idea, you aim to take it. Great! The spirit of TRMNL&#39;s open source core is to share our value with others, building a community on a foundation of generosity. Hundreds of authors have crafted a plugin, honed it, and published it as a &lt;i&gt;&lt;em&gt;recipe&lt;/em&gt;&lt;/i&gt; for others to &lt;b&gt;&lt;strong&gt;install&lt;/strong&gt;&lt;/b&gt; or &lt;b&gt;&lt;strong&gt;fork&lt;/strong&gt;&lt;/b&gt;. Here&#39;s a quick way to understand the difference:&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcwMzU5MDM_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--01f584d882007c05c41710676840d48e6d3b5ed5&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcwMzU5MDMsInB1ciI6ImJsb2JfaWQifX0=--70ad55ccb5d0fe8fc0ee187dd93e4b47f58779fd/image.png&quot; filename=&quot;image.png&quot; filesize=&quot;2101&quot; width=&quot;300&quot; height=&quot;69&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Preview, Install, or Fork Buttons&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcwMzU5MDMsInB1ciI6ImJsb2JfaWQifX0=--70ad55ccb5d0fe8fc0ee187dd93e4b47f58779fd/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/image.png&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Preview, Install, or Fork Buttons
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;strong&gt;Install:&lt;/strong&gt;&lt;/b&gt; Use the plugin in your account, with customizations designed by the author, and maintain a link between your copy and the original recipe, so that any updates made to the original &lt;i&gt;&lt;em&gt;recipe&lt;/em&gt;&lt;/i&gt; will automatically be applied to your installation. This is similar to how apps in a mobile app store function.&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;strong&gt;Fork:&lt;/strong&gt;&lt;/b&gt; Make a copy of the plugin, but with the ability&lt;i&gt;&lt;em&gt; to see exactly how it was made and have the ability to &lt;/em&gt;&lt;/i&gt;&lt;i&gt;&lt;b&gt;&lt;strong&gt;change anything&lt;/strong&gt;&lt;/b&gt;&lt;/i&gt;&lt;i&gt;&lt;em&gt;, including the markup code that lays out the look and functionality of the plugin.&lt;/em&gt;&lt;/i&gt; The link to the original recipe is severed. &lt;b&gt;&lt;strong&gt;This is the copycat way.&lt;/strong&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;And don&#39;t think you need to copy a plugin with similar content. You may just love the way the content is laid out and can imagine &lt;i&gt;&lt;em&gt;your data&lt;/em&gt;&lt;/i&gt; in that same format. Don&#39;t like it after forking? Click &lt;i&gt;&lt;em&gt;Remove Plugin&lt;/em&gt;&lt;/i&gt; and go hunt down another one. Of course, if you&#39;d rather get a robot to help you...&lt;/p&gt;&lt;h2&gt;The AI Builder&lt;/h2&gt;&lt;p&gt;Oh, you thought you could escape AI&#39;s ever-presence in the conversation?&lt;/p&gt;&lt;p&gt;Actually, you can, just scroll-down to the next section.&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;em&gt;But&lt;/em&gt;&lt;/i&gt;... if you are intrigued, then let me introduce to our &lt;a href=&quot;https://help.trmnl.com/en/articles/14130438-ai-agent&quot;&gt;AI Builder&lt;/a&gt;, a collection of tools, prompts, and a dusting of hubris that takes a one-sentence request and $1 or two and turns it into a plugin that makes you go, &quot;wow.&quot;&lt;/p&gt;&lt;p&gt;As mentioned in our &lt;a href=&quot;https://help.trmnl.com/en/articles/14130438-ai-agent&quot;&gt;helpful AI agent guide&lt;/a&gt;, once you opt-in to using the tool and get your API key assigned (so OpenRouter can track your usage and charge you), you can start creating a brand new private plugin, &lt;i&gt;&lt;em&gt;save&lt;/em&gt;&lt;/i&gt; your settings (e.g. name of the plugin), then head into &lt;i&gt;&lt;em&gt;edit markup&lt;/em&gt;&lt;/i&gt;. Once there, the shiny new &lt;b&gt;&lt;strong&gt;Agent&lt;/strong&gt;&lt;/b&gt; tab will be available.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcwMzY0NzY_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--f07ec35d4e5ada68d08d4f6258d5c86179f482ca&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcwMzY0NzYsInB1ciI6ImJsb2JfaWQifX0=--a7f1453dba153e51774e30f4de6c4e7225a91bc9/image.png&quot; filename=&quot;image.png&quot; filesize=&quot;7687&quot; width=&quot;911&quot; height=&quot;71&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;Edit Markup header with Agent highlighted&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcwMzY0NzYsInB1ciI6ImJsb2JfaWQifX0=--a7f1453dba153e51774e30f4de6c4e7225a91bc9/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/image.png&quot;&gt;

      &lt;figcaption class=&quot;attachment__caption&quot;&gt;
          Edit Markup header with Agent highlighted
      &lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;Now, while it is ever evolving, it really shines in its ability to give you a great first draft of a plugin, even if you don&#39;t know where your data is coming from or exactly what you want it to look like. Just remember, there&#39;s a reason we recommend Claude&#39;s AI models; less expensive models can do an good job with additional guidance, but you&#39;re building your &lt;b&gt;&lt;strong&gt;first plugin&lt;/strong&gt;&lt;/b&gt;, so may be worth leaning on the model to do a lot of the heavy lifting.&lt;/p&gt;&lt;p&gt;If you prefer to keep the human completely in the loop, have you considered some light reading?&lt;/p&gt;&lt;h2&gt;The Bookworm&lt;/h2&gt;&lt;p&gt;You want some documentation. Pages of clear guidance and examples, because &lt;b&gt;&lt;strong&gt;you need to understand it&lt;/strong&gt;&lt;/b&gt;, and you know you&#39;re on the looooooong road to being a multi-recipe publishing, thought-leadin&#39;, creator fund earning &lt;a href=&quot;https://trmnl.com/experts&quot;&gt;TRMNL Expert&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;We built our &lt;a href=&quot;https://trmnl.com/framework&quot;&gt;&lt;b&gt;&lt;strong&gt;Framework&lt;/strong&gt;&lt;/b&gt;&lt;/a&gt; with two core intentions: Create a design language for reliable and innovative rendering on an ePaper display, and give any developer, even the lapsed ones, &lt;i&gt;&lt;em&gt;superpowers.&lt;/em&gt;&lt;/i&gt; Like &lt;code&gt;mobile-first&lt;/code&gt; design lead frontend developers through the mobile/desktop swap, our &lt;code&gt;framework-first&lt;/code&gt; ethos can be interpreted as, &quot;Design with Framework and Liquid first, then fallback to custom CSS and Javascript if you reach a limitation.&quot;&lt;/p&gt;&lt;p&gt;So dive into the &lt;a href=&quot;https://trmnl.com/framework/docs/v3&quot;&gt;docs&lt;/a&gt; or the &lt;a href=&quot;https://trmnl.com/framework/examples?version=v3&quot;&gt;examples&lt;/a&gt;, consume it all, and get building! Remenber that we also use Liquid and even have &lt;a href=&quot;https://help.trmnl.com/en/articles/10347358-custom-plugin-filters&quot;&gt;custom filters&lt;/a&gt; available.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;strong&gt;Framework &lt;/strong&gt;&lt;/b&gt;&lt;a href=&quot;https://trmnl.com/framework/docs/v2/v2_overview&quot;&gt;&lt;b&gt;&lt;strong&gt;v2&lt;/strong&gt;&lt;/b&gt;&lt;/a&gt;&lt;b&gt;&lt;strong&gt;: &lt;/strong&gt;&lt;/b&gt;Added responsive classes for larger displays and higher bit depths (more grays), redesigned our built-in javascript functionality for clamping, and expanded size variations across elements and components.&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;strong&gt;Framework &lt;/strong&gt;&lt;/b&gt;&lt;a href=&quot;https://trmnl.com/framework/docs/v3/v3_overview&quot;&gt;&lt;b&gt;&lt;strong&gt;v3&lt;/strong&gt;&lt;/b&gt;&lt;/a&gt;&lt;b&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;/b&gt; Added color through variants, hues, and new utilities, supporting colors beyond black and white.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Of course, maybe you would rather have your docs in more of a just-in-time fashion...&lt;/p&gt;&lt;h2&gt;The Maker&lt;/h2&gt;&lt;p&gt;You just need a &lt;i&gt;&lt;em&gt;process&lt;/em&gt;&lt;/i&gt; to get started, and a reference point for how to do the specific thing you want to do right now. You want to get started.&lt;/p&gt;&lt;p&gt;So you jump on our &lt;a href=&quot;https://help.trmnl.com/en/articles/9510536-private-plugins&quot;&gt;private plugins&lt;/a&gt; tutorial, you load the Framework docs in another tab, and you find an open API you can query without any authentication and get to work understanding by doing. Here&#39;s a simple set of guidelines to help you get comfortable:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Set your plugin to &lt;b&gt;&lt;strong&gt;polling&lt;/strong&gt;&lt;/b&gt;, save, then &lt;i&gt;&lt;em&gt;force refresh&lt;/em&gt;&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;After a few seconds, click &lt;i&gt;&lt;em&gt;edit markup&lt;/em&gt;&lt;/i&gt; and scroll down to make sure data is populating in &lt;b&gt;&lt;strong&gt;My Variables&lt;/strong&gt;&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;Build in the FULL view; the other views will be derivative of the full view so it&#39;s a great place to lock-in before you start migrating. This includes sticking all your Liquid logic (&lt;a href=&quot;https://help.trmnl.com/en/articles/10671186-liquid-101&quot;&gt;tutorial&lt;/a&gt; and &lt;a href=&quot;https://help.trmnl.com/en/articles/10693981-advanced-liquid&quot;&gt;advanced tutorial&lt;/a&gt;) in the FULL view, for now. In the future, to keep the code &lt;a href=&quot;https://trmnl.com/blog/private-plugin-shared-markup&quot;&gt;DRY&lt;/a&gt; [Don&#39;t Repeat Yourself], you can move the logic to the Shared tab. &lt;i&gt;&lt;b&gt;&lt;strong&gt;All views process Shared content prior to their own&lt;/strong&gt;&lt;/b&gt;&lt;/i&gt;&lt;b&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Start with a basic template:&lt;/li&gt;&lt;/ul&gt;&lt;pre data-language=&quot;html&quot;&gt;&amp;lt;div class=&quot;layout&quot;&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;div class=&quot;column&quot;&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;!-- Show some data here --&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;div class=&quot;title_bar&quot;&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;img class=&quot;image&quot; src=&quot;/images/plugins/trmnl--render.svg&quot;&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;span class=&quot;title&quot;&amp;gt;Title Bar with Instance&amp;lt;/span&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;span class=&quot;instance&quot;&amp;gt;Production&amp;lt;/span&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;If the data source is an array of objects, then make a quick iteration:&lt;/li&gt;&lt;/ul&gt;&lt;pre data-language=&quot;js&quot;&gt;{% for thing in yourVariableName %}&lt;br&gt;&amp;nbsp; {{ thing.id }}&lt;br&gt;{% endfor %}&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Look over the data provided from your API and take notes about features you need to include, such as &lt;a href=&quot;https://help.trmnl.com/en/articles/10513740-custom-plugin-form-builder&quot;&gt;Form Field&lt;/a&gt; customization (&lt;a href=&quot;https://usetrmnl.github.io/trmnl-form-builder/&quot;&gt;visual editor&lt;/a&gt;), highlighting data, and &lt;a href=&quot;https://help.trmnl.com/en/articles/10693981-advanced-liquid?q=liquid#h_9e85ea209b&quot;&gt;date transformations&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Make some early layout decisions for the data. Will it be a grid, a list of items, columns (smart columns?), flex... (&lt;a href=&quot;https://trmnl.com/framework/docs/v3/layout&quot;&gt;Framework docs&lt;/a&gt;). &lt;b&gt;&lt;strong&gt;This can change later&lt;/strong&gt;&lt;/b&gt;, and the easiest way to know it should change is to &lt;i&gt;&lt;b&gt;&lt;strong&gt;build something and hate it&lt;/strong&gt;&lt;/b&gt;&lt;/i&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;You&#39;re building in small pieces, then likely tearing away large chunks. You don&#39;t care, because you are &lt;b&gt;&lt;strong&gt;learning&lt;/strong&gt;&lt;/b&gt; and &lt;b&gt;&lt;strong&gt;having fun&lt;/strong&gt;&lt;/b&gt;.&lt;/p&gt;&lt;h2&gt;The Designer&lt;/h2&gt;&lt;p&gt;You&#39;ve lived your life in layers, built elements through drag and drop, and you want that same experience within TRMNL. You want a &lt;a href=&quot;https://help.trmnl.com/en/articles/14726819-visual-editor-ide&quot;&gt;Visual Editor&lt;/a&gt;.&lt;/p&gt;&lt;action-text-attachment sgid=&quot;eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3RybW5sL0FjdGl2ZVN0b3JhZ2U6OkJsb2IvMTcxOTMwMjY_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--c9879afd68e30ce6f73b412aece8ea64177f238a&quot; content-type=&quot;image/png&quot; url=&quot;https://trmnl.com/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxOTMwMjYsInB1ciI6ImJsb2JfaWQifX0=--791ac12d5aea8b5172df022ba468064744885a5b/TRMNL-visual-editor.png&quot; filename=&quot;TRMNL-visual-editor.png&quot; filesize=&quot;378017&quot; width=&quot;1898&quot; height=&quot;1069&quot; previewable=&quot;true&quot; presentation=&quot;gallery&quot; caption=&quot;&quot;&gt;  &lt;figure class=&quot;attachment attachment--preview attachment--png&quot;&gt;
      &lt;img src=&quot;https://trmnl.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTcxOTMwMjYsInB1ciI6ImJsb2JfaWQifX0=--791ac12d5aea8b5172df022ba468064744885a5b/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fbGltaXQiOlsxMDI0LDc2OF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--a1b29f018116e3f4abd0440beb02228a54f47dd1/TRMNL-visual-editor.png&quot;&gt;

  &lt;/figure&gt;&lt;/action-text-attachment&gt;&lt;p&gt;Released in beta in April 2026, our visual editor offers a way to build new plugins or modify existing plugins (hello &lt;i&gt;&lt;em&gt;Copycat&lt;/em&gt;&lt;/i&gt;) with a design driven view, rather than a programmatic view, while both are available. Using the editor is optional, and the &lt;i&gt;&lt;em&gt;Designer&lt;/em&gt;&lt;/i&gt; can easily switch back and forth depending on their needs. &lt;/p&gt;&lt;h2&gt;Final Thoughts&lt;/h2&gt;&lt;p&gt;There is no wrong way to make a plugin...&lt;i&gt;&lt;em&gt; except to use custom css to lay everything out like you&#39;re working on your first website in 1998.&lt;/em&gt;&lt;/i&gt; Ignoring this advice is possible, but will lead to frustrations later. The learning curve is not steep nor is it high, but ignoring it is ignoring an &lt;b&gt;&lt;strong&gt;opportunity to learn&lt;/strong&gt;&lt;/b&gt;, which should never be squandered.&lt;/p&gt;
&lt;/div&gt;
</content>
    <id>https://trmnl.com/blog/making-great-plugin-first-time</id>
    <link href="https://trmnl.com/blog/making-great-plugin-first-time"/>
    <published>2026-04-20T00:00:00+00:00</published>
    <rights>Copyright 2026</rights>
    <title>Making a Great Plugin the First Time</title>
    <updated>2026-04-20T00:00:00+00:00</updated>
    <dc:date>2026-04-20T00:00:00+00:00</dc:date>
  </entry>
  <dc:date>2026-05-26T00:00:00+00:00</dc:date>
</feed>