How We Built a Personalized AI Morning Brief for Under $50/Month
A behind-the-scenes look at how Daily Dose was built using Claude Haiku, Next.js, Python, Railway, Supabase, and Resend — and what it actually costs to run.
How We Built a Personalized AI Morning Brief for Under $50/Month
Last spring I had a simple problem: I was spending 40 minutes every morning opening apps. Weather. Markets. ESPN. Twitter. News. By the time I finished my "morning routine," my coffee was cold and I'd already burned through my best mental energy on other people's content.
I wanted one email. My email. Personalized to what I actually care about. Delivered before I woke up.
I couldn't find it, so I built it. This is how.
The Idea
The concept is straightforward: every morning at whatever time you choose, you get a single email that covers your stuff. Your stocks. Your teams. Your local weather. Your preferred news topics. Not a generic newsletter someone else curated — a brief that's genuinely yours.
I called it Daily Dose.
The hard part isn't the concept. It's delivering a high-quality, personalized document for thousands of users, reliably, every single morning, without spending a fortune.
Here's the stack that makes it work.
The Tech Stack
Claude Haiku — The Brain
Every brief is generated by Claude Haiku, Anthropic's fastest and most cost-effective model. For each user, we pull their preferences and live data, construct a prompt, and let Claude write the brief.
Why Haiku over GPT-4o or Claude Sonnet? Cost and speed. A single brief generation costs roughly $0.003–0.005. At scale, that matters enormously. And for a morning brief — structured, factual, consistent — Haiku performs just as well as more expensive models.
The prompt engineering took the most iteration. Getting Claude to write a brief that feels personal (not generic), accurate (not hallucinated), and appropriately scoped (not too long, not too short) required about two months of refinement.
Python — The Engine
The brief generation engine is a Python script that runs daily. It:
- Queries Supabase for all active users and their preferences
- Fetches live data for each user (markets, weather, sports, news)
- Builds a tailored prompt for each user
- Calls Claude Haiku via the Anthropic API
- Passes the generated brief to Resend for email delivery
- Logs the result back to Supabase
The script runs on Railway as a scheduled job. Cold start to completion for 30 users takes about 4 minutes.
Data Sources
This is the part most people ask about. Where does the live data come from?
- Markets: Yahoo Finance (free, unofficial API via
yfinancePython library). We pull current price, daily change, and 52-week context for any ticker the user adds. - Weather: Open-Meteo API (completely free, no key required). Lat/lon based, surprisingly accurate.
- Sports: ESPN's public RSS feeds + web scraping for scores and standings. No official API needed.
- News/Geopolitics/Tech: RSS feeds from Reuters, BBC, AP, The Verge, and others. We ingest, deduplicate, and pass the top headlines to Claude for summarization.
- Music: Spotify Charts + Billboard RSS for new releases and trending tracks.
None of these cost anything. The whole data layer is free.
Next.js — The Frontend
The web app is built with Next.js (App Router) and deployed on Railway. It handles:
- User onboarding and section selection
- Authentication (magic link via email OTP)
- Account management and preference updates
- Stripe billing integration
- Admin dashboard for monitoring briefs
Tailwind CSS for styling. No component library — just utility classes. The whole frontend is clean, fast, and easy to iterate on.
Supabase — The Database
Supabase handles everything persistence-related:
- User accounts and preferences
- Subscription status (synced via Stripe webhooks)
- Brief delivery logs (every sent brief is stored)
- Click tracking and engagement data
The free tier was sufficient for the first few months. We're now on the Pro plan ($25/month) for better performance and daily backups.
Railway — Hosting
Both the Next.js app and the Python engine run on Railway. It's the simplest deployment experience I've found for a full-stack project with a Python backend:
- Push to
main→ auto-deploy in ~90 seconds - Scheduled jobs built in (no Cron providers needed)
- Environment variables managed cleanly
- Pricing is usage-based — we pay roughly $10–15/month
Resend — Email Delivery
Resend handles email delivery. The API is clean, the deliverability is excellent, and the pricing is generous for our volume (100 emails/day costs almost nothing).
We use React Email templates compiled server-side for the brief HTML. Resend's webhook integration also handles click tracking — every link in the brief is tracked, which feeds back into our engagement analytics.
The Real Costs
Here's what it actually costs to run Daily Dose per month with ~30 active users:
| Service | Monthly Cost | |---|---| | Claude Haiku (30 users × 31 days × ~$0.004) | ~$3.72 | | Railway (app + Python engine) | ~$12 | | Supabase (Pro plan) | $25 | | Resend (email delivery) | ~$0 (free tier) | | Domain + misc | ~$2 | | Total | ~$43/month |
Revenue at 30 users × $4.49/month: ~$135/month.
Not getting rich, but the unit economics work and they improve dramatically as we grow. The Claude cost scales linearly with users; everything else is mostly fixed.
What Surprised Me
The hardest part was prompt engineering, not infrastructure. Getting Claude to write a brief that feels genuinely personal took far more iteration than setting up Railway or Supabase. The difference between a brief that feels like it was written for you vs. one that feels like a template is entirely in how you structure the prompt.
Reliability matters more than features. Users don't care about fancy features if their brief doesn't show up at 6:30 AM. The brief has to arrive, every day, without fail. We've achieved 99.4% delivery reliability since launch by building robust error logging and retry logic into the Python engine.
The email channel is underrated. Everyone talks about apps and dashboards, but email remains the most reliable, distraction-free channel for daily information delivery. You don't need to open anything. The brief just appears. That simplicity is the whole product.
What's Next
We're planning to add:
- More section types (more sports leagues, crypto, local news)
- A referral program (give a month, get a month)
- A blog for SEO content (this being the first post)
- Twitter/social integration for growth
If you want to try Daily Dose, the 7-day free trial requires no credit card. You set up your sections, pick your delivery time, and the next morning it arrives.
It takes about 3 minutes to configure. After that, you don't have to do anything — it just shows up.
Daily Dose is built and maintained by Spencer Gottshall. Questions about the stack? Reach out via the site.
Ready to upgrade your mornings?
Get your personalized AI morning brief — $4.49/month, 7-day free trial. No credit card required.
Start Your Free Trial →