rsspub is a self-hosted Rust application that turns your favorite RSS/Atom feeds/ Read Later articles into a personal daily newspaper (EPUB). It fetches articles, processes images, and bundles everything into an EPUB file that you can read on your e-reader or tablet.
It also serves an OPDS feed, making it easy to download the generated EPUBs directly to compatible readers (like KOReader, Moon+ Reader, etc.).
- Read It Later: Save articles to read later. It will created different EPUB for read later articles and marked as read once epub is generated.(Can be saved via web UI or post request via IOS shortcut or Android app http shortcut
- RSS/Atom Parsing: Automatically fetches and parses content from your configured feeds.
- EPUB Generation: Compiles articles into a well-formatted EPUB ebook.
- Image Optimization: Downloads and processes images for optimal e-reader viewing (grayscale, resizing).
- Web Interface: A simple web UI to manage feeds, schedules, and manually trigger generation.
- OPDS Catalog: Built-in OPDS server (
/opds) to browse and download generated EPUBs. - Email Delivery: Automatically send generated EPUBs to a configured email address.
- Latest Downloads Fetch the latest generated epub directly via (
hostname/downloads/latest_rss.epub) and (hostname/downloads/latest_readlater.epub) - Scheduling: Automated generation based on cron expressions.
- Authentication: Optional Basic Authentication to protect your instance.
- Performance: Built with Rust, Axum, and Tokio for high performance and low resource usage.
- Add email send option for Kindle
- Add basic Read it later feature.
- Add basic "Share" App to add read it later article for ios,android and browser extension.
- Make it multi-platform via Tauri or Dioxus
- Add user defined custom article extraction logic via
Scrapperdom_query crate- add deduplication logic for Custom Extractor
- add another option to fetch content from rss itself
- Add configuration for few of the hardcoded settings
- Cleanup unused/unnecessary features
- Refactor OPDS server according to the official spec.
- Rust (latest stable)
- (Optional)
libvipsif using themem_optfeature for optimized image processing.
-
Clone the repository:
git clone https://github.com/yourusername/rsspub.git cd rsspub -
Run the application:
cargo run
The server will start at
http://0.0.0.0:3000.
You can also run rsspub using Docker Compose.
- Make sure you have Docker and Docker Compose installed.
- (Optional) Create a
.envfile to configure environment variables:RPUB_USERNAME=your_username RPUB_PASSWORD=your_password SECURE_OPDS=false
- Run the application:
The server will start at
docker-compose up -d
http://localhost:3000.
Manual Build:
To build the Docker image manually:
docker build -t rsspub .To run the container:
docker run -p 3000:3000 -v $(pwd)/data:/app/db rsspub- Open the Web UI: Navigate to
http://localhost:3000in your browser. - Add Feeds: Use the interface to add the RSS/Atom feed URLs you want to follow.
- Generate EPUB: Click the "Generate" button (or configure a schedule) to create an EPUB from the latest articles.
- Download:
- Direct Download: Download generated EPUBs from the "Downloads" section in the UI.
- OPDS: Add
http://<your-server-ip>:3000/opdsto your e-reader's OPDS catalog list.
You can configure the application to automatically send generated EPUBs via email (e.g., to your Send-to-Kindle address).
- Gmail Configuration: Tested with
smtp.gmail.comon port587. - App Password: If using Gmail, you must use an App Password (your regular password will not work).
- Recommendation: It is recommended to use a temporary or dedicated email account for this feature, rather than your primary personal account.
You can configure the application using environment variables:
RPUB_USERNAME: Set a username for Basic Authentication.RPUB_PASSWORD: Set a password for Basic Authentication.SECURE_OPDS: Secure Download routes with Basic Authentication.
If these variables are set, the Web UI and API (except /opds) will require authentication.
You can save individual articles to be included in your next daily EPUB delivery.
Web UI:
- Go to the "Read Later" tab.
- Paste the article URL and click "Add".
Android Integration (HTTP Shortcuts): You can easily add articles from your Android phone using the HTTP Shortcuts app.
- Install the "HTTP Shortcuts" app.
- Create a new shortcut:
- Name: Add to rsspub
- Method: POST
- URL:
http://<your-server-ip>/read-it-later - Body Type: JSON
- Body Content:
{ "url": "{share_text}" } - Note:
{share_text}is a variable that will be replaced by the URL you share.
- Authentication (if enabled):
- Go to "Authentication" section of the shortcut settings.
- Select "Basic Authentication".
- Enter your
RPUB_USERNAMEandRPUB_PASSWORD.
- Usage:
- When browsing an article in Chrome or any app, tap Share.
- Select HTTP Shortcuts.
- Select your Add to rsspub shortcut.
Added sample rsspub_http_shortcuts.json which can be imported in the app.
IOS Integration (Inbuild Shortcut):
rsspub supports three content extraction methods for fetching full article content. You can configure the extractor per feed in the UI.
| Extractor | Description |
|---|---|
| Default | Uses dom_smoothie crate with Readability algorithm. Best for most websites. Automatically extracts the main article content. |
| DomSmoothie | Uses dom_smoothie crate's native extraction logic. Alternative to Readability that may work better for certain sites. |
| Custom (Experimental) | CSS selector-based extraction. Allows you to define custom selectors to extract content and discard unwanted elements. |
For sites where automatic extraction doesn't work well, you can define custom CSS selectors using YAML format:
selector:
- '.article-content'
- '.post-body'
- 'article'
discard:
- '.ads'
- '.sidebar'
- '.comments'
- '.social-share'
output_mode: htmlFields:
selector(required): Array of CSS selectors to extract content from. The extractor will use the first matching selector.discard(optional): Array of CSS selectors for elements to remove from the extracted content.output_mode(optional): Output format -html(default) ortext.
Domain Override allows you to set a custom content processor for a specific domain. This applies to both RSS feed articles and Read It Later articles.
Use Case: This is particularly useful when a feed contains links to multiple external URLs. For example:
- HackerNews - Links to various external sites
Configuration:
- Go to the "Domain Overrides" section in the UI.
- Add the domain with subdomain (e.g.,
www.example.com,subdomain.example.com). - Select the processor type (Default, DomSmoothie, TextOnly, or Custom).
- Optionally provide a custom configuration (YAML format) for the Custom processor.
When processing an article, rsspub will check if a domain override exists for the article's URL and use the configured processor instead of the feed's default.
For better memory usage during image processing (recommended for low-memory devices), you can enable the mem_opt feature (requires libvips installed on your system):
cargo run --features mem_opt
- Calibre: Calibre also has a "Fetch News" feature that can download RSS feeds and convert them to EPUB/MOBI. It is a desktop application, whereas rsspub is designed to run as a server.
- KindleEar: KindleEar is a Calibre port that runs on web to aggregate RSS feeds and send them to your Kindle.(https://github.com/harshit181/KindleEar minor code change to enable opds server)
- Backend: Rust (Axum, Tokio)
- Database: SQLite (Rusqlite)
- Frontend: Static HTML/CSS/JS served by Axum
- Image Processing:
imagecrate (default) orlibvips(optional)


