Inspiration

I was tired of doomscrolling through endless news feeds and realized that staying informed shouldn't feel like a chore. We wanted to bring back the experience of morning radio briefings -- personalized, engaging, and consumable during your commute or morning coffee. The idea was simple: what if AI could be your personal news anchor, delivering exactly the news you care about in a podcast-style format you'd actually enjoy listening to?

What it does

Paperboy generates personalized audio news briefings in under 60 seconds. Users select their preferences -- news categories (tech, sports, general), style (NPR, BBC, Joe Rogan, etc), language, and even specific stock tickers -- and Paperboy delivers a professional-quality audio brief with:

  • Real-time news aggregation from trusted sources
  • AI-generated conversational scripts that cite sources naturally
  • Multi-voice narration with smooth transitions
  • Intro/outro music with professional mixing
  • Support for English, Spanish, French, Hindi

The entire experience feels like a custom podcast episode created just for you, every time.

How we built it

Tech Stack: Python FastAPI backend, Next.js frontend, OpenAI GPT-5 & 4o-tts-mini, ElevenLabs, Supabase, Langfuse observability, Docker.

Pipeline:

  • News Retrieval: Used newspaper3k to scrape articles from curated sources and yfinance for real-time stock data
  • AI Summarization: GPT-5-mini processes raw articles into conversational scripts with [switch_voice] markers for multi-voice narration
  • Text-to-Speech: Parallel generation using ElevenLabs and OpenAI TTS with intelligent provider fallback and voice rotation
  • Audio Production: pydub mixes TTS segments with intro/outro music and smooth fades
  • Delivery: Supabase storage hosts the final MP3, delivered via Next.js frontend with real-time status polling

We implemented intelligent caching (1-hour TTL) to reduce costs, rate limiting to prevent abuse, and comprehensive Langfuse tracing to track every stage's cost and latency.

Challenges we ran into

  • Provider reliability: TTS APIs would occasionally fail mid-generation. We built a robust fallback system (ElevenLabs → OpenAI) with per-chunk error handling and retries.
  • Natural voice transitions: Getting the LLM to consistently insert [switch_voice] markers at natural conversation breaks required extensive prompt engineering.
  • Cost control: Initial prototypes cost ~$0.30/brief. Through aggressive optimization (caching, model selection, prompt tightening), we reduced it to $0.05-$0.10.
  • Scraping resilience: News sites have inconsistent structures. We implemented graceful degradation—failed sources are skipped without breaking the entire brief.
  • Latency vs. quality: Balancing the 30-60s generation time with audio quality and content depth required careful tuning of article limits, TTS chunking, and parallel processing.

Accomplishments that we're proud of

  • 73% latency reduction in TTS through parallelization, from 60s sequential to 15-30s parallel
  • Multi-language support with provider-aware style instructions across 3+ languages
  • End-to-end observability: Every brief is fully traced with cost breakdowns, enabling rapid iteration

What we learned

  • Prompt engineering at scale: Small changes in system prompts had massive impacts on output quality and token usage (~15-20% swings)
  • Provider diversity is essential: No single API is 100% reliable; fallback mechanisms are table stakes
  • Observability pays dividends: Langfuse traces helped us identify and fix prompt bloat issues
  • User experience > technical perfection: Polling for status updates was simpler than WebSockets and perfectly adequate for 60s workflows

What's next for Paperboy

  • Personalization engine: Learn from user feedback and listening patterns to automatically tune content and style
  • Voice cloning: Let users upload their own voice or customize narrator personalities
  • Social features: Share favorite briefs, collaborative playlists, or team news digests

Built With

  • docker
  • elevenlabs
  • fastapi
  • gcp
  • langfuse
  • nextjs
  • openai
  • supabase
  • vercel
Share this project:

Updates