3.8 KiB

RSS Bundler

RSS Bundler is a Rust program that allows you to combine multiple RSS feeds into one. An instance of RSS Bundler for the members of the GEORGE webring is currently hosted at


The binary takes only one argument: a path to the config file. The resulting feed is located at /rss.xml.


The config file is written in JSON. The following fields are required:

Field Description
title The feed's title
link A link to the feed's website
users A list of users. Each user must have a name field containing the user's name and a rss field with a link to an RSS feed.

The following fields are optional:

Field Description Default value
description The feed's description Empty
default_title Title to use for posts that do not have a title field <untitled>
refresh_time Minutes to wait between fetching RSS feeds 60 (one hour)
status_page Generate the status page (see below) true
title_format Format for post titles. Use {name} for the user's name and {title} for the original title. [{name}] {title}
worker_threads Number of threads to spawn for the web server. 4
port Port number for web server 4400
host Host for web server
hook Path to hook to run upon recieving new blog posts ./

Here is an example configuration:

    "title": "Example bundle",
    "description": "Demonstration of RSS Bundler",
    "link": "",
    "refresh_time": 30,
    "title_format": "({name}) {title}",
    "worker_threads": 2,
    "port": 5000,
    "users": [
        { "name": "trimill", "rss": "" }


Every time a new post is loaded, the hook program (if specified) will be executed. This is based on GUIDs, so feeds that do not fill the guid field will not trigger hooks. The following environment variables will be set:

  • TITLE - the original title of the post
  • TITLE_FMT - the formatted title of the post
  • AUTHOR - the post's author
  • LINK - the link to the post
  • GUID - the post's GUID
  • PUB_DATE - the post's publishing date

Status page

RSS Bundler also generates a status page, available at /status. This page shows the last date a feed was fetched and parsed successfully and, if the last try was erroneous, the error that occured. If an error occurs while fetching or parsing a feed, the last good version will be used instead.