The average reader engages with about 4% of the news they scroll past. The remaining 96% is duplication, noise, or algorithmically boosted outrage. That gap is the whole reason a well-built AI news aggregator still has room in the market — and thanks to modern tooling, it's now a weekend project instead of a quarter-long roadmap.
Here's the architecture that keeps showing up in successful indie news apps, plus a shortcut for shipping one fast.
The four layers you actually need
- Ingestion — NewsAPI, RSS, publisher APIs, GDELT.
- Understanding — embeddings, categorization, dedup.
- Ranking — hybrid: content + collaborative + recency decay + diversity.
- Presentation — reader mode, saves, offline, push, deep links.
Skip any layer and you have a directory nobody opens. Nail all four and you have a daily habit.
Reference tech stack
| Layer | Choice |
|---|---|
| Client | React Native + Expo |
| Feed API | NewsAPI + curated RSS |
| Storage | Postgres (Supabase) |
| Embeddings | OpenAI text-embedding-3-small
|
| Vector search | pgvector |
| Push | Expo Notifications |
| Offline | AsyncStorage |
Nothing exotic. The hard part is the product decisions, not the pieces.
Building it fast
The traditional way: npx create-expo-app, set up navigation, build 12 screens by hand, wire the API, add state management, style everything, then start on the ranker.
The 2026 way: describe the app in a prompt to an AI app builder (I've been using RapidNative for this kind of thing) and get a working Expo project as output — real code, exportable, no lock-in. Then hand-tune the parts that actually matter (the ranker, the sources, the cold-start UX).
A prompt that produces a strong first version:
Build a news aggregator app called Skim. Vertical feed of article cards with hero image, source logo, headline, summary. Top pill row for categories: For You, Top, Tech, Business, Science, Sports. Tap opens a reader-mode view with share, save, and "More like this." Bottom tabs: Feed, Search, Saved, Profile. Dark theme, pull-to-refresh, shimmer loading.
You get a working multi-screen app in about a minute, previewable on your phone via QR.
The recommendation engine
Once you have a live feed, add three ranking signals:
Content-based. Embed each article. Store a rolling user "taste vector" as the mean of embeddings of articles they read/saved/lingered on. Cosine-similarity a new article against the user vector. Solves cold-start well.
Collaborative. Once you have enough interaction data, "users who read X also read Y" is often stronger than pure text similarity — it captures fun, authority, contrarianism, things the text doesn't.
Recency + diversity re-ranking. Multiply scores by exp(-age_hours / half_life) with a 12–24h half-life. Then, when selecting the top N, penalize each candidate by its similarity to already-selected items. This is what stops the feed from becoming five versions of the same story.
Rough weights I've seen work: 0.4 * content + 0.3 * collab + 0.2 * recency + 0.1 * diversity. Tune with real data.
Cold-start UX matters more than ranker quality
The first five swipes decide whether a new user comes back tomorrow. Default to a strong editorial mix (top stories across categories) on session 1–2. Bring personalization online after session 3. Every good news app I've studied does some version of this.
The retention features people underinvest in
- Save-for-later with offline caching (people read on the subway)
- "Why am I seeing this?" per-story explainer
- Explicit topic mute/follow controls
- Weekly digest push or email
- Notifications capped at 3–5/day, gated on the user's taste vector
Copyright, briefly
Show headline + short summary + hero image + link back. Don't cache full article bodies at scale without a license. Reader mode is fine if fetched on-device (Instapaper pattern).
The full workflow
If you want to see this in action end-to-end, RapidNative turns the prompt above into a real Expo project you can extend. Free tier is 20 credits, no card. The exported code is standard Expo — you own it.
Happy to answer questions on the ranker specifics in the comments.
Top comments (0)