← All projects
ReactLLM / GroqServerlessFastAPIMongoDB

InboxZing: the news, in whatever voice you want

A personalized news app built by a 4-person team: pick your outlets, pick a summary style — from ELI5 to poetry — and an LLM rewrites your feed to match, while points and streaks turn reading into a habit. I re-architected it from a full-stack deployment into a serverless demo that costs nothing to keep alive.

Live demo launching soonView on GitHub

6

summary voices — Brief, Detailed, ELI5, Humorous, Storytelling, Poetic

12

live news outlets in the demo, ingested via RSS with zero API keys

$0

monthly cost to keep the demo running — static site + serverless functions

One feed, six voices

The signature feature: every article in your feed is rewritten by an LLM in the style you chose during onboarding. The prompts are engineered per style and post-processed to strip the "Here's a summary…" boilerplate small models love.

BriefDetailedELI5HumorousStorytellingPoetic

The original architecture

Client

React + Tailwind

Card-based feed, preference wizard, profile with stats, points with confetti, streaks, dark mode.

API

FastAPI + MongoDB

Auth, preferences, feed caching per user, gamification state, and GridFS-stored podcast audio.

Services

NewsAPI · Groq · OpenAI · SendGrid

Headlines in, LLM summaries out — plus TTS podcasts and scheduled email digests.

Re-architecting for a living demo

Class-project deployments die when the semester's credits run out. To make InboxZing permanently usable, I rebuilt its runtime around what a static host gives away for free — while leaving the original codebase intact:

  1. 1

    Emulate the backend, don't rewrite the frontend.

    A ~250-line fetch interceptor implements the FastAPI routes' exact HTTP contract in the browser — accounts, points, streaks, and read-state live in localStorage. Every original component runs unmodified.

  2. 2

    Swap paid dependencies for free equivalents.

    NewsAPI's free tier is localhost-only, so the demo ingests outlet RSS feeds directly (parsed in a Netlify function, cached warm). MongoDB became localStorage. The podcast degrades gracefully to the app's own "not available" flow.

  3. 3

    Batch the LLM work to fit a free tier.

    Instead of one Groq call per article, the whole feed is summarized in a single JSON-mode request — ten summaries per call keeps the demo comfortably inside free rate limits, with article snippets as the fallback if the model is unavailable.

The full app, the demo layer, and both architectures live in the repo.

komalnpn/InboxZing →