← All projects

Sentinel Feed: An AI Tech Intelligence Radar

Cover Image for Sentinel Feed: An AI Tech Intelligence Radar

Sentinel Feed walkthrough

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.

Radar view

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.

Map view

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.

List view

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

Let's build something together.

Got an idea? I'm always up for a new challenge, whether it's a side project, a startup, or something in between.

© 2026 Cyrus David Pastelero. All rights reserved.

Built with Next.js, TypeScript & Tailwind CSS