news-flash
The core library powering NewsFlash, a modern feed reader for the GNOME desktop. This crate handles feed synchronisation, article management, local storage, and service integration — everything below the UI layer.
Overview
news-flash provides a unified, async Rust API that abstracts over multiple feed service backends. Whether you self-host a FreshRSS instance or subscribe through Feedly, this library normalises the data into a single set of models and persists it in a local SQLite database.
Key capabilities
- Multi-backend sync — log in, sync, and manage feeds through any supported service with a single
FeedApitrait - Local RSS/Atom — subscribe directly to feeds without any external service
- Offline mode — queue read/star/tag actions while offline and replay them on reconnect
- OPML import & export
- Favicon discovery — automatic favicon scraping and caching
- Article scraping — optional full-text extraction via
article_scraper(feature-gated) - Image downloading — optional offline image caching for articles (feature-gated)
- Thumbnail extraction — download and cache article thumbnail images
Supported backends
| Service | API crate | Notes |
|---|---|---|
| Local RSS/Atom | — | Built-in, no account required |
| Feedbin | feedbin_api |
|
| Feedly | feedly_api |
only available if API secrets are provided in the build process |
| Fever | fever_api |
Compatible with Fever-compatible services |
| FreshRSS | greader_api |
Via Google Reader API |
| Inoreader | greader_api |
Via Google Reader API |
| Miniflux | miniflux_api |
|
| NewsBlur | newsblur_api_updated |
|
| Nextcloud News | nextcloud_news_api |
|
| Commafeed | commafeed_api |
Cargo Features
| Cargo feature | Default | Description |
|---|---|---|
article-scraper |
✅ | Full-text article extraction using readability-style content scraping |
image-downloader |
— | Download and cache article images for offline reading |
Usage
Add the dependency to your Cargo.toml:
[]
= "3.0"
Basic example
use ;
// List available backends
let backends = list_backends;
// Build an instance
let nf = builder
.plugin
.config_dir
.data_dir
.create?;
// Or restore from a previously configured session
let nf = builder
.config_dir
.data_dir
.try_load?;
Adding a new backend
A detailed guide lives in docs/integrate_new_service.md. The short version:
- Create (or find) a standalone API crate for the service
- Copy
src/feed_api_implementations/template/and implementApiMetadata+FeedApi - Register the new backend in
src/feed_api_implementations/mod.rs - Add tests