HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
jacobobryant
yakread
Clojure2025–2025
jacobobryant / yakread

yakread

Code for https://yakread.com

2Distinct people
3Mentions
0Explicit recommenders
33GitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

Code for https://yakread.com

GitHub

Where it is used

No documented product use has been verified yet.

What people are saying

No recommendation phrase was found in the indexed comments.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

No other repository is repeatedly linked in the same discussions.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 3:56:07 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by week3 dated mentions

Observed mentions: 2025-04-12 12:55:58 UTC to 2025-08-24 03:34:02 UTC. Weeks start Monday, UTC.

0122025-04-07 00:00:00 UTC to 2025-04-14 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 commentsApr 72025-04-14 00:00:00 UTC to 2025-04-21 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-04-21 00:00:00 UTC to 2025-04-28 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-04-28 00:00:00 UTC to 2025-05-05 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-05-05 00:00:00 UTC to 2025-05-12 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-05-12 00:00:00 UTC to 2025-05-19 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-05-19 00:00:00 UTC to 2025-05-26 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-05-26 00:00:00 UTC to 2025-06-02 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-06-02 00:00:00 UTC to 2025-06-09 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-06-09 00:00:00 UTC to 2025-06-16 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 commentsJun 92025-06-16 00:00:00 UTC to 2025-06-23 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-06-23 00:00:00 UTC to 2025-06-30 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-06-30 00:00:00 UTC to 2025-07-07 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-07-07 00:00:00 UTC to 2025-07-14 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-07-14 00:00:00 UTC to 2025-07-21 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-07-21 00:00:00 UTC to 2025-07-28 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-07-28 00:00:00 UTC to 2025-08-04 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-08-04 00:00:00 UTC to 2025-08-11 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-08-11 00:00:00 UTC to 2025-08-18 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-08-18 00:00:00 UTC to 2025-08-25 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 commentsAug 18

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
Apr 72025-04-07 00:00:00 UTC2025-04-14 00:00:00 UTC202
Apr 142025-04-14 00:00:00 UTC2025-04-21 00:00:00 UTC000
Apr 212025-04-21 00:00:00 UTC2025-04-28 00:00:00 UTC000
Apr 282025-04-28 00:00:00 UTC2025-05-05 00:00:00 UTC000
May 52025-05-05 00:00:00 UTC2025-05-12 00:00:00 UTC000
May 122025-05-12 00:00:00 UTC2025-05-19 00:00:00 UTC000
May 192025-05-19 00:00:00 UTC2025-05-26 00:00:00 UTC000
May 262025-05-26 00:00:00 UTC2025-06-02 00:00:00 UTC000
Jun 22025-06-02 00:00:00 UTC2025-06-09 00:00:00 UTC000
Jun 92025-06-09 00:00:00 UTC2025-06-16 00:00:00 UTC000
Jun 162025-06-16 00:00:00 UTC2025-06-23 00:00:00 UTC000
Jun 232025-06-23 00:00:00 UTC2025-06-30 00:00:00 UTC000
Jun 302025-06-30 00:00:00 UTC2025-07-07 00:00:00 UTC000
Jul 72025-07-07 00:00:00 UTC2025-07-14 00:00:00 UTC000
Jul 142025-07-14 00:00:00 UTC2025-07-21 00:00:00 UTC000
Jul 212025-07-21 00:00:00 UTC2025-07-28 00:00:00 UTC000
Jul 282025-07-28 00:00:00 UTC2025-08-04 00:00:00 UTC000
Aug 42025-08-04 00:00:00 UTC2025-08-11 00:00:00 UTC000
Aug 112025-08-11 00:00:00 UTC2025-08-18 00:00:00 UTC000
Aug 182025-08-18 00:00:00 UTC2025-08-25 00:00:00 UTC101

What Hacker News says

3 sources
I've been working on this kind of thing over the past several years (for a while full time as an attempted entrepreneur, now on the side for the past couple years). The latest iteration is https://yakread.com -- hit "take a look around" and you can see the "home page"/a list of recommendations without signing up. The recommendations are personalized, i.e. the probability you'll see any particular post depends on your individual interactions with past posts, if you've signed up. (it does collaborative filtering with spark mllib). So that may be a bit different from what you had in mind, since your comment sounds more like an unpersonalized system, but with some extra exploration thrown in. However in practice I suspect the biggest thing the collaborative filtering is doing at Yakread's current scale (not much) is learning which items are g
Read the rest
ood/bad in general. I also do have some methods baked in for doing exploration. "Epsilon greedy" is a common simple approach where x% of the recommendations are purely random. I do a bit more of a linear thing where I rank all the posts by how many times they've been recommended, then I pick a percentage 0 - 100, then I throw out the top x% most popular (previously recommended) items. that also gives you some flexibility to try out different distributions for the x% variable. The source is at https://github.com/jacobobryant/yakread
In Libre – An anonymous social experiment without likes, followers, or ads
Hm, I was curious about the biased shuffle, since I was not expecting that particular shape. It looks like we basically build up the list of bookmarks as follows [0]: x = rand() if x < p: element = first element else: element = random element return [element] + shuffle(rest of list, according to the original order) In some sense, it's reminiscent of selection sort. Any particular reason for choosing this approach? One "obvious" downside is that this ends up being an O(n*k) algorithm because you end up building a new list each iteration. It's also harder for me to intuitively understand how shuffled the list is based on the parameter, other than at the two extremes. [0] https://github.com/jacobobryant/yakread/blob/bff756c68d86a07... I'm also curious about the interleaving approach described in the last section:
Read the rest
> If you’ve already scrolled past all your unread bookmarked items several times but you have a bunch of new subscription items, we should probably lean towards recommending the subscription items. > I do this by comparing the two lists pairwise and selecting an item via weighted random choice based on how many times they’ve been previously skipped (i.e. scrolled past in the For You feed). e.g. if the first bookmark item has been skipped twice and the first subscription item has been skipped once, then there’ll be a 40% chance we select the subscription item and a 60% chance we select the bookmark item. I thought we wanted to prefer the item that hadn't been skipped as many times (so, prefer the subscription item)?
In Yakread's Ranking Algorithm
It's a fun part of the code to work on for sure :). I started trying out datastar in another part of the app by the way, mostly for the frontend signals so far e.g. https://github.com/jacobobryant/yakread/blob/8a61443235d1f6f... Since this app isn't collaborative it's not clear to me if there'd be any benefit of doing any long-lived SSE vs. just sticking with the request-response model I'm already doing with htmx. Also since various parts of the app do take 100 - 1000ms to render/query, so rerendering the whole page on any change I don't think would be a good fit. But even just having the signals part baked in is pretty nice.
In Yakread's Ranking Algorithm

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.