Skip to content
Colin M. Skinner, PhD

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.