Turn any podcast or video episode into a client-ready content pack — entirely on your own PC.
PodForge downloads an episode (or accepts a local audio/video file), transcribes it locally with OpenAI Whisper, gives you a review workspace where the transcript plays in sync with the audio, then assembles show notes, pull quotes, social posts, blog drafts and newsletter blurbs into one polished markdown bundle.
No cloud transcription. No API keys. No per-episode costs.
| 🔗 Paste a link | YouTube, podcast feeds — anything yt-dlp supports |
| 📎 Or upload a file | mp3 · wav · m4a · mp4 · mkv · mov · webm (converted automatically) |
| 🎙️ Local transcription | faster-whisper runs on your GPU (CUDA) with CPU fallback |
| 🎧 Synced review | click any timestamp to jump the audio; the current row follows playback; every line is editable with autosave |
| 🗂️ Project explorer | folders, drag-and-drop moving, manual reordering, rename, delete |
| ⏱️ Live progress | real download % and transcription position ("7:42 / 13:32"), cancel anytime |
| 📦 Batch queue | multiple projects process sequentially in the background |
| 🤖 Optional AI extras | show notes + chapters, pull quotes, social posts (X/thread/LinkedIn/Instagram), SEO blog post, newsletter blurb — written by a local AI writer via OpenCode, fully editable before export |
| 📤 One-click client bundle | pick your sections → download a single markdown file ready to send |
- Python 3.10+ (python.org) — tick "Add to PATH" during install
- ffmpeg on PATH (Windows builds here;
brew install ffmpeg/apt install ffmpegelsewhere) - An NVIDIA GPU is strongly recommended (any 6 GB+ card). CPU-only works but is ~4× slower.
- Optional, for AI-written extras: the OpenCode CLI (
npm i -g opencode-ai), which connects to free models out of the box
git clone https://github.com/YOUR_USERNAME/podforge-studio.git
cd podforge-studio
pip install -r requirements.txtfaster-whisper will fetch its CUDA libraries automatically on first run.
(On some setups you may need: uv pip install nvidia-cublas-cu12 nvidia-cudnn-cu12
into the same environment — the server registers their DLL directories itself.)
python app/server.pyOpen http://127.0.0.1:8555 (the port prints on startup).
Using OpenCode somewhere unusual? Point PodForge at it:
PODFORGE_OPENCODE="C:/path/to/opencode.cmd" python app/server.py
- Paste an episode link → choose a model → Process
- Watch the progress bar (download % → transcription position)
- Click the project to open the review workspace — play the audio, fix names/numbers inline
- Open Extras & export, generate what you need, edit the output
- Tick sections → Download bundle (.md) → send to your client
All models are local Whisper variants fetched automatically on first use.
| Model | Best for | Rough speed* |
|---|---|---|
| Tiny | quick scans, draft quality | ~6 min per hour of audio |
| Base | slightly better than Tiny | ~9 min/hr |
| Small | clear single-speaker audio | ~18 min/hr |
| Medium | most podcasts | ~48 min/hr |
| Large-v3 ★ recommended | best names/numbers/accents | ~25–35 min/hr |
* on a mid-range NVIDIA GPU (RTX 2080 class). CPU-only: multiply by ~4–5.
Extras are generated by the OpenCode CLI running on your machine. PodForge ships the
prompts; OpenCode handles the model. By default it uses free models from OpenCode's gateway
(big-pickle, grok-code, qwen3-coder, gpt-5-nano) — configure your own provider inside
OpenCode if you prefer. You can change the model and customise every prompt in ⚙ Settings.
Nothing is sent anywhere by PodForge itself; there are no API keys in this codebase.
Transcripts stay on your disk under data/episodes/<id>/.
If OpenCode isn't installed, everything else still works — extras just report an error when you try to generate them.
- Duplicate protection — processing an existing episode asks before redoing it; your reviewed corrections are backed up first
- Folders & ordering — create folders, drag projects into them, drag a project onto another to reorder; order persists
- Rename — click any project title
- Cancel — running jobs can be cancelled mid-download or mid-transcription
- Remote access — bind to
0.0.0.0inapp/server.pyand reach it from your phone/tablet on the same network. Add authentication before exposing it beyond your LAN.
data/
├── episodes/<video-id>/
│ ├── audio.mp3 source audio
│ ├── meta.json title/channel/duration
│ ├── transcript.json segments incl. your edits
│ ├── extras.json generated add-ons
│ ├── pack.md / bundle.md exports
│ └── state.json pipeline status
├── folders.json folder tree
├── order.json manual sort order
└── settings.json writer model, prompts, limits
Deliberately boring, on purpose:
app/server.py stdlib HTTP server + pipeline (yt-dlp → ffmpeg → faster-whisper → writer)
app/www/ single-page vanilla JS/CSS front end (no build step)
data/ everything the app creates (gitignored)
No frameworks, no node_modules, no database. The writing stage is provider-neutral:
swap opencode_write() for any LLM API without touching the rest of the pipeline.
Built on open-source shoulders:
- faster-whisper (MIT) — Whisper inference
- OpenAI Whisper models — check model card usage considerations
- yt-dlp (Unlicense) — media download
- FFmpeg (LGPL/GPL) — audio conversion
- OpenCode — local AI writing bridge
Respect copyright: only process content you have rights to use, and follow each platform's terms of service.
- Transcription accuracy is excellent but not perfect — the human review pass is part of the workflow, not optional. Names, numbers and jargon deserve a listen-check before delivery.
- Auto chapters are time-based heuristics; the LLM stage improves them when enabled.
- One transcription job at a time (fine for a one-person service).
- Windows is the primary development platform; macOS/Linux should work but are less tested.
MIT — see LICENSE.