Upload your podcast once. Get platform-optimized content for 6 social networks automatically.
This is how we keep this content FREE and continue building open-source projects for the community. It costs you nothing extra, but it makes a huge difference for us!
- Clerk - Authentication & Billing (Free tier available)
- Inngest - Workflow Orchestration (Free for developers)
- CodeRabbit - AI Code Reviews (Optional, for development)
π Thank you for supporting the channel by using our links!
Podcast creators drowning in post-production work
You've spent hours recording, editing, and producing your podcast. Now you need to:
- Write social media posts for 6 different platforms
- Create catchy titles and descriptions
- Generate timestamps for YouTube
- Find the best moments for clips
- Write captions and hashtags
This app does all of that in seconds.
End-to-end AI workflow from upload to multi-platform content
Not just transcription. Not just summaries. A complete content distribution system powered by AI that understands your podcast and creates tailored content for every platform.
Parallel AI processing with Inngest (5x faster than sequential)
Instead of waiting 5 minutes for AI tasks to run one-by-one, we run 6 AI generation jobs simultaneously. Your content is ready in ~90 seconds total.
Think of it as your AI newsroom for podcast content.
Here's the simple explanation:
- You upload one audio file (your podcast episode)
- AI analyzes your content, understanding speakers, topics, and key moments
- You get a complete content distribution package:
- Summary with key insights
- Social media posts tailored for Twitter, LinkedIn, Instagram, TikTok, YouTube, and Facebook
- Title suggestions (short, long, SEO-optimized)
- Platform-specific hashtags
- YouTube chapter timestamps
- Key moments for viral clips
- Full transcript with speaker identification
The workflow: Record β Upload β AI Analyzes β Get Distribution Content
No manual writing. No copying and pasting between platforms. No guessing what hashtags work.
Want to build apps like this from scratch?
If you're looking at this project thinking "I want to learn how to build this," I've got you covered.
- Next.js 15 - Server actions, app router, API routes, and streaming
- Real-time Databases - Convex for instant UI updates without polling
- AI Integrations - OpenAI, AssemblyAI, and prompt engineering
- Background Jobs - Inngest for durable, observable workflows
- Modern Auth & Billing - Clerk with subscription management
- Production Deployment - Vercel, environment variables, and monitoring
- Private Discord - Direct access to me and other builders
- Code Reviews - Get feedback on your projects
- Weekly Q&A Sessions - Ask anything about development
- Job Board - Exclusive opportunities shared with the community
Students have gone from beginner to shipping production apps in weeks. Learn the same modern stack used by top startups.
- 50+ hours of video tutorials - Step-by-step project builds
- Starter templates - Clone and customize for your projects
- Lifetime updates - New courses and content added regularly
- Certificate of completion - Show employers your skills
- π AI Summary - Comprehensive overview with bullets, key insights, and TLDR
- π± Social Posts - Platform-optimized copy for 6 networks:
- Twitter - 280 chars, punchy and engaging
- LinkedIn - Professional tone, thought leadership
- Instagram - Visual hooks with engagement questions
- TikTok - Casual, trend-aware, Gen-Z friendly
- YouTube - Description with CTAs and timestamps
- Facebook - Community-focused conversation starters
- π― Title Suggestions - 4 different styles for every use case:
- YouTube Short (catchy, under 60 chars)
- YouTube Long (descriptive, SEO-friendly)
- Podcast Titles (episode-focused)
- SEO Keywords (discoverability)
- #οΈβ£ Hashtags - Platform-specific tags optimized for reach
- β±οΈ YouTube Timestamps - Auto-generated chapter markers for better navigation
- π€ Key Moments - AI identifies viral clip opportunities with timestamps
- π₯ Speaker Diarization - "Who said what" with speaker labels and confidence scores
- β‘ Parallel AI Processing - 6 AI jobs run simultaneously (60s total vs 300s sequential)
- π Real-time Updates - See progress live with Convex subscriptions (no polling)
- π‘οΈ Durable Workflows - Inngest automatically retries failed steps (no lost work)
- π Plan-based Feature Gating - Features unlock based on subscription tier (Free/Pro/Ultra)
- π¨ Dark Mode Support - Beautiful UI that adapts to your preference
- π¦ Type-safe Throughout - End-to-end TypeScript with Zod validation
- π Secure by Default - Clerk authentication with row-level security
| Feature | FREE | PRO ($29/mo) | ULTRA ($69/mo) |
|---|---|---|---|
| Projects | 3 lifetime | 30/month | Unlimited |
| File Size | 10 MB | 200 MB | 3 GB |
| Max Duration | 10 min | 2 hours | Unlimited |
| AI Summary | β | β | β |
| Social Posts | β | β | β |
| Titles & Hashtags | β | β | β |
| YouTube Timestamps | β | β | β |
| Key Moments | β | β | β |
| Full Transcript | β | β | β |
| Speaker Diarization | β | β | β |
flowchart TD A[User Uploads Audio] --> B[File Saved to Vercel Blob] B --> C[Inngest Event Triggered] C --> D[Project Status: Processing] D --> E[AssemblyAI Transcription] E --> F[Parallel AI Content Generation] F --> G[Results Saved to Convex] G --> H[Project Status: Completed] H --> I[User Views Dashboard] I --> J[Real-time Updates via Convex] Performance Notes:
- Transcription: ~30-60 seconds
- AI Content Generation (parallel): ~60 seconds
- Total Processing Time: ~90-120 seconds
flowchart TD A[AssemblyAI Transcription Complete] --> B{Fan-out to Parallel Jobs} B --> C[Generate Summary] B --> D[Generate Social Posts] B --> E[Generate Titles] B --> F[Generate Hashtags] B --> G[Generate YouTube Timestamps] B --> H[Generate Key Moments] C --> I[Join All Results] D --> I E --> I F --> I G --> I H --> I I --> J[Save to Convex Database] J --> K[UI Updates in Real-time] Why This Matters:
- Sequential: 6 jobs Γ 50s each = ~300 seconds (5 minutes)
- Parallel: All jobs run simultaneously = ~60 seconds
- Result: 5x faster processing
flowchart LR A[Client Upload] --> B[Next.js API Route] B --> C[Clerk Auth Check] C --> D[Vercel Blob Storage] D --> E[Inngest Event] E --> F[AssemblyAI Transcription] E --> G[OpenAI Content Generation] F --> H[Convex Database] G --> H H --> I[Real-time Subscription] I --> J[Client Dashboard Update] Before you begin, make sure you have:
- Node.js 18+ and pnpm installed
- Accounts created for all services (see "DO THIS Before You Get Started" section above)
- Git for version control
- A code editor (VS Code recommended)
- Clone the repository
git clone <your-repo-url> cd ai-podcast-saas-inngest-coderabbit-clerk- Install dependencies
pnpm install- Set up environment variables
cp .env.example .env.localThen fill in all the required keys in .env.local (see Environment Variables section below).
- Start Convex development database
pnpm convex devThis will:
- Create a new Convex project (or connect to existing)
- Set up your database schema
- Generate TypeScript types
- Start watching for changes
- Start the development server (in a new terminal)
pnpm dev- Open your browser
Navigate to http://localhost:3000
Create a .env.local file in the root directory with the following variables:
# Convex CONVEX_DEPLOYMENT=dev:ai-podcast-saas-inngest-coderabbit-clerk NEXT_PUBLIC_CONVEX_URL=https://your-project.convex.cloud # Clerk NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_... CLERK_SECRET_KEY=sk_test_... CLERK_JWT_ISSUER_DOMAIN=your-domain.clerk.accounts.dev # Vercel Blob BLOB_READ_WRITE_TOKEN=vercel_blob_... # Assembly AI ASSEMBLYAI_API_KEY=... # OpenAI OPENAI_API_KEY=sk-proj-...Security Notes:
β οΈ NEVER commit.env.localto version control- β
Use
.env.exampleas a template (safe to commit) - π Variables prefixed with
NEXT_PUBLIC_are exposed to the browser - π Other variables are server-side only
- Go to Clerk Dashboard
- Create a new application
- Copy your publishable and secret keys to
.env.local - Enable Billing:
- Go to "Billing" β "Subscriptions"
- Create three plans:
free,pro,ultra - Set prices: Free ($0), Pro ($29/mo), Ultra ($69/mo)
- Configure Features (match these identifiers):
summary(Free, Pro, Ultra)social_posts(Pro, Ultra)titles(Pro, Ultra)hashtags(Pro, Ultra)youtube_timestamps(Ultra only)key_moments(Ultra only)speaker_diarization(Ultra only)
- Go to Convex Dashboard
- Create a new project
- Copy your deployment URL to
.env.local - The schema will auto-deploy when you run
pnpm convex dev
- Go to Vercel Dashboard
- Create a new project (or use existing)
- Go to "Storage" β "Create Database" β "Blob"
- Copy the
BLOB_READ_WRITE_TOKENto.env.local
- Go to Inngest Dashboard
- Create a new app
- Copy your Event Key and Signing Key to
.env.local - In development, Inngest will auto-discover your functions
- Go to AssemblyAI Dashboard
- Create an account (free tier available)
- Copy your API key to
.env.local - Pricing:
$0.00025/second ($0.65 per hour of audio)
- Go to OpenAI Platform
- Create an API key
- Add credits to your account (pay-as-you-go)
- Copy your API key to
.env.local - Model Used: GPT-4 (~$0.10 per podcast episode)
Before uploading your first podcast, verify:
- All environment variables are set in
.env.local - Convex database is running (
pnpm convex dev) - Clerk application is configured with billing plans
- Inngest is connected (check logs when you start dev server)
- You can access the app at
http://localhost:3000 - Test upload with a small audio file (under 10MB)
The entire application revolves around a single projects table in Convex. This denormalized structure allows for atomic updates and real-time reactivity.
Key Fields:
| Field | Type | Description |
|---|---|---|
userId | string | Clerk user ID (links project to user) |
inputUrl | string | Vercel Blob URL for uploaded file |
status | enum | uploaded β processing β completed or failed |
jobStatus | object | Granular status for transcription and contentGeneration |
transcript | object | Full transcript with segments, speakers, chapters |
summary | object | AI-generated summary with bullets, insights, TLDR |
socialPosts | object | Platform-specific posts (Twitter, LinkedIn, etc.) |
titles | object | Title suggestions (YouTube, podcast, SEO) |
hashtags | object | Platform-specific hashtag recommendations |
youtubeTimestamps | array | Chapter markers for YouTube descriptions |
keyMoments | array | Viral clip opportunities with timestamps |
Design Decisions:
- Denormalized structure - All data in one document for atomic updates
- Optional fields - Allow progressive population as Inngest jobs complete
- Indexes - Optimize queries by user, status, and creation date
- Real-time reactivity - Convex subscriptions trigger UI updates automatically
Indexes:
by_user- List all projects for a userby_status- Filter by processing statusby_user_and_status- User's active/completed projectsby_created_at- Sort by newest first
- Push your code to GitHub
git add . git commit -m "Initial commit" git push origin main- Import to Vercel
- Go to Vercel Dashboard
- Click "Import Project"
- Select your GitHub repository
- Vercel will auto-detect Next.js
- Add environment variables
In Vercel dashboard β Settings β Environment Variables, add all variables from your .env.local
- Deploy
Vercel will automatically deploy on every push to main
- Configure custom domain (optional)
Settings β Domains β Add your domain
npx vercel --prodFollow the prompts to deploy.
After deploying to production:
- All environment variables set in Vercel dashboard
- Inngest production environment configured (separate from dev)
- Clerk production instance connected
- Update
NEXT_PUBLIC_APP_URLto your production URL - Test upload on production with a small file
- Monitor Inngest dashboard for workflow errors
- Check Vercel logs for any runtime errors
Keep an eye on these dashboards:
- Inngest Dashboard - Workflow execution logs, retry attempts, failures
- Convex Dashboard - Database queries, performance metrics, real-time connections
- Vercel Analytics - Traffic, page views, edge function performance
- Clerk Dashboard - User signups, active subscriptions, billing events
Problem: Can't connect to Convex database
Solution:
# Make sure Convex dev server is running in a separate terminal pnpm convex devProblem: Upload returns 400 or 500 error
Solution:
- Check Vercel Blob is enabled in your project settings
- Verify
BLOB_READ_WRITE_TOKENis set correctly - Check browser console for CORS errors
Problem: File uploads but processing never starts
Solution:
- Verify
INNGEST_EVENT_KEYandINNGEST_SIGNING_KEYin.env.local - Check Inngest dev server is connected (look for logs in terminal)
- Ensure
/api/inngestroute is accessible
Problem: User uploads file but can't see it in dashboard
Solution:
- Check Clerk
userIdmatches projectuserIdin database - Verify Convex provider wraps your app in
app/layout.tsx - Check browser console for Convex connection errors
Problem: Dashboard doesn't update automatically during processing
Solution:
- Ensure
ConvexProviderwraps your app - Verify you're using
useQuery(notfetchQuery) for reactive data - Check Convex dashboard for connection issues
Problem: Stuck in infinite redirect after sign in
Solution:
- Verify
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEYis set correctly - Check Clerk dashboard for correct redirect URLs
- Clear browser cookies and try again
Problem: Users can't upgrade or plan limits not enforced
Solution:
- Configure plans in Clerk dashboard with correct identifiers:
free,pro,ultra - Ensure feature identifiers match
tier-config.ts - Check Clerk webhook configuration for subscription events
Problem: Project stuck in "processing" status
Solution:
- Check Inngest dashboard for error logs
- Verify
OPENAI_API_KEYis valid and has credits - Check OpenAI API status page for outages
Problem: Transcription step fails immediately
Solution:
- Verify
ASSEMBLYAI_API_KEYis valid - Check file format is supported (MP3, MP4, WAV, etc.)
- Ensure file URL is publicly accessible
- Check AssemblyAI dashboard for quota limits
Problem: Free users see Pro/Ultra features
Solution:
- Verify Clerk plan configuration matches
tier-config.ts - Check plan detection logic in
lib/tier-utils.ts - Ensure
hasfunction is called correctly in API routes
Want to level up this project? Here are some advanced features you can build:
- π Export to PDF/Google Doc - Generate beautiful PDF reports with all content
- π Social Media Scheduling - Integration with Buffer or Hootsuite for auto-posting
- π Multi-language Support - Transcribe and translate to 10+ languages
- π¨ Custom AI Tone Presets - Let users define brand voice for AI generation
- π¦ Batch Processing - Upload 10 episodes, process all overnight
- π₯ Video Clip Generation - Automatically create video clips from key moments
- π Analytics Dashboard - Track which content performs best across platforms
- π§ Fine-tuning - Train GPT on user's specific podcast style
- π¬ Custom Prompts - Let users write their own prompt templates per platform
- π Sentiment Analysis - Automatically tag moments as funny, insightful, controversial
- A/B Testing - Generate multiple title variations and track which performs best
- π Content Recommendations - "Based on this episode, you should talk about..."
- βοΈ Cloudflare R2 - Migrate from Vercel Blob for cheaper long-term storage
- β‘ Redis Caching - Cache frequently accessed projects and transcripts
- πͺ Webhook Notifications - Alert users via email/SMS when processing completes
- π§ Separate Worker Service - Move heavy processing to dedicated infrastructure
- π Usage Analytics - Track costs per user for better pricing optimization
- π₯ Team Plans - Multi-user access with role-based permissions
- π·οΈ White-label Option - Let agencies rebrand the app for their clients
- π API Access - Enterprise tier with REST API for automation
- π³ Credits System - Pay-per-use model instead of subscriptions
- π Referral Program - Reward users for bringing in new customers
Pick one feature and build it! Then submit a PR or share in the PAPAFAM Discord. I'd love to see what you create.
This project is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License (CC BY-NC 4.0).
- β Use this code for personal learning and education
- β Modify and adapt the code for your own projects
- β Share the code with others (with attribution)
- β Use it in your portfolio (non-commercial showcase)
- β Fork, clone, and experiment with the codebase
- β Use this code for commercial purposes (selling, SaaS, client work)
- β Sell this application or derivatives of it
- β Remove attribution to the original author
- β Relicense the code under different terms
Interested in using this project commercially? I offer flexible licensing options:
- Startup License - For early-stage companies (<$100k revenue)
- Enterprise License - For established businesses
- White-label License - Full customization rights for agencies
Contact me: Open an issue on GitHub or reach out through the PAPAFAM team email at team@papareact.com
Full license text: LICENSE.md
# Development pnpm dev # Start Next.js dev server + Convex watch pnpm build # Build for production pnpm start # Start production server pnpm lint # Run Biome linter pnpm format # Format code with Biome # Convex pnpm convex dev # Start Convex development database pnpm convex deploy # Deploy Convex to production # Deployment npx vercel # Deploy to Vercel (preview) npx vercel --prod # Deploy to productionPlan-based Feature Gating
Features are enabled based on the user's Clerk subscription tier:
- Free: Summary only (3 projects lifetime)
- Pro: + Social posts, titles, hashtags (30 projects/month)
- Ultra: + YouTube timestamps, key moments, full transcript (unlimited)
Parallel AI Processing
Instead of running AI generation tasks sequentially (slow), Inngest runs 6 jobs in parallel using Promise.allSettled. This reduces processing time from ~5 minutes to ~60 seconds.
Real-time Updates
Convex subscriptions (useQuery) automatically re-render components when database data changes. No polling, no manual refetching. As Inngest updates the project status, the UI updates instantly.
Durable Execution
Inngest provides automatic retry logic. If OpenAI times out or AssemblyAI fails, the step retries with exponential backoff. Your users never lose work.
Built with incredible tools from:
- Clerk - Authentication & Billing
- Inngest - Workflow Orchestration
- Convex - Real-time Database
- Vercel - Deployment & Storage
- AssemblyAI - Audio Intelligence
- OpenAI - AI Content Generation
- Found a bug? Open an issue on GitHub
- Need help? Join the PAPAFAM Discord
- Want to contribute? PRs welcome (see LICENSE for terms)
Built with β€οΈ for the PAPAFAM community