rss
rss
is the latest installment in my series of small bespoke services
I have written for myself. It looks like this:

rss
is a list of recent feed items.The front page shows the 20 most recent items from ~70 feeds. Items are marked as read/unread shown by the blue dot to the left. This is clickable, and toggles between the two states.
The feed title is also clickable which takes you to the feed detail view.
This lists recent items for that feed, and it shows some data for the feed, like the URL.
I can also set an alias for the feed, which is then used instead of the feed title;
for instance, the title of Chris Wellon's feed is "null program"
, and I aliased it to "Chris Wellons"
.
The stack is the same as always: htmx
for interactivity, maud
for templating, and
sqlite
for storage. Built and deployed in docker
.
I started fetching real feeds early on, and almost immediately I got 429'd by rachelbythebay's feed.
I was kinda aware of her writing on shitty RSS feed bot behavior, and all of a sudden I was part of the problem.
Sorry, Rachel! (and others, whose bandwidth I wasted)
Now I send both ETag
s and If-Modified-Since
s,
and poll once a day at a random time in between 01:00 and 07:00. Well, that was
my intention anyways, but seems I got tricked by timezones, so the polling
times is in UTC, whereas I probably wanted the times to be local time, since
I'm usually asleep then, but probably awake before 09:00.
I have not changed the User-Agent
, so whatever ureq
does by default is what I'm sending.
I assume I'm supposed to set some kind of unique name for the reader and some contact info, but am not sure of exactly what the format is like.
MDN contains this example:
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
I assume there's some common format for this, but haven't looked more into it yet.
Some things that need improvement:
-
Datetime parsing: Not all feeds follow what seems to be the spec-mandated datetime format. One feed uses
"Wed, 09 Apr 2025 04:48:38 UTC"
, and these entries are simply ignored for now. Should be possible to add in some exceptions to the datetime format as these crop up. -
I use
tokio::spawn
for tasks that awaitssleep_until
and then fetches the feed again, and then it basically recurses. This works, but I'm flying blind since there's no apparent way of confirming that all tasks are still active. If a task panics (for instance by having the request time out), it will not be re-ran. I put some logging statements around this part of the code so that I can check what's going on from the logs, but with around 70 feeds this is a fair amount of spam. -
Some missing nice-to-have functionality, like deleting feed items or removing a feed. Deleting items is useful for feeds that change the entry ids all of a sudden. blog.rust-lang.org changed its format from
https://blog.rust-lang.org/2025/04/08/Project-Goals-2025-March-Update.html
to
https://blog.rust-lang.org/2025/04/08/Project-Goals-2025-March-Update/
, causing double entries in my feed. Would be nice to delete the double entry, but items are quickly bumped off of the front page anyways. -
No error checking on the htmx side, so nothing happens if an endpoint returns a 429 or 500. Having something here would make life slightly easier, for instance all those times where I accidentally paste in the URL to a blog instead of to its feed.
Like with ppl
I'm happy with the result, and unlike ppl
, I use rss
basically every day.
It's fun using something you've made yourself, for yourself!
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License