For the recommendations, I'm using the collaborative filtering implementation from Spark MLlib[1]. I model RSS feeds instead of individual articles: when you click an article, that counts as a "point" for that article's RSS feed; at recommendation time, the algorithm first selects an RSS feed to recommend, and then it picks one of the popular/recent articles from that feed. To counter popularity bias, I have a pre-ranking step that probabilistically filters out RSS feeds that have already been recommended a lot. I manually approve all RSS feeds before they're eligible to be recommended.
In addition to scrolling through the algorithmic feed, you can read articles chronologically on the subscriptions page, which I sometimes prefer when I have a larger chunk of reading time. There's also a daily digest email that lists new articles from your subscriptions; skimming that is part of my morning routine. I find the whole system gives me a nice balance between algorithmic filtering and manual control.
This is the culmination of the past four years I've spent as a full-time bootstrapped founder; Yakread both scratches a personal itch and attempts to fix various deficiencies that my previous businesses have had. In a nutshell, I've come to believe that "discovery is a feature, not a product," which is why Yakread is a full reading app instead of a standalone recommender system like my previous products.[2] From a business perspective, the recommendation algorithm is primarily intended to help onboard new users quickly/easily.
More ideologically, I think RSS is ready for a comeback :).
[1] https://spark.apache.org/docs/latest/mllib-collaborative-fil... -- I'm using the implicit feedback setting.
[2] Show HN for Yakread's immediate predecessor, The Sample: https://news.ycombinator.com/item?id=27664020. The Sample does bring in $1k or so per month, but long-term retention is too low for me to grow it sustainably.