A self-hosted reader that assembles your RSS feeds into finite, curated magazines — shaped by your interests, designed to end.
Most RSS readers dump everything into a single chronological stream. A prolific publication buries a small specialized blog. You feel overwhelmed, behind, and guilty about an ever-growing unread count.
Engagement-optimized ranking maximizes time-on-screen, not informed readers. You never feel done because there is always more. The infinite scroll is a feature for the platform, not for you.
You'd pick one up, read it, reach the last page, and put it down. You felt informed, not anxious. Nobody had engineered it to make you feel behind, or angry, or unable to stop scrolling.
Reading an Edition should feel like settling into a favourite chair with a good magazine — quiet, deliberate, finite.
Every edition has a cover, a table of contents, sections, and an ending. Navigate this demo with arrow keys, swipe, or the controls below.
Use ← → arrow keys, swipe, or click Prev / Next to explore
Section dividers signal a new topic — a visual breath before the next batch of reading.
Article layouts rotate between hero, editorial, and compact — so every page feels curated, not templated.
For the better part of a decade, the dominant paradigm in digital reading has been the infinite scroll. But a growing number of designers are questioning whether the stream ever served the reader at all.
Podcast episodes get their own layout — album art, a waveform, and prominent listen time.
And then it ends. That's the whole point.
Add RSS feeds for your favorite blogs and news outlets. Subscribe to podcasts too — they get a dedicated layout in the magazine view with album art and a waveform player.
Create topic areas — "Technology", "Climate", "Local News", whatever you care about. An on-device ML model reads every incoming article and classifies it into your focuses automatically. Nothing phones home.
Create edition configs — magazine templates with rules. Each section draws from a focus with its own budget. Source budgeting ensures no single prolific feed dominates.
| Section | Focus | Budget |
|---|---|---|
| Quick hits | Tech News | 5 articles, under 5 min each |
| Deep dive | Tech Policy | 20 minutes reading time |
| Indie voices | Favorite Blogs | up to 10 articles |
An on-device ML model classifies articles, generates embeddings, and learns from your votes. All of it runs in a worker thread on your server. Nothing phones home.
Every article is classified into your focuses using a local language model. No training data needed — just describe your topics in plain English.
Each article gets a 384-dimensional embedding vector, generated locally by MiniLM. This lets the system understand what articles are about, not just what words they contain.
Source budgeting ensures no single prolific feed dominates. That small independent blog gets a fair slot next to The Verge.
Upvote an article you enjoyed. Downvote one that missed the mark. That's it — two buttons, and the system starts learning. Your votes don't just affect the article you voted on. They propagate through semantic similarity to shape the ranking of hundreds of articles you haven't even seen yet.
A few votes on climate policy articles will shift the ranking of every similar piece across your feeds, focuses, and future editions.
No unread counts. No urgency signals. No red badges.
Every surface has a natural end. Being done is the feature.
Everything runs on your server. No data leaves. No analytics.
One SQLite file. Back it up, move it, delete it — you're in control.
One process, one database file, one Docker container. No external services, no cloud dependencies, no PhD required.
services:
editions:
image: ghcr.io/morten-olsen/editions:latest
ports:
- "3007:3007"
volumes:
- editions-data:/data
environment:
- EDITIONS_JWT_SECRET=change-me
restart: unless-stopped
volumes:
editions-data: docker compose up -d
Open localhost:3007 and register — the first account becomes admin.