Logo

How Gaffa powers a universal news plugin for TRMNL with a single API call

Discover how Gaffa powers TRMNL's news plugin. Turns any website into a personalised e-ink display using a single parse_json API call, no scraper setup required.

Jun 22, 2026
How Gaffa powers a universal news plugin for TRMNL with a single API call
TRMNL is a low-power e-ink display that sits quietly in your home or office, showing you exactly the information you want without demanding your attention. We worked with TRMNL to build an official plugin that lets anyone turn any news site into a personalised feed on their wall, powered by a single Gaffa API call.
TRMNL has grown remarkably since its Kickstarter launch in June 2024, where it raised over $157,000 against a $5,000 goal, and now serves tens of thousands of users worldwide. At the heart of TRMNL's success is a thriving community ecosystem: its plugin library has expanded from 60 to over 700 in a single year, with the vast majority built and maintained by the community. The Gaffa personalised news plugin is now part of that ecosystem.
As a TRMNL owner, I was using the device to display Gaffa's analytics in a distraction-free way, but my favourite news sites had no integrations. I knew Gaffa could solve this: its ability to scrape any site and parse the content with an LLM meant anyone could get a personalised news feed from whatever site they cared about. We worked with TRMNL to build an official plugin that does exactly that. Here's how it works behind the scenes.

We created TRMNL for normal people. People who don't want to build scrapers or write code. They want a passive display that just works. Thanks to Gaffa we're much closer to achieving that vision, as users can literally describe what they want in plain English.

Ryan Kulp

Ryan Kulp

Founder @ TRMNL

How the integration works

After installing the Gaffa plugin, users just need to add a URL to start receiving the top 5 stories from the specified site, refreshed on TRMNL's regular update cycle. Users can also specify a custom prompt to personalise the output, for example: "always include at least one sport story", "translate the headlines into French", "never include stories about [a topic you want to avoid]", or "focus only on technology stories".
Under the hood, TRMNL sends the URL and the user's custom prompt to Gaffa. Gaffa opens the page in a real browser, automatically handling JavaScript rendering, proxies, and ad-blocking, and then the parse_json action uses an LLM to extract the top five stories and returns them as a clean JSON object. TRMNL receives the result via webhook and renders it on the display.
Here's the complete request:
Gaffa TRMNL plugin request

How parse_json handles the extraction

The core of this integration is the parse_json action. Rather than writing site-specific selectors or maintaining a scraping configuration for every publication, you define a schema that describes the shape of data you want back, and Gaffa handles the rest. Behind the scenes, Gaffa converts the page to markdown, and the LLM parses that content against your schema. Gaffa then validates that the response matches the schema exactly before returning it, so TRMNL can always rely on receiving the same predictable structure: a page_title and an array of 5 articles, each with a title, description, and time, regardless of which site the user has pointed the plugin to. This works across the long tail of the web, from straightforward static HTML pages to heavily JavaScript-rendered ones. For a deeper look at how the action works and how to design effective schemas, read our guide to turning web content into structured data with parse_json.
The data_schema is what makes this work across every site. The more descriptive your field descriptions, the better the output. In our case, the description on the articles array instructs the LLM not to use clickbait headlines and to focus on what has actually happened. You can use that description field to shape quality, not just structure. If you were building your own integration, you could vary the field names, descriptions, and output types to match whatever data you need.
The instruction field is where the user's custom prompt is injected, wrapped in <user_preferences> tags to separate it cleanly from the system instruction. This makes the plugin feel personal rather than generic.

TRMNL users have surprised us

We built a news plugin. Users immediately started using it as something else entirely, which has been the most enjoyable part of watching it grow.
One user in Finland pointed it at their local transport authority's website to pull the next five train departures from their nearest station. Another pointed it at a college cafeteria menu that is updated weekly. The same schema, the same action, completely different use cases, all handled by parse_json.
And that’s not to mention all the niche news sites that will never get their own TRMNL plugin, but now effectively have one. Sleep Savvy, a mattress industry newsletter, is a good example: a small but dedicated readership, and at least one of those readers now wakes up to its latest stories on an e-ink display. Users' creativity has made us think more seriously about expanding the plugin's scope beyond news.
Asking the plugin for the top offbeat news stories

It was a pleasure working with the Gaffa team to bring their generous trial to our users. The extensive documentation offered to the TRMNL team made the integration a breeze.

Ikraam Ghoor

Ikraam Ghoor

Senior Software Engineer @ TRMNL

Build your own integration with parse_json

The TRMNL plugin is one example of what parse_json can do. The same pattern applies to any situation where you need structured data extracted from a web page without writing site-specific scrapers: define a schema, pass an instruction, and point it at a URL.
If you want to try it yourself, the API playground lets you run a live request immediately, and the parse_json documentation covers the full parameter reference, schema operations, and pricing.
The Gaffa plugin is available now in the TRMNL integrations store. It launched with a six-month free trial, no Gaffa account required. After the trial, you can connect your own Gaffa account and continue using the plugin against your credit balance.
The TRMNL integration shows what becomes possible when the hard parts of web data, browser rendering, proxy management, LLM parsing, and schema enforcement are all handled for you. Point it at a URL, write a sentence, and Gaffa takes care of the rest. Sign up for a free Gaffa account to get started.

James
James Founder

Ready to build your own integration?

Join hundreds of teams using Gaffa to automate their browser workflows