| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| EpisodeList.tsx | 2025-08-20 | 5.4 kB | |
| UploadCard.tsx | 2025-08-20 | 6.1 kB | |
| api.ts | 2025-08-20 | 970 Bytes | |
| package.json | 2025-08-20 | 450 Bytes | |
| README.md | 2025-08-20 | 5.9 kB | |
| tsconfig.json | 2025-08-20 | 532 Bytes | |
| types.ts | 2025-08-20 | 255 Bytes | |
| vite.config.ts | 2025-08-20 | 459 Bytes | |
| _gitattributes | 2025-08-20 | 68 Bytes | |
| App.tsx | 2025-08-20 | 2.8 kB | |
| index.html | 2025-08-20 | 729 Bytes | |
| index.tsx | 2025-08-20 | 363 Bytes | |
| metadata.json | 2025-08-20 | 232 Bytes | |
| _gitignore | 2025-08-20 | 277 Bytes | |
| Totals: 14 Items | 24.4 kB | 4 |
PDF to Podcast
PDF to Podcast transforms any PDF document into a podcast-ready audio episode using advanced AI text-to-speech (TTS) providers. Upload a PDF, select your preferred voice and provider, and receive an MP3 and a ready-to-use RSS feed for your podcast app.
π Quick Launch
Deploy this app to your favorite platform with one click:
Docker:
docker run -d -p 3000:3000 -e GEMINI_API_KEY=your_key ghcr.io/knoksen/pdf-to-podcast:latest
fly launch --image ghcr.io/knoksen/pdf-to-podcast:latest
π Features
- PDF Upload: Drag & drop or select a PDF, up to 50MB.
- Provider Selection: Choose TTS engine: gTTS (free), OpenAI, or Azure.
- Voice Selection: Customizable voice (where supported).
- Episode Management: See, play, and download all generated episodes.
- Podcast-Ready: Instant RSS feed for any podcast app.
- Modern UI: Built with React, TailwindCSS, and best practices.
- API-First: Easily extensible for new TTS providers.
π οΈ Architecture & Tech Stack
- Frontend: React (Vite), TypeScript, TailwindCSS
- Backend: Node.js (Express/Fastify), REST API
- TTS Providers: gTTS (Google Text-to-Speech), OpenAI, Azure Cognitive Services
- Storage: Local filesystem (default), configurable for cloud (e.g., S3)
- Deployment: Vercel, Netlify, Railway, Render, Docker, etc.
- CI/CD: GitHub Actions (recommended)
- RSS Generation: Automatic and standards-compliant
βοΈ Configuration & Environment
Create a .env.local file in the root with:
GEMINI_API_KEY=your_gemini_api_key
# Optionally:
# OPENAI_API_KEY=your_openai_key
# AZURE_API_KEY=your_azure_key
# AZURE_REGION=your_azure_region
# STORAGE_DIR=/path/to/episodes
GEMINI_API_KEYis required for Gemini-based TTS.- Add other provider keys as needed.
π§βπ» Local Development
Prerequisites:
- Node.js 18+
- npm
Steps:
git clone https://github.com/knoksen/pdf-to-podcast.git
cd pdf-to-podcast
cp .env.local.example .env.local # then edit the file
npm install
npm run dev
Visit http://localhost:3000
ποΈ Usage
- Upload your PDF.
- Choose a provider and voice (if available).
- Click Generate Episode.
- When processing is complete, play or download the MP3.
- Use
/rss.xmlin your podcast app.
π§© API (for Developers)
POST /api/episodesβ Upload a PDF and metadataGET /api/episodesβ List all podcast episodesGET /api/episodes/:id/audioβ Download episode audioGET /rss.xmlβ Get podcast RSS
Extending:
Add your own TTS provider by implementing a new provider in/services/tts/and updating the provider options.
π¦ Docker
Build your own image:
docker build -t pdf-to-podcast .
docker run -d -p 3000:3000 -e GEMINI_API_KEY=your_key pdf-to-podcast
π§ͺ Testing
npm run test
π€ Contributing
PRs and issues welcome! See CONTRIBUTING.md for details.
π License
β¨ Credits
π£οΈ Questions?
Open an issue or start a discussion.