Podcst Web is a modern PWA to listen to podcasts.
The aim of this project is to provide an excellent podcast listening experience on all types of devices (desktop, tablets, mobile).
Another major focus is on accessibility, with full keyboard navigation support.
Note: This project only aims to support ever-green browsers.
- User accounts with passkey authentication
- Cross-device subscription and playback sync
- Podcast search and discovery
- Top podcasts by region
- Chromecast and AirPlay support
- Private feed support
- Media session integration
- Offline PWA capabilities
- Frontend: Next.js with App Router, React 19, TypeScript
- State Management: Zustand for client state
- Data Fetching: TanStack Query
- Database: PostgreSQL (content + user data)
- Caching: Redis + IndexedDB + LocalStorage
- Audio: Howler.js
- Styling: Tailwind CSS 4 + CSS Modules
- Code Quality: Biome for formatting and linting
Background Jobs (cron):
├── poll-top-charts.ts → iTunes API → top_podcasts table
├── poll-feeds.ts → RSS feeds → episodes table
└── sync-podcast-index → Podcast Index dump → podcasts table
API Routes (database-first):
├── /api/top → PostgreSQL → top podcasts
├── /api/feed → PostgreSQL → podcast + episodes
└── /api/search → PostgreSQL + iTunes fallback
Simple branch-and-merge workflow:
mainis the production branch- Branch off
mainfor new features or fixes - Open a PR and merge back to
mainwhen ready
- Bun - JavaScript runtime (for scripts)
- Node - LTS version
- yarn - package manager
- PostgreSQL - database
- Redis - caching layer
Clone this repository and install dependencies:
git clone https://github.com/shantanuraj/podcst-web
cd podcst-web
yarnSet up environment variables (create .env.local):
DATABASE_URL=postgresql://...
REDIS_URL=redis://...
WEBAUTHN_RP_ID=localhost
WEBAUTHN_RP_ORIGIN=http://localhost:3000
RESEND_API_KEY=... # optional, for email verificationRun database migrations:
yarn db:migrateStart the development server:
yarn devyarn dev # Start development server
yarn build # Build for production
yarn start # Start production server
yarn format # Format code with Biome
yarn lint # Lint code with Biome
yarn db:migrate # Run database migrationsThese scripts run as background jobs to keep content fresh:
bun scripts/poll-top-charts.ts # Sync iTunes top charts + poll missing episodes
bun scripts/poll-feeds.ts # Poll RSS feeds (single batch)
bun scripts/poll-feeds.ts --daemon # Poll RSS feeds continuously
bun scripts/sync-podcast-index.ts # Sync from Podcast Index database dumpyarn buildThis creates an optimized production build in the .next folder.
The app is deployed on both Vercel and Fly.io, with plans to consolidate on Fly.io.
Automatic deployment on every push to main.
Deploy using the Fly CLI.
./scripts/deploy-fly.sh- TypeScript - Type-safe JavaScript
- Next.js - React framework
- React - UI library
- TanStack Query - Data fetching and caching
- Zustand - State management
- Howler - Audio playback
- Tailwind CSS - Utility-first CSS
- PostgreSQL - Database
- Redis - Caching
- Biome - Linting and formatting
Please read CONTRIBUTING.md for process details on collaborating on this project.
We use SemVer for versioning. For available versions of this software, see the releases on this repository.
See the list of contributors who participated in this project.
This project is licensed under the MIT License - see the LICENSE file for details.