Densly: AI-Powered Daily Digest
A full-stack newsletter platform that aggregates newsletters, YouTube channels, and podcasts into a single AI-summarized digest email delivered once a day.

Overview
Densly is a full-stack content digest platform that replaces inbox clutter with one clean email per day.
Users subscribe to newsletters, YouTube channels, and podcasts through a source directory. Every day at their configured send time, Densly fetches everything they're subscribed to, summarizes it with Claude, and delivers a single digest email via SendGrid. No more tab-switching or half-read newsletters — just one email with everything that matters, already distilled.
The system is built as a clean MVP with a hard separation between the Next.js frontend and the FastAPI backend, deployed independently on Vercel and Railway.

What I built
- Designed and built the full backend: FastAPI + SQLAlchemy (async) + Celery + Redis + PostgreSQL via Supabase, handling user subscriptions, content ingestion, digest scheduling, and email delivery.
- Built an inbound newsletter webhook pipeline that writes incoming emails to Redis and reads them at digest time, keeping ingestion decoupled from delivery.
- Implemented Celery Beat scheduling that polls every 60 seconds to check which users are due for a digest based on their timezone and configured send time, defaulting to 7am if unset.
- Integrated Anthropic Claude to summarize each user's daily content pull into a single coherent digest.
- Wired SendGrid for digest delivery with per-user send time configuration.
- Built the Next.js 14 App Router frontend with Tailwind CSS, including source configuration, digest schedule settings, and a newsletter discovery directory.
- Implemented auth with Clerk: JWTs issued on the frontend, verified server-side in the Python backend.
- Deployed the frontend to Vercel and the backend + Celery workers to Railway.
Outcome
- Delivered a working end-to-end MVP: users subscribe to sources, Claude summarizes their daily content, and a single digest email lands at their chosen time.
- The inbound webhook + Redis architecture keeps newsletter ingestion async and decoupled from the digest delivery pipeline.
- The Celery Beat polling loop handles per-user timezone-aware scheduling without requiring a per-user cron job.
- Source directory gives users a structured way to discover and add new newsletters, channels, and podcasts without manual configuration.