My Projects

Frust

Moving away from Feedly meant choosing a self-hosted replacement. Every option — Miniflux, FreshRSS, Tiny Tiny RSS — runs as a persistent web service: a port to expose, a database to back up, a daemon to restart after a kernel update. The filtering features I wanted were locked behind a paywall anyway. Frust started as a Feedly clone, then the obvious question surfaced: why run a service at all? An RSS aggregator just fetches URLs and produces files. Run it from cron, write static files, serve them with whatever HTTP server is already running. No port, no database, no daemon.

Features

Use cases

Offline reading on an e-reader. Group a week of long-form blogs into a single EPUB and side-load it onto a Kindle or Kobo. No connection needed after the sync — read on a plane, in the garden, anywhere.

Clean up ad-heavy tech feeds. Publishers mix editorial content with sponsored posts. A keep: false filter on “sponsored”, “advertisement”, “partner” strips them from the output before your reader app ever sees them.

Recover full articles from truncated feeds. Some publishers deliberately cut off their feeds to force web visits. The selector option fetches the source page and injects the full article body into the feed entry — your reader gets the whole thing.

Home router or NAS. The ARM MUSL binary has no runtime dependencies — drop it on an always-on OpenWrt router, Raspberry Pi, or NAS. Set a cron job pointing at an output directory served by the device’s built-in HTTP server.

Bookmark manager integration. Use feed enrichment to inject a “Save to Shiori” button into every article, pre-filled with the article URL and title. One click from any feed reader client that renders HTML.

Comparison

Miniflux, FreshRSS, and Tiny Tiny RSS are full readers — they include a web UI, user accounts, and read-state tracking. feedpushr is a backend aggregator that pushes items to external endpoints. frust is closest to feedpushr in role (no reader UI), but writes static files instead of pushing to a live destination.

frustMinifluxFreshRSSfeedpushr
No persistent service (cron-only)
No database required❌ PostgreSQL❌ MySQL/SQLite❌ BoltDB
Static file output
EPUB export
Regex/keyword filtering
Full-text extraction✅ CSS selector✅ XPath✅ filter plugin
Push to webhooks / external APIs
Web UI / read-state tracking
ARM fully static binary✅ MUSLPartialPartial (AMD64 plugins only)

The absence of a web UI is intentional: frust writes standard feed files consumed by any client — Reeder, NetNewsWire, Fluent Reader, or a self-hosted Miniflux instance pointed at the static files.

Installation

cargo install frust

Cross-compile for ARM devices (routers, NAS, single-board computers):

rustup target add armv7-unknown-linux-musleabihf
cargo install cross
cross build --release --target armv7-unknown-linux-musleabihf
# static binary at target/armv7-unknown-linux-musleabihf/release/frust

Typical cron entry (every 30 minutes):

*/30 * * * * /usr/local/bin/frust /etc/frust/config.yaml >> /var/log/frust.log 2>&1

Repo