DEV Community

Cover image for I created a news aggregator, and yes, it's better than the one you're using
Giulio
Giulio

Posted on

I created a news aggregator, and yes, it's better than the one you're using

I was tired of scrolling Facebook to knew about tech and AI news, and I was trying to install or use a RSS feeder, like FreshRSS or Miniflux for example, but there was always a problem (for example, settings too complicated).

So I built MeigRSS: a desktop RSS reader written in Rust and Svelte 5 that runs as a single binary, stores everything in a local SQLite file, and talks to whichever AI provider you already pay for, using your key, at your cost, with no subscription in between.

This post walks through what it does and, more importantly, where it is genuinely different from FreshRSS, Miniflux or Feeder.

Installation is one binary and no server

FreshRSS needs PHP and a web server. Miniflux needs PostgreSQL - there is no SQLite option. MeigRSS is an executable. You run it, it opens in your browser at localhost, and it creates a SQLite file next to itself. There is no database to provision, no web server to configure, no container to orchestrate, no reverse proxy, no certificates. SQLite is compiled into the binary, so there is nothing to install alongside it either.

Following sites that don't have a feed

Plenty of sites publish no RSS at all. FreshRSS solves this with XPath scraping: you open the developer tools, find the right nodes, and fill in five fields with expressions like //a[contains(@href, '/interesting/')]/ancestor::article. It is powerful and it works, but if you get a selector wrong you do not get an error - you get articles with garbage titles, and you go ask on a forum why.

MeigRSS takes a different bet: you paste the URL of the site and press Test. That's it. It reads the page, works out which links are articles by recognising the shape of their URLs, and tells you how many it found before you commit.

It recognises five date-based URL layouts observed across major publishers:

/2026/07/24/article-slug — zero-padded, the most common
/2026/7/24/article-slug — non-padded
/2026/jul/24/article-slug — three-letter month
/20260724-article-slug — compact date prefix
/2026-07-24/article-slug and /24-07-2026/article-slug — hyphenated

The trade-off is honest: this covers sites that put a date in the URL, which is most news sites and most blogs, but not sites with opaque slugs like /news/articles/c9370817nezo. XPath can theoretically scrape anything; this covers the common case with zero configuration. I chose the second, deliberately.

Web feeds work without paying for anything

Originally web feeds required a rendering API - a paid service that runs a headless browser so JavaScript-built pages can be read.

Now the default is a plain HTTP GET, which costs nothing and works on any server-rendered site. If a site builds its article list client-side with JavaScript, you can enable a rendering API per feed (Scrape.do, ScraperAPI, ScrapingBee and similar are supported) and only those feeds consume credits.

Free where possible, paid only where genuinely necessary.

AI summaries with your own key, no subscription

Every article can be summarised by an LLM. You choose the provider and paste your own API key:

Mistral (Small or Large) - the Small tier has a free plan that comfortably covers personal use
OpenAI
Anthropic Claude
Google Gemini

The comparison worth making: Feedly Pro+ with its AI assistant runs about $12.99/month, Inoreader Pro about $9.99/month, and NewsBlur's premium archive around $99/year. MeigRSS charges nothing and you pay the provider for exactly the tokens you use - which, for summarising a few dozen articles a day with a cheap model tier, is cents.

Summaries can be generated on demand or forced automatically per feed, so you can keep the expensive behaviour on the three feeds you actually read closely.

Your API keys are encrypted at rest

Most readers store third-party keys in plain text in a config file or in browser storage. MeigRSS encrypts them with AES-256-GCM before writing them to the database, with the encryption key held in a separate file with restrictive permissions, or supplied by you through an environment variable.

The key is decrypted in memory only when a request is actually made. It is never sent to the frontend - the settings page shows a masked value like sk-a...f456. That means the plaintext key exists in exactly two places: your clipboard when you paste it, and the backend process when it calls the provider.

Newsletters become articles

