Self-hosted. Source quality. No cloud, no subscription. Runs entirely on your own hardware.
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.
Drop any YouTube link into the input. ytclip fetches the video metadata and loads the embedded player instantly.
Drag the timeline handles to your exact start and end. Type timestamps directly or use the ⏱ button to capture the current playback position.
Hit Create Clip. Watch real-time ffmpeg progress stream in. When it's done, click Download — the file goes straight to your device.
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.
Downloads only the video segments that cover your clip window — not the full file. Dramatically reduces bandwidth for large videos.
MP4 (H.264), MKV (stream-copy, no re-encode), MP3, or AAC. Choose per clip. Set a default in config.
Real-time ffmpeg output piped to your browser via Server-Sent Events. No polling. No page refresh.
Run multiple clip jobs simultaneously. Configurable concurrency. Jobs persist across server restarts in SQLite.
Script it. Automate it. The ytclip clip command runs standalone — no server needed.
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.
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).
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.
Every completed clip gets a hosted /share/{id} page with embedded player and social share buttons for Twitter/X, WhatsApp, Facebook, and direct copy.
Publish to YouTube Shorts, Instagram Reels, TikTok, and LinkedIn without leaving ytclip. Connect accounts once via OAuth, then publish any clip with two clicks.
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.
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.
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.
Slow down to 0.25× for cinematic highlights, or ramp up to 2× for time-lapses. Audio pitch is automatically preserved at every speed.
One-click animated GIF with two-pass palette optimisation for vivid colours and small files. WebP for Discord, Notion, and modern web embeds.
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.
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.
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.
The ytclip command runs yt-dlp and ffmpeg locally — no server, no UI required. Delegate to a running instance with --server-url.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.