Sep 11, 2026 · 1 min
Building an aggregator that never looks broken
- nextjs
- data-fetching
- product
The news board is the part of this site I expect a skeptical engineer to click. That means it cannot be a happy-path demo.
Sources are fetched with Promise.allSettled. One dead RSS file does not take down the page. Each source records ok or error for a small health panel. If zero sources succeed, a checked-in fixture renders instead, and the UI says so in plain language.
Caching is boring on purpose: thirty minutes, stale-while-revalidate on the Route Handler, one getNews() function shared by /news and the homepage teaser.
Interactivity stays on the client because the list is small. Search, topics, sources, and sort write to the URL so a filter is a link you can send.
That is the whole feature. No summarizer. No accounts. Title, summary, link, and a page that still works when the internet does not.