PaunClip is a local-first AI clipping workspace for turning long videos, podcasts, interviews, tutorials, and channel batches into short-form clips. It combines YouTube ingest, transcript-first analysis, highlight selection, caption rendering, hook generation, smart reframing, and local output management in one developer-friendly app.
PaunClip can run in three ways:
- Web development app with
npm run dev - Desktop app through the Electron
.exe - CLI/headless mode with the
paunclipcommand
Current status: PaunClip is under active development. Source installs are supported, and Windows desktop release artifacts are built from GitHub Releases.
PaunClip is designed for creators and operators who want to:
- Import a YouTube URL or local video.
- Analyze the transcript to find short-form moments.
- Review highlights before spending time rendering.
- Render vertical clips with captions and optional hook audio.
- Process multiple channel videos through Campaign mode.
- Keep everything local: database, storage, output, cookies, and API keys stay on the machine.
- Workflow: guided single-video clipping flow.
- Projects: browse previous sessions and continue unfinished work.
- Campaigns: fetch channel videos, pick candidates, choose clip counts per video, and batch-create sessions.
- AI API settings: bring your own provider for highlight finding, transcription, hooks, and titles.
- OpenAI-compatible providers: works with provider-specific base URLs when the endpoint supports the required task.
- Caption presets: ASS/libass-based caption styles such as Karaoke, Deep Diver, Pod P, Popline, Seamless Bounce, Beasty, Youshaei, Mozi, Glitch Infinite, and Baby Earthquake.
- Hook audio: optional intro hook with frozen first frame before the source clip begins.
- Smart reframe: fast crop modes plus Smart Face mode for keeping speakers visible.
- Transcript-first YouTube flow: use subtitles/transcripts when available before downloading full video.
- Section rendering: render selected YouTube moments from timestamped sections when possible.
- CLI/headless mode: run doctor checks, create clips, manage campaigns, and render from a colorful terminal interface or clean JSON automation mode.
- Desktop packaging: Electron runtime with bundled media tools support.
- Node.js 22+
- npm
- Git
PaunClip uses:
- FFmpeg for cutting, rendering, caption burn-in, thumbnails, and hook audio.
- FFprobe for media validation and duration probing.
- yt-dlp for YouTube metadata, subtitles, audio, video, and section downloads.
- SQLite + Prisma for local project/session/job storage.
For source installs, npm run desktop:tools downloads the pinned yt-dlp binary into vendor/bin. The CLI installer wires YTDLP_PATH to that bundled binary, and PaunClip resolves bundled yt-dlp before any system yt-dlp on PATH. FFmpeg/FFprobe are resolved from package dependencies or configured paths.
Clone the repository first:
git clone https://github.com/paundrapf/PaunClip.git
cd PaunClipOpen PowerShell in the repository root:
.\install.ps1The installer will:
- validate Node.js 22+ and npm,
- run
npm ci, - download media tools,
- create
%LOCALAPPDATA%\PaunClip\bin\paunclip.cmd, - point the CLI shim at the bundled
vendor/bin/win32/<arch>/yt-dlp.exe, - add that folder to the current user's PATH,
- run
npm run cli:smoke.
After install, open a new PowerShell window and test:
paunclip --help
paunclip doctorUseful installer options:
.\install.ps1 --skip-install
.\install.ps1 --skip-smoke
.\install.ps1 --force
.\install.ps1 --dry-runUninstall the CLI shim and PATH entry:
.\uninstall.ps1Run from the repository root:
chmod +x ./install.sh ./uninstall.sh
./install.shThe installer will:
- validate Node.js 22+ and npm,
- run
npm ci, - download media tools,
- create
~/.local/bin/paunclip, - point the CLI wrapper at the bundled
vendor/bin/linux/<arch>/yt-dlp, - add
~/.local/binto~/.profilewhen needed, - run
npm run cli:smoke.
Refresh your shell:
source ~/.profileThen test:
paunclip --help
paunclip doctorUseful installer options:
./install.sh --skip-install
./install.sh --skip-smoke
./install.sh --force
./install.sh --dry-runUninstall the CLI wrapper and PATH block:
./uninstall.shnpm run devOpen:
http://localhost:3000Use this mode while developing UI, backend, pipeline logic, and settings.
Download the latest Windows desktop build from GitHub Releases when available, or build/package it locally:
npm run desktop:packWindows artifacts are created under:
dist/desktopThe desktop app stores user data under the OS user data directory, not inside the install folder.
Release builds are created by the desktop release workflow for tags such as v0.1.0.
After install:
paunclip doctor
paunclip create clips "https://youtube.com/watch?v=..." --clips 3
paunclip create campaign "Creator Batch" "https://youtube.com/@channel" --fetch 10Without installing to PATH:
node ./bin/paunclip.cjs --helpGlobal options:
--profile <path> Use a specific PaunClip profile directory
--json Machine-readable output
--no-color Disable ANSI colors in human output
--quiet Reduce human output
--verbose More diagnostics
--yes Accept safe defaults
--help Show help
--version Show versionGeneral:
paunclip --help
paunclip --version
paunclip setup
paunclip setup ai
paunclip setup ai task highlight-finder
paunclip setup ai task caption-maker
paunclip setup ai task hook-maker
paunclip setup ai task youtube-title-maker
paunclip setup ai quick --provider groq
paunclip setup ai validate
paunclip setup cookies
paunclip setup output
paunclip setup check
paunclip doctorHuman CLI output includes an ASCII PaunClip banner, colored status badges, and scan-friendly tables. Automation stays strict: --json disables colors, banners, and progress noise on stdout. You can also set NO_COLOR=1 or pass --no-color for plain output, and FORCE_COLOR=1 to force color in terminals that do not report TTY support.
Single-video clips:
paunclip create clips <youtube-url|video-path>
paunclip create clips <source> --clips 3
paunclip create clips <source> --prompt "find business lessons"
paunclip create clips <source> --prompt-file prompt.txt
paunclip create clips <source> --language id
paunclip create clips <source> --caption-style karaoke
paunclip create clips <source> --clip-length auto
paunclip create clips <source> --content-preset podcast
paunclip create clips <source> --reframe smart_face
paunclip create clips <source> --hook
paunclip create clips <source> --no-hook
paunclip create clips <source> --auto-render
paunclip create clips <source> --queue
paunclip create clips <source> --processing-start 00:10
paunclip create clips <source> --processing-end 10:00
paunclip create clips <source> --srt transcript.srtRender:
paunclip render <sessionId>
paunclip render <sessionId> --all
paunclip render <sessionId> --select 1,3
paunclip render <sessionId> --queueCampaigns:
paunclip create campaign <name> <youtube-channel-or-playlist>
paunclip create campaign <name> <source> --fetch 20
paunclip create campaign <name> <source> --type videos
paunclip create campaign <name> <source> --type shorts
paunclip create campaign <name> <source> --type all
paunclip campaign list
paunclip campaign show <campaignId>
paunclip campaign fetch <campaignId> --limit 20
paunclip campaign videos <campaignId>
paunclip campaign start <campaignId> --videos 1,2,3 --clips 3
paunclip campaign start <campaignId> --videos all --clips 3 --queue
paunclip campaign start <campaignId> --videos yt:<videoId> --clips 3
paunclip campaign start <campaignId> --per-video 1=5,2=3
paunclip campaign watch <campaignId>Sessions:
paunclip sessions list
paunclip session show <sessionId>
paunclip session logs <sessionId>
paunclip session retry <sessionId>
paunclip session cancel <sessionId>Jobs:
paunclip jobs list
paunclip job watch <jobId>
paunclip job cancel <jobId>Configuration:
paunclip setup
paunclip setup ai
paunclip setup ai task highlight-finder
paunclip setup ai task caption-maker
paunclip setup ai task hook-maker
paunclip setup ai task youtube-title-maker
paunclip setup ai quick --provider groq
paunclip setup ai quick --provider groq --api-key-env GROQ_API_KEY --yes
paunclip setup ai task caption-maker --provider groq --api-key-env GROQ_API_KEY --model whisper-large-v3-turbo --yes
paunclip setup ai task hook-maker --provider groq --api-key-env GROQ_API_KEY --model canopylabs/orpheus-v1-english --voice hannah --yes
paunclip setup ai validate
paunclip setup ai validate hook-maker
paunclip setup cookies --path cookies.txt --yes
paunclip setup cookies validate-live <youtube-url>
paunclip setup output --path ./output --yes
paunclip setup check --json
paunclip doctor --youtube-url <youtube-url>
paunclip config init
paunclip config show
paunclip config doctor
paunclip config ai init [file]
paunclip config ai edit
paunclip config ai apply [file] --validate
paunclip config ai validate [file]
paunclip config ai show
paunclip config ai export <file>
paunclip config provider list
paunclip config provider validate <task>
paunclip config cookies detect <file>
paunclip config cookies validate <file>
paunclip config cookies set <file>
paunclip config cookies import <file>
paunclip config cookies status
paunclip config cookies clear
paunclip config output set <path>
paunclip config output path
paunclip config output open
paunclip config logs open
paunclip config presets listProvider task names:
highlight-finder
caption-maker
hook-maker
youtube-title-makerRecommended provider setup is the guided wizard:
paunclip setupFor only AI setup:
paunclip setup aipaunclip setup ai is task-based. Normal users can configure one thing at a time:
- Highlight Finder: chat model for choosing moments.
- Caption Maker: transcription model for accurate captions.
- Hook Maker: TTS model plus voice.
- YouTube Title Maker: chat model for titles.
Custom OpenAI-compatible providers are filtered by capability. For example, chat-only endpoints such as OpenCode can be used for Highlight Finder and YouTube Title Maker, but should not be selected for Caption Maker or Hook Maker.
For VPS/automation, keep the key in an environment variable:
export GROQ_API_KEY="your-groq-api-key"
paunclip setup ai quick --provider groq --api-key-env GROQ_API_KEY --yesAdvanced JSON config is still supported:
paunclip config ai init
paunclip config ai edit
paunclip config ai apply --validateOn Windows, paunclip config ai edit opens Notepad by default. On Linux, it uses $VISUAL, $EDITOR, or nano. paunclip.ai.local.json is gitignored because it may contain local API keys. A safe template without secrets lives in paunclip.ai.example.json.
paunclip config provider set ... still exists for old scripts, but new users should start with paunclip setup.
Cookie setup supports common browser-extension exports:
paunclip setup cookies
paunclip config cookies detect cookies.txt
paunclip setup cookies validate-live "https://youtube.com/watch?v=..."If the file is already Netscape cookies.txt, PaunClip stores a reference to that path. If the file is JSON or a raw Cookie: header, PaunClip converts it to a private Netscape file because yt-dlp expects that format.
The normal cookie check only verifies that the file is readable and contains YouTube login-shaped cookies. The live check verifies the thing that matters for rendering: metadata, subtitles, and video media stream access for a real URL. This is especially important on VPS/datacenter machines, where YouTube can allow subtitles but block video download with a bot challenge.
-
Install PaunClip and run:
paunclip setup
-
Confirm everything is ready:
paunclip setup check paunclip doctor --youtube-url "https://youtube.com/watch?v=..." -
Add cookies later if YouTube requires them:
paunclip setup cookies
-
Create a single-video session:
paunclip create clips "https://youtube.com/watch?v=..." --clips 3 -
Review highlights in the app or render from CLI:
paunclip render <sessionId> --all
-
For channel batches:
paunclip create campaign "My Batch" "https://youtube.com/@channel" --fetch 20 paunclip campaign videos <campaignId> paunclip campaign start <campaignId> --videos 1,2,3 --clips 3
PaunClip is local-first. It stores data in a profile directory:
- settings
- provider config
- cookies
- SQLite database
- source media
- rendered clips
- logs
Use a separate profile for testing:
paunclip --profile ./tmp-profile doctorDo not commit profile folders, .env, cookies, API keys, storage, or rendered clips.
Open a new terminal after running the installer.
On Windows, confirm this folder is in user PATH:
%LOCALAPPDATA%\PaunClip\binOn Linux, confirm:
echo "$PATH" | grep "$HOME/.local/bin"Install Node.js 22+ and open a new terminal.
- Run
paunclip doctor. - Run
paunclip doctor --youtube-url "<url>"to live-test metadata, subtitles, and media download. - Check
yt-dlpstatus. - Import cookies if YouTube blocks access.
- Run
paunclip setup cookies validate-live "<url>"after refreshing cookies. - Try fetching fewer videos in Campaign mode.
- If analysis succeeds but render fails, YouTube likely allowed subtitles but blocked video media download on that machine. Refresh cookies, render on the local desktop app/laptop, or upload a local MP4 fallback.
-
Run the guided AI setup again:
paunclip setup ai paunclip setup check
-
Make sure the provider supports the task:
- chat for Highlight Finder,
- transcription for Caption Maker,
- TTS/voice for Hook Maker.
-
For OpenAI-compatible custom providers, use the base URL, not the full chat completion endpoint.
Use a transcription provider that returns timestamps. SRT fallback is a last resort and can be less precise.
Check:
paunclip setup output
paunclip config output pathDesktop and CLI profiles may use different storage/output paths.
Install dependencies:
npm ciRun checks:
npm run typecheck
npm run lint
npm test
npm run build
npm run cli:smokeRun web app:
npm run devRun CLI without installing:
node ./bin/paunclip.cjs --helpPackage desktop:
npm run desktop:pack
npm run desktop:smokedesktop:smoke expects a freshly packaged Windows build under dist/desktop.
Recommended workflow:
- Build changes on a feature branch.
- Open a pull request into
main. - Let CI run typecheck, lint, tests, build, and CLI smoke.
- Merge when CI and manual smoke checks are stable.
- Create a
v*.*.*tag to publish Windows desktop artifacts through GitHub Releases. - Add auto-update metadata once release artifacts are stable.
- PaunClip is local-first, but API keys and cookies are sensitive.
- Do not commit
.env, cookies, storage, logs, rendered clips, or profile directories. - Prefer
paunclip setup, environment variables, or the Settings UI for secrets. - Keep cookies private and rotate them if they are exposed.
- Report security issues privately. See SECURITY.md.
MIT. See LICENSE.
