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 YouTube Shorts TikTok Instagram Reels LinkedIn
Start Clipping 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.

Clip Queue & batch export

Add multiple clip segments to a queue, then hit Export All. Each runs as an independent job with live SSE progress — no waiting between clips.

Subtitle burn-in

Download and burn English subtitles directly into the video. Full style control: font size, colour (white/yellow/green/black), background (none/shadow/box), and position (top/bottom).

Presets

Save any combination of format, speed, crop, watermark, and subtitle settings as a named preset. Load back with one click. Stored server-side — persist across sessions.

Shareable clip links

Every completed clip gets a hosted /share/{id} page with embedded player and social share buttons for Twitter/X, WhatsApp, Facebook, and direct copy.

Direct platform publishing

Publish to YouTube Shorts, Instagram Reels, TikTok, and LinkedIn without leaving ytclip. Connect accounts once via OAuth, then publish any clip with two clicks.

Brand kits

Save named brand profiles — logo, watermark position, subtitle style, default format. Switch brands in the editor with one click. Ideal for managing multiple channels or clients.

Publish everywhere, right from your server

Crop for Reels. Slow down for drama. Brand every clip. Export as GIF. Four tools that turn one YouTube video into content for any platform — no third-party apps, no re-uploads.

9:16 1:1 4:5 16:9 Custom
Output: 607 × 1080

Portrait & square crop

Drag a crop box over the thumbnail. Pick 9:16 for Reels & Shorts, 1:1 for Instagram feed, 4:5 for portrait, or draw a custom region. Output resolution updates live.

9:16 Reels1:1 Square4:5 FeedCustom region
0.25× 0.5× 1.5×
0:004:20
Slow-motion · 0.5× · audio pitch-corrected

Speed control

Slow down to 0.25× for cinematic highlights, or ramp up to 2× for time-lapses. Audio pitch is automatically preserved at every speed.

0.25× Cinematic0.5× Slow-mo2× Timelapse
⟳ LOOP
MP4 MKV MP3 AAC GIF WebP
15 fps· 480 px· palette-optimised

GIF & WebP export

One-click animated GIF with two-pass palette optimisation for vivid colours and small files. WebP for Discord, Notion, and modern web embeds.

Reactions & MemesDiscordNotionSmall file size
@yourhandle
position: bottom right

Watermark & branding

Stamp your handle, channel name, or upload a logo PNG. Four corner positions. The app remembers your last 5 watermarks for instant re-use — no re-uploading.

Text overlayLogo PNG4 positionsHistory memory
Shorts
Reels
TikTok
LinkedIn
PUBLISH STATUS
YouTube Shorts Published
TikTok Uploading
Instagram

Direct platform publishing

Connect your accounts once via OAuth in Settings. When a clip finishes, click the platform icon and hit Publish — ytclip uploads directly, no download-then-re-upload loop.

YouTube ShortsInstagram ReelsTikTokLinkedIn
EcoChannel
TechPodcast
My Brand ACTIVE
MP4 #fff · 24px BR corner
All settings applied instantly

Brand kits

Save a complete brand profile — logo, watermark position, subtitle style, and default format — under one name. Switch between brands or clients in a single click.

Logo uploadSubtitle stylePer-client profilesInstant apply

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.

How do I set up direct platform publishing?

Each platform requires a free developer app. The steps are the same for all four: create an app on the platform's developer portal, add {your-ytclip-url}/publish/callback/{platform} as an OAuth redirect URI, then copy the client ID and secret into config.toml under [platforms.youtube], [platforms.instagram], etc. Set public_url to your ytclip address. Restart ytclip, go to Settings → Platform Connections, and click Connect for each platform. Full step-by-step instructions are in the README.

Can I publish to multiple platforms at once?

Not simultaneously in a single action — but you can click each platform's publish button in quick succession. Each upload runs as a background task and doesn't block the others. The status (uploading → published / failed) updates live on the job card for each platform independently.

What is a brand kit and how is it different from a preset?

A preset saves a full form state — including start/end times, speed, crop, and all other settings — making it a per-video or per-task snapshot. A brand kit is identity-focused: it stores your logo, watermark position, subtitle style, and default format as a named profile. Apply a brand kit to instantly stamp every clip with consistent branding, then adjust the clip-specific settings on top. Manage brand kits at Settings → Brand Kits.

How does the Clip Queue work?

Instead of clicking Create Clip immediately, click Add to Queue. The current form state (start/end/format/speed/crop/watermark/subtitle settings) is captured and added to the queue panel. Repeat for as many segments as you like from the same — or different — videos. When you're ready, click Export All: each queued item fires as an independent clip job with its own real-time progress card. You can queue clips while previous ones are still processing.

How do subtitle burn-in and style controls work?

When subtitles are enabled, ytclip downloads the English subtitle file via yt-dlp and then passes it through ffmpeg's subtitles filter, which renders the text directly into the video frames. You control font size (16–36px), colour, background style (none / drop-shadow / solid box), and vertical position (top or bottom). This is a permanent burn-in — the subtitle cannot be toggled off in the player, which is intentional for social media clips where captions are displayed without user interaction.

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