
The problem
Staying current as a developer means cycling through the same seven sites every morning: Hacker News, GitHub Trending, Lobsters, Dev.to, daily.dev, Techmeme, and InfoQ. It is repetitive, it is noisy, and the genuinely important stories (a new CVE, a zero-day, a breaking framework release) get buried under the same recycled hot takes.
I wanted one screen that consolidates all seven sources, deduplicates the overlap, ranks by real community signal, and surfaces anything security-critical before it costs me a production incident.
What I built
Sentinel Feed fetches from all seven sources in parallel every 15 minutes, normalizes them into a common shape, auto-categorizes each story into one of six topic sectors, and scores it by community signal. Critical stories (CVEs, vulnerabilities, breaches) are detected and flagged automatically. Optional one-line AI summaries are generated with Claude Haiku. The whole thing is free, open source, and requires no API keys for any of the sources.
The same data renders three ways depending on how you want to scan it.
Radar view
Stories plot as dots inside six topic sectors. Higher score means closer to center and a larger dot. Critical stories pulse red with a glow, and a rotating sweep line plus a CRT scanline overlay complete the tactical aesthetic.

Map view
All six sectors visible at once, each showing its top stories with source badges, AI summaries, and scores. Hover any story for a full-detail tooltip, click a sector to drill into the list.

List view
A traditional feed sorted by score, with topic tabs and full cards: title, AI summary, source badge, author, relative time, tags, and score.

Tech stack
| Layer | Technology | Why |
|---|---|---|
| Framework | Next.js 16 | App Router, server-side aggregation routes |
| Language | TypeScript | Type-safe normalization across 7 source shapes |
| Summaries | Claude Haiku | Fast, cheap one-line story summaries |
| Styling | Tailwind CSS | Rapid iteration on three distinct views |
| Hosting | Vercel | Cron-triggered fetches, edge caching |
Sources
Each source has its own quirks: Hacker News and GitHub expose clean APIs, Lobsters and Dev.to offer JSON endpoints, daily.dev needs GraphQL, and Techmeme and InfoQ only publish RSS. They are fetched in parallel with independent error handling, so one source failing never blocks the others.
| Source | Data | Signal |
|---|---|---|
| Hacker News | Top 30 stories via Firebase API | Upvotes |
| GitHub Trending | Trending repos in TS, Python, Go, Rust | Stars gained |
| Lobsters | Top 25 stories via JSON API | Upvotes |
| Dev.to | Top 30 articles of the day | Reactions |
| daily.dev | Top 25 posts via GraphQL | Upvotes |
| Techmeme | Latest stories via RSS | Recency |
| InfoQ | Latest articles via RSS | Recency |
What building this taught me
Normalization is the real work
Seven sources means seven different ideas of what a "story" is. One returns Unix timestamps, another ISO strings, another relative ages. Scores range from raw upvote counts to reaction tallies to "stars gained today." The interesting engineering was not the views. It was designing one normalized shape that holds up well enough that the radar, map, and list never need to know where a story came from.
Critical detection beats ranking
Pure score ranking buries security news, because a CVE rarely gets the upvotes of a flashy launch. Adding a dedicated keyword and pattern pass for CVEs, vulnerabilities, zero-days, and breaches (then surfacing those regardless of score) changed the feed from "interesting" to "actually useful before something breaks."
One dataset, three lenses
Building three views over one normalized dataset reinforced how much the right visualization changes perceived value. The radar is for glancing, the map is for scanning by topic, the list is for reading. Same data, three jobs.
Links
- Live: sentinel-feed.pastelero.ph
- GitHub: sentinel-feed