A few months ago I was subscribed to about 40 email newsletters and reading maybe three. The rest piled up in my inbox. I was also spending way too much time on Reddit and Hacker News. I’d scroll past stuff I didn’t care about to find the one or two posts that mattered for my work.

So I used Claude Code to build a self-hosted RSS setup with an AI filter on top, and I like it a lot more. (It’s the second post in my Building in Public series, after rebuilding this website with AI.)

Why RSS, and why self-host it

Most websites still publish an RSS feed, a list of their latest posts. Point a reader app at those feeds and everything shows up in one place, in order, with no algorithm deciding what you see. Reddit, YouTube and Substack all have feeds.

You could use a hosted service like Feedly or Inoreader. I self-host because it’s free, it’s private, and it gives me an API. Claude Code can write scripts against that API to filter out the noise. A hosted service can’t do that.

What you need

  • A Docker runtime. I use OrbStack on my Mac, a lightweight alternative to Docker Desktop.
  • Miniflux, a lightweight, open-source RSS server. It runs as two containers: Miniflux and a PostgreSQL database.
  • A reader app. I use NetNewsWire, which is free and open-source (Mac and iOS only).

Setting it up

I asked Claude Code for Miniflux in Docker on my Mac Mini, reachable from my laptop and phone on my local network. Here’s the docker-compose.yml it put together:

services:
  miniflux:
    image: miniflux/miniflux:latest
    container_name: miniflux
    ports:
      - "8085:8080"
    depends_on:
      db:
        condition: service_healthy
    environment:
      - DATABASE_URL=postgres://miniflux:YOUR_DB_PASSWORD@db/miniflux?sslmode=disable
      - RUN_MIGRATIONS=1
      - CREATE_ADMIN=1
      - ADMIN_USERNAME=yourusername
      - ADMIN_PASSWORD=YOUR_ADMIN_PASSWORD
      - BASE_URL=http://YOUR_IP:8085
      - POLLING_FREQUENCY=60
      - BATCH_SIZE=100
      - CLEANUP_ARCHIVE_READ_DAYS=60
      - CLEANUP_ARCHIVE_UNREAD_DAYS=180
    healthcheck:
      test: ["CMD", "/usr/bin/miniflux", "-healthcheck", "auto"]
    restart: unless-stopped

  db:
    image: postgres:17
    container_name: miniflux-db
    environment:
      - POSTGRES_USER=miniflux
      - POSTGRES_PASSWORD=YOUR_DB_PASSWORD
    volumes:
      - miniflux-db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "miniflux"]
      interval: 10s
      start_period: 30s
    restart: unless-stopped

volumes:
  miniflux-db:

And an .env file to keep the passwords out of the compose file:

POSTGRES_PASSWORD=pick_something_secure
ADMIN_USERNAME=yourusername
ADMIN_PASSWORD=pick_something_else_secure

Then start it:

docker compose up -d

Open http://your-ip:8085 in a browser and log in with the admin credentials. CREATE_ADMIN=1 only matters on the first run, so you can remove it afterward.

Connecting NetNewsWire

NetNewsWire syncs with Miniflux through the Google Reader API. In NetNewsWire, add a new account, choose “Google Reader Compatible,” and enter:

  • URL: http://your-ip:8085/reader/
  • Username: your Miniflux admin username
  • Password: your Miniflux admin password

From then on it syncs automatically across Mac, iPhone and iPad.

To add feeds, paste a website’s address into Miniflux, and it can find the feed on its own. Reddit has a feed for every subreddit: add .rss to the end, like https://www.reddit.com/r/selfhosted/.rss.

Filtering out the noise

Reddit feeds are noisy. For every interesting post on r/selfhosted, there are twenty asking for tech support or trying to sell something. So Claude Code and I built four filters:

  1. Miniflux’s own block rules drop entries in non-Latin scripts. On deal sites, they also drop anything matching words like “coupon” or “promo code.”
  2. A Python script spots the same URL showing up in several feeds. It keeps the original source’s copy and marks the Reddit or Hacker News copies as read.
  3. The langdetect library marks an entry as read when it’s at least 90% sure the title isn’t English.
  4. Claude Haiku, Anthropic’s smallest and cheapest model, reads all the unread Reddit titles in one batch. It flags tech support questions, buy/sell posts, “look at my setup” posts and other low-effort ones.

The AI filter makes the biggest difference. A typical run catches 25 to 30 low-quality entries. It costs fractions of a penny, because Haiku is cheap and the titles are short.

All four filters run as one Python script, which a macOS LaunchAgent starts every five minutes. (On Linux, a cron job does the same thing.) The script needs Python, langdetect and an Anthropic API key. When I open NetNewsWire, the feed is already filtered.

You don’t need all of this

Claude Code can handle nearly the whole setup, so your main job is picking feeds. (You can even ask it to help find some!) And you don’t even need the server. NetNewsWire with some free RSS feeds beats email newsletters and social media for staying informed. The filtering is the premium version.

I spent years letting my inbox and social media algorithms decide what I read. This is better.

For more projects like this, check the Building in Public page or subscribe to my newsletter.