A client-side podcast player PWA built with SvelteKit 2 and Svelte 5. Search, subscribe, download, and listen — all in the browser with IndexedDB storage.
npm install
npm run dev
Open http://localhost:5173 in your browser.
| Command | Description |
|---|---|
npm run dev |
Start dev server |
npm run build |
Production build |
npm run preview |
Preview production build |
npm run check |
TypeScript type checking |
npm run lint |
Lint with Biome |
npm run format |
Format with Biome |
All data is stored in the browser via IndexedDB (Dexie). There is no backend database — the app runs entirely client-side. A server-side proxy route handles RSS feed fetching to avoid CORS restrictions.
src/
├── lib/
│ ├── db.ts # Dexie database schema
│ ├── podcast-service.ts # Search, subscribe, download, feed parsing
│ └── player.svelte.ts # Singleton player state (Svelte 5 runes)
├── routes/
│ ├── +layout.svelte # App shell, mini player, bottom nav
│ ├── +page.svelte # Home — latest episodes
│ ├── discover/ # Podcast search
│ ├── library/ # Subscriptions, downloads, history
│ ├── podcast/ # Podcast detail & episode list
│ └── api/proxy/ # RSS feed CORS proxy
└── app.css # Tailwind theme (dark mode)