I use RSS readers constantly. The problem I kept running into was that they are
stateless. Every day the same firehose, in the same order, with no memory of
what I cared about yesterday. I wanted something that actually got better over
time, ran on my own machine, and didn't require handing my reading habits to a
third party.
So I built CondenseIt.
What it does
CondenseIt is a self-hosted daily news digest. You point it at your sources, it
runs on a schedule, summarises everything using a local LLM, and serves the
results as a web app you can read in the browser.
Sources it supports out of the box:
- RSS and Atom feeds
- YouTube channels (via transcripts from the public channel RSS)
- Reddit subreddits
- Hacker News (top, best, new, ask, show)
- GitHub release feeds
- Google News searches (with operator support:
site:,when:,intitle:) - Website change detection (diffs the page content and treats meaningful changes as new items)
All of that is configured from an admin panel. No YAML editing required after
initial setup.
The LLM part
Summaries run through Ollama locally, Metal-accelerated on Apple Silicon. No
discrete GPU needed. I run it on a Mac Mini and it handles a daily digest of
50-80 articles without issues. If you prefer cloud inference, OpenRouter is
supported too, with budget limits so you don't accidentally run up a large bill.
The LLM is only used for summarisation. The ranking is a separate classical
scoring system.
How the re-ranking works
This was the most interesting part to build. Every article gets a score composed
of eleven signals:
- Keyword overlap with your liked/disliked term profile
- Bigram phrase matching
- TF-IDF cosine similarity against your content history
- Category and source averages from your past ratings
- Three implicit engagement signals: reading an article, saving it for later, and dismissing it
Explicit star ratings (1-5) drive the biggest updates to the profile. Implicit
signals are weighted at 0.5 by default so they contribute but don't dominate.
All rating contributions decay exponentially (default half-life: 30 days) so
stale preferences fade rather than accumulating forever.
The part I found most useful to add was a transparency panel. Every article card
has a collapsible "Why ranked here?" section that shows each signal as a
proportional bar. It made tuning the weights much easier and surfaced some
surprising things about my own reading habits.
Stack
- Python 3.11, FastAPI, SQLite
- React, TypeScript, Vite
- Ollama or OpenRouter for inference
- MIT license
Local setup is uv sync then condenseit serve. There's also a deploy script
for running it on a VPS with nginx and a systemd service.
What I'm looking for
The project is open source and I'm actively looking for contributors. Areas
where help would be most useful: new collector types, frontend and accessibility
improvements, test coverage, and Docker packaging. Good first issues are labeled
in the repo.
Repo: https://github.com/wildlifechorus/condenseit
Happy to answer questions about any of the implementation decisions in the
comments.
Top comments (0)