Some articles or news arrive by email rather than RSS. Hosted readers solve this by giving you a dedicated address - which means your newsletters pass through their servers.

MeigRSS imports .eml files directly. You export the email from your client, drop it in, and it becomes an article in your reader, rendered with its original HTML and images intact inside a sandboxed frame that cannot run scripts or reach the application's own API. Imported newsletters are automatically flagged as favourites so the retention policy never deletes them.

Full-text extraction for truncated feeds

Plenty of feeds ship two sentences and a "read more" link. Enable scraping on a feed and MeigRSS fetches the article page and extracts the readable content using Mozilla's Readability algorithm, the same approach behind Firefox Reader View. That full text is also what gets sent to the AI when you ask for a summary, so summaries of truncated feeds are actually based on the article rather than its teaser.

Retention instead of an archive

MeigRSS is built around a rolling window rather than a permanent archive. You choose how long articles live - anywhere from an hour to thirty days - and anything older is purged automatically. Anything you mark as a favourite is exempt and kept indefinitely.

This is a genuine design difference, not an omission. Hosted readers sell the permanent searchable archive as a premium feature; I wanted a reader that behaves like a newspaper rather than a library, and does not grow without bound on my disk.

The rest of it, briefly

Categories to organise feeds, with per-feed options for pausing, forcing AI summaries and enabling scraping.

Highlight words: define terms you care about and they are visually marked wherever they appear in titles and summaries.

Search across your stored articles.

Automatic refresh on a schedule you pick, or on demand.

Import and export in both OPML and JSON. OPML is the universal interchange format, so you can bring your subscriptions in from any other reader and take them out again whenever you like. JSON is the full-fidelity backup: it carries favourites, settings and per-feed configuration that OPML has no place for.

Six languages: Italian, English, French, German, Spanish and Portuguese.

Cross-platform: Windows, Linux and macOS, from the same codebase.

What it does not do

I would rather you find this out here than after downloading or installing.

There is no sync and no mobile app. This is the real difference with FreshRSS and Miniflux, which both speak the Google Reader API and therefore work with Reeder, NetNewsWire, FeedMe and most native clients. MeigRSS reads on the machine it runs on. If your phone is your primary reading device, this is not the tool for you today.

It is single-user. FreshRSS handles multiple accounts; this does not.

Web feeds need a date in the URL. Sites with opaque identifiers are out of reach by design.

Stack

Rust with Axum for the backend, Svelte 5 with SvelteKit for the frontend.

For all information about the project:

GitHub logo GiulioMagini / MeigRSS

MeigRSS is a local news aggregator with AI-powered summaries. It collects articles from configured RSS feeds, newsletter (EML files) and web feed (with external API or GET call from the program); extracts full text on demand, and generates summaries via AI APIs (Mistral, OpenAI, Claude, Gemini).

MeigRSS — Your personal news feed aggregator

MeigRSS is a local news aggregator with AI-powered summaries. It collects articles from configured RSS feeds, newsletter (EML files) and web feed (with GET request from the program or external API if the site blocks GET requests); extracts full text on demand, and generates summaries via AI APIs (Mistral, OpenAI, Claude, Gemini).

Tested on: Windows 11, Linux (Debian 13)

AI API tested with: Mistral (Small and Large). Other providers (OpenAI, Claude, Gemini) use standard API formats and should work without issues, but have not been explicitly tested.

Web Feed API tested with: Scrape.do. Other providers (ScraperAPI, ScrapingBee, Scrapfly, ZenRows) use the same API + URL formats and should work without issues, but have not been explicitly tested.

Full video explanation (in italian): https://www.youtube.com/watch?v=J4hxeypqo68

Last updated: July 2026


Features

  • RSS/Atom feed aggregation with manual and automatic updates
  • Automatic summaries from feed or generated by…

MIT License, open-source. If you are only insterested in the Windows exe file, you can check the release page (7z file).

In the README.MD file you can also find the youtube link to the explanation video.

Top comments (0)