Daybreak
I wanted a morning reading habit that gave me the context behind the headlines and a reason to stop scrolling.
I built a private daily brief that collects news and groups related coverage. A separate reading feed turns books into short ideas with examples and caveats.

how it works
- RSS and institutional feeds feed a Python pipeline that extracts articles, removes duplicates, and clusters related reporting.
- The Next.js app serves the daily edition alongside full-screen news and book feeds, with reading progress and saved items.
- SQLite stores briefs and reading state. Systemd timers handle collection, retries, and weekly recaps.
decision
Every generated brief has to pass checks written in code before it is published: quotes must appear word for word in the source, links must point to articles the pipeline collected, and numbers must match the reporting. A model reviewer runs after those checks.
what went wrong
With no holdings entered, the first live brief still included a market note about a fund I do not own. That note is now written by code whenever the holdings list is empty.
outcome
It runs on my homelab: the morning pipeline on the X1 and the reading app on Nexus. News and books share a searchable archive and saved reading history.
Next.js, TypeScript, Python, SQLite / FTS5, Drizzle, Claude, Docker, systemd
Screens and a walkthrough
Read the news with context, then pick a book.
0:27 · silent, with on-screen explanations
read the walkthrough
- Start the daily brief. Start with a short overview of the day’s stories and your reading goal.
- Read one story. Each card leads with what happened and why it matters. Scroll for the next story.
- Get the context. The daily edition puts the explanation, unfamiliar terms and sources together.
- Choose a book. Switch to the library and open a book. The same app keeps your reading progress.