The sharpest way to
clip YouTube.

Self-hosted. Source quality. No cloud, no subscription. Runs entirely on your own hardware.

Open Source MIT License Python 3.12 Docker Ready Self-hosted
Self-Host It View on GitHub
localhost:8000/app
Timeline
0:008:32
Start
2:14
End
3:47
Clip duration 1:33
Create Clip

One tool. Your clips. Your machine.

ytclip is a self-hosted web app that lets you cut any moment from any YouTube video — at the highest available quality — without touching a cloud server. Paste a URL, drag the handles, hit Create. Done.

🎞️
Source quality
Downloads the best available video and audio streams and merges them. Zero unnecessary re-encoding.
Smart bandwidth
Fetches only the DASH segments covering your clip range — not the whole video. Falls back gracefully.
🔒
Fully private
Everything runs on your hardware. Clips go straight to your machine. Nothing passes through a third-party server.

Three steps to your clip

01

Paste a URL

Drop any YouTube link into the input. ytclip fetches the video metadata and loads the embedded player instantly.

02

Set your in/out points

Drag the timeline handles to your exact start and end. Type timestamps directly or use the ⏱ button to capture the current playback position.

03

Download your clip

Hit Create Clip. Watch real-time ffmpeg progress stream in. When it's done, click Download — the file goes straight to your device.

Everything you need. Nothing you don't.

Highest quality by default

Merges the best available video and audio streams. Set a quality cap in config if you prefer. MKV mode stream-copies with zero re-encoding.

DASH segment fetching

Downloads only the video segments that cover your clip window — not the full file. Dramatically reduces bandwidth for large videos.

Multiple output formats

MP4 (H.264), MKV (stream-copy, no re-encode), MP3, or AAC. Choose per clip. Set a default in config.

Live progress stream

Real-time ffmpeg output piped to your browser via Server-Sent Events. No polling. No page refresh.

Concurrent job queue

Run multiple clip jobs simultaneously. Configurable concurrency. Jobs persist across server restarts in SQLite.

Full CLI included

Script it. Automate it. The ytclip clip command runs standalone — no server needed.

Frame crop for Reels, Shorts & Stories

Drag a crop box over the video thumbnail — choose 9:16 portrait, 1:1 square, 4:5, 16:9 widescreen, or a fully custom region. Output resolution updates live as you drag. Perfect for repurposing landscape YouTube content into portrait-first social clips without leaving the browser.

Works without a browser too

The ytclip command runs yt-dlp and ffmpeg locally — no server, no UI required. Delegate to a running instance with --server-url.

Terminal
# clip 1:30 to 4:15, highest quality
$ ytclip clip "https://youtube.com/watch?v=…" --start 1:30 --end 4:15
# audio-only MP3
$ ytclip clip "…" --start 0:45 --end 3:00 --format mp3
# stream-copy into MKV (zero re-encoding)
$ ytclip clip "…" --start 0:00 --end 10:00 --format mkv
⠿ Downloading segments… ████████████░░░ 68%
⠿ Merging streams… ████████████████ 100%
✓ Saved: ~/yt-clips/Video_Title_0000-1000_a3f2.mp4

Common questions

Is it legal to use ytclip?

ytclip is a personal-use tool. Downloading content from YouTube may violate their Terms of Service and/or copyright law depending on what you download and where you are. You are solely responsible for the content you clip. ytclip has substantial legitimate uses — your own videos, public domain content, Creative Commons licensed material, fair-use clips. The tool itself is legally equivalent to yt-dlp, which has existed as open-source software without successful legal challenge.

Will it work for all YouTube videos?

ytclip can create clips from most YouTube videos using yt-dlp. However, the embedded player preview may be unavailable for videos where the uploader has disabled embedding — this is a YouTube restriction and cannot be bypassed. When that happens, ytclip shows a "Preview unavailable" card but the timeline and clip creation still work normally using server-fetched duration data.

Do I need to install ffmpeg?

No. ytclip bundles a static ffmpeg build via static-ffmpeg as a fallback. If you have a system ffmpeg installed, it will be preferred. The Docker image includes a full ffmpeg installation. For bare Python installs, everything works out of the box without any manual ffmpeg setup.

Can I expose ytclip to the internet?

Yes, but enable password auth first in your config.toml:
enabled = true and password = "your-strong-password" under [auth]. Running behind a reverse proxy (Caddy, nginx) with HTTPS is strongly recommended. Note: SSE progress streaming requires proxy_buffering off in nginx.

Is there a clip duration limit?

No hard limit by default. Set max_clip_duration in your config to impose one (value in seconds, 0 = no limit). Very long clips may take a while depending on your hardware and network speed.

What about age-restricted videos?

Export your YouTube cookies from your browser (using an extension like "Get cookies.txt LOCALLY") and point ytclip to the file via cookies_file in your config. This lets yt-dlp authenticate as your account and access restricted content you have permission to view.

If ytclip saves you time

Support is completely optional — ytclip will always be free and open source. But if you'd like to say thanks, here are a few ways.

Star on GitHub
Helps others discover the project
Star ↗
🐛
Report & suggest
File bugs or request features on GitHub
Open issue ↗
📣
Share it
Tell others who might find it useful