---
title: "Your [Sad And Shallow] Moat Is Gone"
description: "How I replaced Inoreader's paid programmatic RSS feature in three minutes using Val Town and Townie, plus a self-hosted Go fallback — and why SaaS paywalls on commodity features are indefensible moats."
pubDatetime: 2026-05-02T10:00:00Z
author: hrbrmstr
tags: ["rss", "val-town", "inoreader", "webflow", "aisi", "web-scraping", "saas", "golang", "townie", "ai-agents"]
---
> Original: [Your [Sad And Shallow] Moat Is Gone](https://ai.rud.is/posts/2026-05-02-your-moat-is-gone)

I was reading the U.K. government's AI Security Institute (AISI) [evaluation of OpenAI's GPT-5.5 cyber capabilities](https://www.aisi.gov.uk/blog/our-evaluation-of-openais-gpt-5-5-cyber-capabilities) after tapping the link in a post on Mastodon. After scanning it, I wondered why I didn't have the blog in my Inoreader RSS feed, when I got reminded by Inoreader as to the reason:

![Inoreader showing no RSS feed for AISI's blog](./img/moat-01.png)

AISI sadly uses WebFlow _(I have no idea why anyone uses that daft platform for blog content; I helped maintain the blog for my previous employer for the first two years of my employ there and WebFlow is just plain terrible bloatware.)_, and you have to do some machinations to get it to also spit out an RSS feed from their "collections".

I tapped the "Create Web feed" button _(TIL "Sentence case" for buttons is the widely recommended default, made popular by Google's Material Design, Apple's HIG, and other contemporary design systems)_ since that's one reason I use Inoreader _(yes, I know FreshRSS can do that too but I'm a die-hard Inoreader user)_:

![Inoreader showing it was able to create a web feed](./img/moat-02.png)

Even before their use of "AI", Inoreader was pretty good at finding the right HTML elements to use as components for a scraped feed.

I happily tapped "Follow feed" button:

![Inoreader trying to grift more money out of me](img/moat-03.png)

and then remembered why it was not in my feed.

I am not giving Inoreader any more money just for the privilege of having more programmtic RSS feeds. So, I headed over to [Val Town](https://www.val.town/). In their own parlance, it's the "Zapier for know-code engineers". I've been using them off and on for a few years because the CEO is a great communicator, understands builders, and is neither afraid of "AI" nor has "AI Psychosis" _(like a few of my former work colleages desperately, obviously have)_.

Val Town has had their own agent — Townie — since I started using their service. Even a few years ago, they did a a bang up job with it's system prompts and tools that it ended up being a great way to both shortcut create a quick app, and then quickly add features to any app. It also comes with SQLite databases for each Val, the ability to run jobs on a timer, and a bunch more features _(this post is not an advert for Val Town, so you can poke at what else it has on your own)_.

I looked at the HTML structure _(NOTE: if you come across a WebFlow-based blog, do "view source" vs "inspect element" since they do love their needless post-load javascript machinations)_, and then gave Townie this prompt:

> `https://www.aisi.gov.uk/blog has no RSS feed. We need to build a Val that will expose an RSS feed for it.`
>
> `The structure is clean and highly iterable—each entry has consistent element ordering. You can reliably grab generics by index since they appear in the same sequence for every entry.`
>
> `Let's use SQLite to keep a database of blog entries and run this once every day to scrape and store the latest entries then when a user requests the RSS feed, we can serve it from the database.`

~Three-minutes later, the feed had a [landing page](https://hrbrmstr--a9fd1110460d11f1b63242b51c65c3df.web.val.run/)

![Val Town AISI RSS App Landing Page](img/val-town-rss-app-landing-page.png)

an actual RSS feed: <https://hrbrmstr--a9fd1110460d11f1b63242b51c65c3df.web.val.run/feed>, and entries in Inoreader:

![Inoreader article listing for AISI's blog](img/moat-04.png)

The Val Town cron job was automatically set up and given a first run, and I even have a nice architecture flowchart:

![Flowchart of how the app works](img/val-town-aisi-flowchart.png)

| File         | Type     | Role                                                     |
| ------------ | -------- | -------------------------------------------------------- |
| `feed.ts`    | HTTP     | Serves RSS at `/feed` and a landing page at `/`          |
| `cron.ts`    | Interval | Runs **daily** to scrape the blog                        |
| `scraper.ts` | Script   | Parses the Webflow HTML using Cheerio, upserts to SQLite |
| `rss.ts`     | Script   | Generates valid RSS 2.0 XML from the database            |
| `main.ts`    | Script   | One-time DB schema setup (already run)                   |

By default, Val Town projects are public, so you can [see all the work Townie did](https://www.val.town/x/hrbrmstr/aisi-rss).

If you bring your own agent (which I could have done with Ollama-via-OpenCode wired up to Val Town's excellent MCP or CLI), Val Town is free _(though access to Townie, the ability to have private Vals, custom domains, and more is 100% worth the super cheap annual sub)_.

I didn't even bother to spend the same likely three-minutes digesting how much Inoreader would have wanted to charge me so I could get more programmatic feed credits. It likely would have cost as much as the Val Town annual sub, where I get unlimited programmatic RSS feeds for free.

While Townie was cranking, I also used OpenCode and MiniMax 2.7 to wire up a proper [Golang feed generator](https://git.sr.ht/~hrbrmstr/aisi-blog-fetcher) for the AISI blog so I can self-host it for "free" in the event Val Town ever goes away.

If Inoreader's _(or any other SaaS)_ business model _relies_ on nickle-and-diming users for features like this, they have no moat. In fact, I can help drain this particular moat by offering to set up programamtic feeds for anyone _(yay unlimited Vals)_ if they run into a sad blog or site that refuses to do the right thing and have RSS feeds.


```json
[
  {
    "@context": "https://schema.org",
    "@type": "BlogPosting",
    "@id": "https://ai.rud.is/posts/2026-05-02-your-moat-is-gone",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://ai.rud.is/posts/2026-05-02-your-moat-is-gone"
    },
    "headline": "Your [Sad And Shallow] Moat Is Gone",
    "datePublished": "2026-05-02T10:00:00Z",
    "description": "How I replaced Inoreader's paid programmatic RSS feature in three minutes using Val Town and Townie, plus a self-hosted Go fallback — and why SaaS paywalls on commodity features are indefensible moats.",
    "url": "https://ai.rud.is/posts/2026-05-02-your-moat-is-gone",
    "keywords": [
      "rss",
      "val-town",
      "inoreader",
      "webflow",
      "aisi",
      "web-scraping",
      "saas",
      "golang",
      "townie",
      "ai-agents"
    ],
    "author": [
      {
        "@type": "Person",
        "name": "hrbrmstr",
        "url": "https://rud.is"
      }
    ],
    "publisher": {
      "@type": "Organization",
      "name": "hrbrmstr",
      "url": "https://ai.rud.is/",
      "sameAs": [
        "https://mastodon.social/@hrbrmstr",
        "https://bsky.app/profile/hrbrmstr.bsky.social",
        "https://github.com/hrbrmstr",
        "https://sr.ht/~hrbrmstr"
      ]
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "itemListElement": [
      {
        "@type": "ListItem",
        "position": 1,
        "item": {
          "@id": "https://ai.rud.is/",
          "name": "ai.rud.is"
        }
      },
      {
        "@type": "ListItem",
        "position": 2,
        "item": {
          "@id": "https://ai.rud.is/posts/2026-05-02-your-moat-is-gone",
          "name": "Your [Sad And Shallow] Moat Is Gone"
        }
      }
    ]
  }
]
```
