Cut exact clips out of YouTube videos and hand them to DaVinci Resolve, edit-ready.
A local web app that wraps yt-dlp and ffmpeg in a frame-accurate trimming UI —
no uploads, no ads, no sketchy download sites. Everything stays on your machine.
Downloading a whole 40-minute video to use six seconds of it is a waste of time and disk. YT Clipmaker lets you scrub to the exact moment, set in/out points on a zoomable timeline, and pull down only that range — already transcoded to a codec your NLE actually enjoys working with.
| 🎯 Frame-accurate trimming | Step frame by frame with the arrow keys. The real frame rate is read from the video's metadata. |
| 🔍 Zoomable timeline | Scroll to zoom, Shift+scroll to pan, drag the overview strip below. Zoom in far enough and the ruler switches to milliseconds. |
| 🚩 Flagged in/out handles | IN and OUT markers carry labelled flags, so they are easy to grab — and the playhead always draws on top of them. |
| 🎨 Colour-coded selection | The I→O range gets its own colour, clearly separate from the orange playback progress. |
| ⭐ Starred export options | Pin the resolutions and formats you actually use; they sort to the top of the dropdown and persist. |
| 🎬 Resolve-ready output | Export straight to DNxHR HQ or ProRes 422 with PCM audio — no more media-pool surprises. |
| 📋 Segment queue | Mark several ranges in one video, then export them all in one go. |
| 📊 Live download queue | Progress, speed and ETA per job, with cancel and Show in Explorer. |
| ↩️ Undo / redo | Every in/out placement and segment edit is undoable with Ctrl+Z — and redoable with Ctrl+Y. |
| 🎨 Four colour themes | Orange or green, each in dark and light. Saved with the rest of your settings. |
| 🕘 History | The last 12 videos with thumbnails — individually removable. |
| ⌨️ Keyboard-first | Every action has a shortcut. Press ? for the full list. |
| 🌍 English & German | Switch in the settings; the choice is saved. |
| Tool | Purpose | Install |
|---|---|---|
| Python 3.10+ | Runs the backend | python.org |
| yt-dlp | Metadata + section download | winget install yt-dlp |
| FFmpeg | Muxing, keyframe cuts, transcoding | winget install Gyan.FFmpeg |
yt-dlp and ffmpeg are located through your PATH, so keeping them updated
through your package manager is all the maintenance they need.
Note — The reveal-in-Explorer and folder-picker features are Windows-specific. Everything else is cross-platform.
pip install fastapi "uvicorn[standard]"
python app.pyThe app opens at http://127.0.0.1:8321 automatically.
On Windows you can also just double-click start.bat.
- Paste a YouTube URL into the top bar — it loads on paste, no click needed.
Accepts
watch?v=,youtu.be,/shorts/,/live/and bare 11-character IDs. - Set the range. Press I and O at the playhead, drag the
flagged handles, or type a timecode into the fields —
90,1:30,00:01:30.500and1m30sare all understood. - Pick resolution and format in the sidebar. Star the ones you reach for often.
- Export. Watch it in the download queue, then hit Show in Explorer or Copy path and drag the file into your Resolve media pool.
| Format | Codec | Use it when |
|---|---|---|
| MP4 | H.264 + AAC | Default. Smallest file, fastest export, no transcode step. |
| MOV — DNxHR HQ | DNxHR HQ + PCM | Recommended for Resolve on Windows. Smooth scrubbing, no audio surprises. |
| MOV — ProRes 422 | ProRes 422 + PCM | Your project already runs on ProRes. |
| M4A | AAC | Audio only. |
DNxHR and ProRes are transcoded locally after the download; the source MP4 is kept alongside the result.
| Playback | Trimming | ||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Stored in settings.json next to app.py, so they survive browser restarts and
cache clears.
| Setting | Default | Notes |
|---|---|---|
language |
en |
en or de |
theme |
orange-dark |
orange-dark, orange-light, green-dark, green-light |
resolution |
1080 |
Falls back to the next available height per video |
container |
mp4 |
mp4, dnxhr, prores, audio |
output_dir |
~/Documents/Video/Clips |
Pick it through the native folder dialog |
prefer_h264 |
true |
Avoids VP9/AV1 — Resolve is much happier with H.264 |
force_keyframes |
true |
Exact cut edges instead of up to 10 s of drift |
restrict_filenames |
true |
ASCII-safe names, avoids media-pool issues |
concurrent_fragments |
4 |
Parallel download fragments |
fav_resolutions / fav_containers |
[] |
Starred options, sorted to the top |
Four schemes, switchable under ⚙ → Colour theme:
| Theme | Accent | Surface |
|---|---|---|
| Orange · Dark (default) | #ff7a35 |
near-black |
| Orange · Light | #d95c0c |
warm white |
| Green · Dark | #1bd96a |
cool grey |
| Green · Light | #009f52 |
soft mint white |
Every colour in the stylesheet resolves from CSS custom properties on :root,
so adding a fifth theme is one override block in style.css plus one entry in
the THEMES array in app.js.
The editor keeps up to 100 snapshots of the in/out points and the segment list. Zoom and playback position are deliberately excluded — undoing a zoom would be noise rather than help. Loading a new video starts a fresh stack, and making an edit after undoing discards the redo branch, exactly as you would expect.
English is the default. Switch to German under ⚙ → Language; the choice is
written to settings.json immediately and applies without a reload.
.
├── app.py FastAPI backend, job queue, yt-dlp/ffmpeg orchestration
├── start.bat Windows launcher
├── settings.json Generated on first run
└── static/
├── index.html Markup
├── style.css Dark UI theme
├── i18n.js EN/DE strings
└── app.js Player, timeline, zoom, export logic
| Method | Endpoint | Purpose |
|---|---|---|
GET POST |
/api/settings |
Read / patch settings |
POST |
/api/info |
Video metadata (duration, fps, heights, chapters) |
GET POST |
/api/jobs |
List / create export jobs |
POST |
/api/jobs/{id}/cancel |
Cancel a running job |
DELETE |
/api/jobs/{id} |
Remove a job from the list |
DELETE |
/api/recents/{id} |
Remove one history entry |
DELETE |
/api/recents |
Clear the history |
POST |
/api/reveal |
Open the output folder in Explorer |
POST |
/api/pick-folder |
Native folder picker |
GET |
/api/health |
Resolved yt-dlp / ffmpeg paths |
- The preview player is a YouTube embed. Frame stepping gets very close, but
YouTube seeks to the nearest reachable point internally, so it is not guaranteed
to be frame-exact. The download cuts exactly, because
--force-keyframes-at-cutsplaces real keyframes at the cut edges. - The resolution picker controls the download, not the preview quality — YouTube decides that itself inside the embed.
- Videos with embedding disabled show no preview, but still export fine.
YouTube's Terms of Service only permit downloads through their own offline feature. Use this for content you own, Creative Commons material, or where local law grants you an exception (quotation, private copy). That call is yours to make.