## Podcast Platform — Publishing, distribution and audience analytics for independent creators. - URL: https://www.naveentehrpariya.dev/projects/podcast-platform - Industry: Media - Client type: Startup - Country: United States - Role: Full Stack Product Engineer - Duration: 6 months - Status: Live - Year: 2023 An end-to-end home for independent podcasters: upload an episode, get it transcoded, distributed to every major directory through RSS, and see who actually listened. ### Problem Creators were stitching together a host, a transcription service and a spreadsheet. Nothing shared data, episode metadata was entered three times, and analytics stopped at raw download counts. ### Objectives - Take an episode from upload to published without leaving the product - Generate compliant RSS that every directory accepts on first submission - Give creators listener analytics beyond a download number - Keep storage and bandwidth costs predictable as libraries grow ### Solution Uploads go straight to object storage with presigned URLs, so audio never passes through the API. A queued worker transcodes to streaming-friendly bitrates and writes back durations and waveforms. RSS is generated per show and cached at the CDN edge, and playback events stream into a rollup table that powers the analytics views. ### Features - Direct-to-storage uploads with resumable transfer - Background transcoding and waveform generation - Spec-compliant RSS feeds cached at the edge - Episode scheduling and drafts - Listener analytics with retention curves - Embeddable player for creator websites ### Stack - Frontend: Next.js, React, Tailwind CSS - Backend: Node.js, Express, BullMQ - Database: MongoDB, Redis - Cloud: AWS S3, CloudFront, Docker - Integrations: FFmpeg, OpenAI Whisper, Stripe ### Engineering challenges ### Large audio files through a small API Problem: Routing hour-long uploads through the application server tied up memory and timed out on slow connections. Approach: The client uploads directly to S3 with a presigned URL and only tells the API when the object exists, so the server handles metadata rather than bytes. ### Directories that reject imperfect feeds Problem: Each podcast directory enforces slightly different RSS rules, and a rejected feed blocks distribution entirely. Approach: Feed generation was moved behind a validator that runs the directory rule sets before a feed is ever served, so problems surface at publish time rather than at submission. ### Outcome - Publishing collapsed from three tools into one flow - Feed rejections caught at publish time instead of after submission - Bandwidth costs became predictable by serving audio from the CDN rather than the origin ### What it taught Keep heavy bytes off the application path. Once uploads and delivery moved to storage and CDN, the API stayed small enough to reason about. Case study: https://www.naveentehrpariya.dev/projects/podcast-platform More work: https://www.naveentehrpariya.dev/llms.txt