Projects

Olds

A news reader that finds non-obvious connections between stories across topics, then explains why those stories belong together.

Go FastAPI React sentence-transformers Supabase Docker

Why I built it

Growing up, I had a habit of reading only the newspaper sections that interested me each morning. Most news feeds make that kind of filtering even easier: once they know what you tend to read, they can keep giving you more of the same.

I built Olds around a different question. Could a personalized feed still help someone wander into another subject by showing the connection to a story they already care about?

How it works

Olds collects articles from NewsAPI and The Guardian every 30 minutes. A Python service extracts people, places, and organizations from each story and creates a sentence-transformer embedding. The Go backend combines semantic similarity with shared entities to build a directed graph of the articles.

When someone opens a story, the backend traverses that graph for related articles from other topics. It sends the matches to the browser over a WebSocket while an LLM writes a short, plain-English explanation of each connection. The result is less like a conventional “you may also like” row and more like a small piece of context beside the article.

Personal without ratings

The feed does not ask readers to train it with stars or thumbs. Instead, it learns from quieter signals such as dwell time, scroll depth, and whether an article is opened again.

I liked the tension in that design: the feed should notice what holds a reader's attention without making their world narrower. Cross-topic connections give the recommendation system a way to use familiarity as an entrance to something less obvious.

What I learned

Olds made recommendation feel less like a ranking problem and more like an explanation problem. Similarity alone can find two nearby articles, but shared entities make the relationship concrete, and a short explanation makes that relationship legible to the reader.

It also pushed me to connect several pieces as one running product: recurring ingestion, Python inference, an in-memory graph in Go, real-time updates, and a React interface backed by Supabase. The project is live at readolds.fyi.