One frustration and one unexpected insight from the RSS service
#I spent more time working on rss-triage this weekend. One thing was frustrating but ultimately helpful, and one thing was a great outcome I didn’t think about going in.
The frustrating thing was having to abandon “did I read this” as a scoring signal. It seems like a good idea to include it, but:
First, feed readers are pretty annoying if you’re trying to measure read state, because it’d be a complex problem to solve for very little payoff unless your reader’s whole project is “help people figure out what’s worth reading,” and almost none of them do make that their project. There’s been this little ripple through the “people who like RSS” world calling out the stale state of RSS reading (“they all look like mail readers”) and none of the “looks like a mail reader” development community seems to have thought “what would the built-in spam filtering of a mail reader look like in an RSS reader?” They just think “did you glance at it? I’ll pass that back to the feed backend so you don’t see it a second time on another client somewhere.”
Readwise Reader kind of does solve this – it tracks how far down an article you’ve scrolled. That could be a great signal but then you’re using Readwise Reader.
Second, I end up reading things in other places: From Linkding, from Linkwarden, in Wallabag, just opening the link in a browser. They mostly have some variant on “read” or “unread,” but they generally require a manual toggle. So tracking what I read and didn’t requires manual interventions.
So with some disappointment I yanked was_read out of the feed scoring pipeline, and I’m down to “did I star it, did I skip it, or did a rule I created block it?” Those are all at least clear behavioral signal that an be combined to suggest the future success of a given feed from past behavior. was_read would have been, too, but I’m not ready to create an entire RSS reader of my own to give myself more guarantees.
And I still have the inference-driven stuff to help auto-triage: Given much firmer behavioral measures, the inference layer is getting stronger signal about the reputational thumb it should put on the article scoring scale. It is also doing a good job with my more subjective, inference-friendly nudges: Project version bumps, crime stories, headlines that make it hard to figure out the subject, etc. all get downweighted.
Finally, I have the topic surge filtering layer: Work requires me, for instance, to keep up with the latest in Gemini. It doesn’t require me to read 20 separate press release rewrites from my Google News search feed.
So … is it working?
Yeah, I would say it is. I’ve got a few tabs in the UI that let me go in and see what inference has ruled out, and I am disagreeing with it less and less. The past few days I just scroll down the reject pile and hit the big red “dismiss them all” button instead of overriding any of them.
I’ve been cautious about letting it recommend, though. As eager as I am to filter out dead wood (anything scoring below 3/10) I won’t let it promote anything below 7/10, and it hasn’t suggested much yet. Makes sense. I’ve spent more time telling it what I don’t like than what I do like, so there’s not much for inference to dig in on to start filling in the high end of curve.
Oh, right. So the unexpected part:
Nothing that unpleasant, really. As I’ve been working on the pipeline tuning parameters, I’ve been in a validation cycle of “tweak -> rescore -> review.”
The tool gives me a categorized list of all my feeds along with an attention score for each, based on how many articles from that source that the system has seen, how many I have starred, how many I have skipped, some recency calculations, and a Bayes smoother that takes its time judging lower volume feeds but gets more opinionated with higher volume ones faster. To pick on The Oregonian again:
- 765 articles seen in the 14-day window
- 307 dismissed (which means 458 hit a filter)
- 41 starred (deemed interesting) for a 5% “star rate.”
- 24 attention score
… or Hacker News:
- 414 seen
- 326 dismissed (88 hit a filter)
- 51 starred, for a 12% star rate
- 29 attention score
… or Daring Fireball
- 82 seen
- 67 dismissed
- 5 starred, for a 6% star rate
- 33 attention score
… or Jacobin:
- 78 seen
- 46 dismissed
- 30 starred, for a 38% star rate
- 52 attention score
I’ve made it easy to get those numbers because I’m still tuning the pipeline and figuring out the assorted weights, but ideal steady state is “I have no idea what those numbers are any more, I just know I see a lot of good things and far fewer bad things; and also I argue with the inference layer less in review.”
Anyhow … what is interesting to me is that I have 60 feeds running through this system, and by introspecting this system a lot, I’ve been forced to see how much of them I actually care to read vs. what I don’t. That has caused me to realize that a lot of my feed list is probably either coming from habit or aspiration, not active interest. Always worth sitting with.