yt-short-clipper
Windows desktop app that turns long-form YouTube videos into 9:16 short-form clips — AI highlight detection, face-tracking portrait reframe, and word-by-word captions.
Windows desktop app that turns long-form YouTube videos into 9:16 short-form clips — AI highlight detection, face-tracking portrait reframe, and word-by-word captions.
Windows desktop app that turns long-form YouTube videos into 9:16 short-form clips — AI highlight detection, face-tracking portrait reframe, and word-by-word captions.
A Windows desktop app that turns a long-form YouTube video into ready-to-post 9:16 short-form clips — picking the highlights with an LLM, reframing to portrait, and burning in word-by-word captions.
Stack: React 19 + TypeScript + Vite · Tauri v2 (Rust shell) · Python sidecar (yt-dlp, FFmpeg, MediaPipe)
Windows only. The build scripts are PowerShell, the app ships as a portable zip with a WebView2 bootstrapper, and caption/hook rendering reads fonts from
C:\Windows\Fonts. Nothing is macOS/Linux-ready today.
Status: beta. Expect rough edges and breaking changes between releases.
cookies.txt (see
YouTube cookies).A single provider is configured once in AI Models and shared by highlight detection and title generation. Anything OpenAI-compatible works; the app ships presets for OpenAI, Google Gemini, Groq, ApiSmart, the maintainer's own YTClip AI gateway, and a Custom/Local option for vLLM, Ollama, or similar. Your API key is stored in the app's local data directory — it is never committed and never sent anywhere except the provider you configured.
Left empty, the model picks clips on its own. Filled in, the direction outranks the built-in selection principles:
2:00 - 2:50) is used exactly — that clip is exempt from
the usual 58–120s duration filter, and the run samples at a lower temperature so the
instruction is actually followed.Custom system messages (in AI Models) can place the direction with a
{user_direction} placeholder; without it the direction is appended at the end.
The app needs cookies from a logged-in YouTube session for yt-dlp to fetch subtitles and video. You supply your own — nothing is bundled.
youtube.com and export cookies.txt.Notes:
SID, HSID, SSID, APISID, SAPISID, and LOGIN_INFO.cookies.txt grants access to your Google account. It is gitignored here, stored only
in the app's local data directory, and passed to yt-dlp on your machine — but treat the
file itself like a password and never share it.# 1. Install Node dependencies
npm install
# 2. Install Python dependencies
py -m pip install -r requirements.txt
# 3. Download runtime binaries (FFmpeg, Deno)
# Existing files are skipped — add -Force to actually re-download them.
powershell -ExecutionPolicy Bypass -File scripts/fetch-deps.ps1
# 4. Build the Python sidecar executable
npm run build:sidecar
FFmpeg must be a GnuTLS build (the fetch script pulls one from gyan.dev). Schannel builds hang forever on the byte-range requests used for section downloads.
npm run dev # Start Vite dev server
npm run tauri dev # Start Tauri dev window
Python changes need a sidecar rebuild.
src-tauri/binaries/ytclip-sidecar-*.exetakes precedence over the dev Python module, so edits underyt_short_clipper_core/do nothing until you runnpm run build:sidecar— the app keeps running the frozen copy without complaining. Delete that binary to fall back topy -m yt_short_clipper_core.sidecarfor fast iteration. Frontend and Rust changes hot-reload as usual.
py -m pip install --upgrade yt-dlp # 1. upgrade the package
# 2. bump the floor in requirements.txt
npm run build:sidecar # 3. re-freeze it into the sidecar
Check the yt-dlp changelog for a raised Deno floor while you are there (2026.06.09
raised it to v2.3.0). Deno drives remote_components for YouTube's JS challenges, so an
under-floor binary breaks extraction quietly — and fetch-deps.ps1 will not replace an
existing deno.exe without -Force.
# One command: sidecar → frontend → Tauri build → assemble portable zips
npm run release
This produces two zips in src-tauri/target/release/bundle/:
YTShortClipperV2_<version>_x64_portable.zip — full bundle for new usersYTShortClipperV2_<version>_x64_update.zip — app + sidecar only, for existing usersSee BUILD_GUIDE.md for the full release flow, version bumping (4 files), and the build-only-what-changed shortcuts.
Being transparent about every host the app talks to, since some of it is the maintainer's own backend rather than a third party:
| Endpoint | When | What is sent |
|---|---|---|
YouTube / googlevideo (via yt-dlp) |
Fetching video + subtitles | Your YouTube cookies |
| Your configured AI provider | Highlight + title generation | Subtitle transcript, your prompt, your API key |
api.ytclip.org/webhook/yt-clipper/latest-version |
On launch | Random installation ID, app version |
api.ytclip.org/webhook/yt-clipper/notification |
On launch | Random installation ID, app version |
api.ytclip.org/webhook/yt-clipper/menu |
On launch | Random installation ID, app version |
api.ytclip.org/webhook/yt-clipper/success-log |
After a clip renders | Random installation ID, app version, clip duration, reframe mode |
api.ytclip.org/webhook/yt-clipper/presigned-url + api.repliz.com |
Only if you use Repliz upload | Filename, the video file, your Repliz keys |
No video content, transcript, or account identity is sent to api.ytclip.org. The
installation ID is a random value generated locally, not tied to any account. If you fork
this, point these at your own backend or strip them out — see
src/hooks/.
The external links at the bottom of the sidebar are served by
api.ytclip.org/webhook/yt-clipper/menu, so they can change without an app release.
The four page routes above them stay hardcoded.
Icons are named by the API as kebab-case strings and resolved through the allowlist in
src/config/menuIcons.ts — an icon must exist there before
the server can use it. Responses are validated (https-only URLs, capped count and label
length, bad entries dropped individually), cached, and fall back to
DEFAULT_MENU_ITEMS in src/hooks/menu.ts when offline.
Interested in sponsoring this project? Reach out at sponsorship@ytclip.org.
This tool automates downloading and re-cutting YouTube videos. Only use it on content you own or are otherwise licensed to reuse; downloading or republishing third-party videos may violate YouTube's Terms of Service and copyright law in your jurisdiction. You are responsible for what you process and post. The maintainer provides no warranty and accepts no liability — see LICENSE.
Not affiliated with, endorsed by, or sponsored by YouTube, Google, OpenAI, or Repliz.
MIT © Aji Prakoso