Skip to main content
Glama
podcli process episode.mp4

That one command transcribes the episode, picks the moments worth clipping, crops to the visible face, and burns the captions in. Transcription and rendering run on your machine. Clip scoring uses Claude Code or Codex login, or an Anthropic API key; without those it falls back to heuristics.

Install

No prerequisites. The installer fetches a self-contained binary, and the first run provisions Python, Node, FFmpeg, whisper.cpp, and the models it needs into a managed folder.

macOS and Linux

curl -fsSL https://podcli.com/install.sh | sh

Windows (PowerShell)

irm https://podcli.com/install.ps1 | iex

Runs on macOS (Apple Silicon), Linux (x64 and arm64), and Windows (x64). Intel Macs aren't supported.

Related MCP server: CrabCut

Quick start

podcli                       # interactive menu, opens the web studio
podcli process episode.mp4   # transcribe, pick moments, render clips
podcli multicam ~/ep12       # sync every camera and mic, cut to the speaker, render the episode

Clips land in podcli-clips/ in the directory you ran it from, so each show keeps its own renders. Everything else (knowledge, presets, assets, clip history, cache) lives in one managed folder that follows you between directories. Set PODCLI_OUTPUT to render somewhere fixed instead.

What you get

Clips

  • 9:16, 16:9, or 1:1, with captions sized for each canvas

  • Face tracking that follows the visible face, split-screen layouts included. Following the active speaker needs AssemblyAI, or a source install with openai-whisper and HF_TOKEN

  • Multi-segment cuts that drop filler, long pauses, and tangents

  • Four caption styles: branded, hormozi, karaoke, subtle

  • Logos, intros, outros, and background music from a reusable asset library

  • Loudness-normalized audio and hardware encoding on VideoToolbox and NVENC, with a CPU fallback

Editing the full episode

  • Multicam edit: point at one folder of camera and mic files, confirm who each file belongs to, and podcli syncs them by audio and corrects clock drift between devices

  • Automatic camera cuts that follow whoever is talking, with wide shots for crosstalk and a guest's answer held on the guest

  • Remote shows too: one file per person becomes a split screen, and a single gallery recording is split into a camera per tile. Questions stay on the split and the guest goes full frame on long answers

  • Render the episode as an MP4 with one WAV per person. Studio shoots can also go to Premiere or Final Cut as a timeline that points at your original files

  • Same edit from the studio (Multicam edit), the CLI (podcli multicam <folder>), or an agent (manage_multicam). Re-running reuses the sync and the cut, so only the step you changed runs again

  • With podcli Pro, steer the cut in the cloud editor: podcli multicam <folder> --cloud uploads per-camera proxies, a mic mix (about 550 MB for a two-hour, three-camera episode), and the transcript. Your original camera files stay on your computer, and --pull renders the cut you made there

Finding the moments

  • Whisper transcription (speaker diarization on AssemblyAI, or openai-whisper from a source install or podcli setup --speakers), or bring your own transcript as .txt, .srt, or .vtt

  • AssemblyAI as an alternative engine, and yt-dlp to pull an episode straight from a URL

  • AI scoring against your knowledge base, checked against your episode database so it stops resuggesting moments you already published

  • Audio energy and laughter detection to build highlight reels

The studio at localhost:3847

  • Library, episode workspace, multicam edit, per-clip detail, highlights, thumbnails, content, analytics, assets, knowledge, config, integrations, and MCP setup

  • ⌘K command palette across pages, clips, and assets

  • Titles, descriptions, tags, and hashtags, with any section regenerated on your own guidance

  • Thumbnail studio for 16:9 and 9:16, with frame and text options

  • Transcript corrections that carry through to every render

Shipping it

  • 32 MCP tools, so an agent can transcribe, score, and render through conversation

  • YouTube analytics to see which clips landed

  • DaVinci Resolve export as FCPXML when you want to finish by hand

  • Presets, clip history with duplicate detection, and a transcript cache

Why podcli

If you are weighing podcli against the cloud clippers, this is the difference:

  • Runs locally. Transcription and rendering happen on your machine by default, so episodes stay there. Data leaves your machine only through these destinations:

    • AssemblyAI, if you pick that engine: the episode audio.

    • AI scoring and titles: the transcript goes to podcli Pro when you are signed in, to Anthropic when you set ANTHROPIC_API_KEY, and to the provider behind your Claude Code or Codex login.

    • podcli Pro, when signed in: knowledge and asset sync, plus rendered clips and transcript slices if you turn on PODCLI_CLOUD_SYNC=1 (off by default).

    • YouTube, if you link it: read-only analytics requests.

    • podcli multicam cloud, if you run podcli multicam --cloud: per-camera proxies, a mic mix, and the transcript.

  • Free and open source under AGPL-3.0. Exports are unlimited, full quality, and watermark-free.

  • Agent-native. 32 MCP tools let Claude Code or Codex drive the whole flow, from transcription to rendered clips and publish-ready titles.

  • A knowledge base keeps titles, captions, and descriptions in your show's voice, and stops the engine from resuggesting moments you already published.

  • DaVinci Resolve handoff. Export any clip as FCPXML when you want to finish the edit yourself.

Use it from your agent

podcli is an MCP server, so an agent can transcribe, suggest clips, and render them through conversation.

podcli mcp install    # registers it with Claude Code and Codex, whichever CLI is on PATH

--help and --version never download anything. First run of process, studio, transcribe, or multicam provisions the engine. podcli mcp does not, because stdout is JSON-RPC. Run podcli setup once before you point an agent at it.

podcli process episode.mp4 --json --yes
podcli doctor --json

--json writes one object to stdout and logs to stderr. -y/--yes skips prompts. NO_COLOR=1 (or a non-TTY) turns off colour and spinners.

rank_clip_candidates returns a shortlist so the agent does not have to read the whole transcript. process_episode runs the pipeline as one job; poll it with job_status. The workflow lives in SKILL.md. Tool names are generated into llms.txt.

Claude Desktop and Codex setup is in the MCP docs.

Content workflow

PodStack ships with podcli as a set of Claude Code slash commands. They take a transcript to a publish-ready package: scored moments, titles, descriptions, thumbnail briefs, a brand review, and a publish checklist.

/produce-shorts

The commands live in .claude/commands/. CLAUDE.md describes each one.

Docs

Guide

What's in it

Getting started

Install, first episode, the whole flow

The studio

Web UI: library, episodes, content, highlights

CLI

Commands, flags, presets, assets

MCP server

Agent setup and available tools

Captions and formats

Styles, aspect ratios, cropping

Configuration

Environment variables, config profiles, transcript format

Docs are open source at nmbrthirteen/podcli-docs.

Contributing

See CONTRIBUTING.md for the dev setup and conventions, and RELEASE.md for how releases are cut.

Credits

Content workflow powered by PodStack, inspired by gstack by Garry Tan.

License

AGPL-3.0. See LICENSE.

Need podcli without AGPL terms? A commercial license is available. Email siradze@nikusha.me with a one-line description of your use case.

Available Tools

32 tools
ai_cli_statusA

Show whether Claude Code / Codex CLIs are available for AI-powered clip suggestion and content generation.

Returns configured manual paths (PODCLI_CLAUDE_PATH / PODCLI_CODEX_PATH) and auto-discovered binaries. Use manage_env(action=set, key=PODCLI_CLAUDE_PATH, value=...) to override when detection fails.

Inputs: no named parameters.

analyze_energyA

Analyze audio energy levels for a video or specific segments. Useful for finding high-energy moments. Defaults to the current UI video and suggestions if not specified.

Inputs: segments, video_path.

batch_create_clipsA

STEP 3 — Export multiple clips at once as finished vertical shorts.

EASIEST: pass export_selected=true to export all selected clips in one go. Alternative: pass clip_numbers=[1, 3, 5] for specific ones. Everything (video, timestamps, settings) auto-loads from session state.

Pass exactly one of clips, clip_numbers, or export_selected. If several are given, an explicit clips array wins, then export_selected, then clip_numbers.

Each clip gets: 9:16 vertical crop, burned-in captions, normalized audio, H.264 MP4.

Inputs: clips, async_mode, video_path, clip_numbers, +5 more.

clip_historyB

View previously created clips to avoid duplicates. Check before creating new clips.

Inputs: action (required), limit, format, clip_id, +5 more.

compare_transcription_enginesA

Transcribe the same sample window of a file with two engines and report where their output disagrees, in 20s windows by default. This measures disagreement between the two engines' output, not accuracy against a ground-truth transcript. Neither engine is assumed correct. Writes comparison.json and a self-contained comparison.html (with a sample audio player and per-window seek buttons) to output_dir.

Inputs: engine_a (required), engine_b (required), file_path (required), language, +5 more.

create_clipA

STEP 3 — Export a single clip as a finished vertical short (1080x1920, 9:16).

EASIEST: just pass clip_number (e.g. 3) — everything else auto-loads from session state. Output: H.264 MP4 with burned-in captions, normalized audio (-14 LUFS).

For batch export, use batch_create_clips instead. Caption styles: branded (professional), hormozi (bold/yellow), karaoke (progressive highlight), subtle (minimal). Crop modes: speaker (speaker-aware), face (face tracking), center (fixed center crop). Set keep_caption_overlay=true to retain a ProRes alpha overlay for DaVinci Resolve (export_to_davinci_resolve).

Inputs: hook, title, format, logo_path, +12 more.

export_to_davinci_resolveA

Export podcli shorts as a DaVinci Resolve FCPXML project.

Each short becomes a compound clip with V1 source + V2 ProRes 4444 alpha caption overlay — fully editable in free or Studio Resolve 20.x.

Requires the davinci_resolve integration to be enabled (manage_integrations action=enable name=davinci_resolve).

Inputs: shorts (required), output_path (required), project_name (required), fps, +2 more.

get_ui_stateA

Read the current podcli session state and get guidance on what to do next. Returns: video path, transcript status, clip suggestions, settings, and workflow next steps.

IMPORTANT: Call this FIRST when starting a new conversation to understand the current state. Clips are numbered #1, #2, etc. Use these numbers with create_clip(clip_number), batch_create_clips(clip_numbers), modify_clip, and toggle_clip.

Set include_transcript=true to analyze transcript content. Returns a compact phrase-grouped markdown view (~10x smaller than raw segments) with speaker attribution, silence gaps, and optional energy peaks — the primary surface for reasoning about clip boundaries.

Inputs: include_transcript.

import_transcriptA

Import an external transcript (e.g. from a transcription service) into the UI. Skips Whisper entirely. The transcript must include word-level timestamps.

Inputs: file_path (required), transcript (required).

job_statusA

Poll the status of any background job (transcription, clip render, batch export, process_episode). Supports long-polling: pass wait_seconds (1–60) to block until the job changes state or the timeout elapses, whichever comes first. Paces Claude's polling naturally so the spinner doesn't spam and the user sees steady progress text.

Returns { status: 'running'|'done'|'error', progress, message, done, result? }. Use after transcribe_start, process_episode, or batch_create_clips(async_mode: true).

Inputs: job_id (required), wait_seconds.

knowledge_baseB

Read or manage the podcli knowledge base. These are .md files that provide context about the podcast (hosts, style, audience, etc). Always read the knowledge base before suggesting or creating clips.

Inputs: action (required), content, filename.

list_outputsA

List all rendered clip files in the output directory with file sizes and dates.

Inputs: no named parameters.

manage_assetsA

Register and manage reusable assets (logos, outros, intros, music, images). Reference them by name in create_clip/manage_reel instead of full paths. One logo/outro/intro/music can be the default, applied automatically when none is passed.

Inputs: action (required), url, name, path, +2 more.

manage_configA

Manage portable config profiles and legacy path migration.

Actions: • status — active config home, cache dir, migration state (default) • migrate — move legacy project/.podcli/cache into data/cache (idempotent) • export — zip the active config home (knowledge, presets, assets, settings) • import — restore a bundle; backs up existing config before overwrite • use — activate a config home path (writes .podcli-home marker)

Inputs: home, action, dry_run, activate, +1 more.

manage_envA

List, set, or unset global podcli settings stored in .env.

Keys: • HF_TOKEN — HuggingFace token for speaker detection • PODCLI_CLAUDE_PATH — manual path to Claude Code CLI when auto-discovery fails • PODCLI_CODEX_PATH — manual path to Codex CLI when auto-discovery fails

Actions: • list — show all settings, configured values, and AI CLI detection (default) • set — set a key (path must exist for PODCLI_*_PATH keys) • unset — remove a key (falls back to auto-discovery)

Inputs: key, value, action.

manage_integrationsA

List, enable, or disable podcli integrations (editor exporters, platform uploads, productivity tools, AI helpers).

Actions: • list — return all installed integrations with their enabled state (default) • enable — turn an integration on (its tools become callable) • disable — turn an integration off (calls return a disabled error)

State persists at the active config home (integrations.json, gitignored).

Inputs: name, action.

manage_multicamA

Edit a full multicam podcast episode: map every camera and mic file to a person, sync them by audio (with clock-drift correction), auto-cut cameras to whoever is speaking, then render an MP4 or export a Premiere XML / FCPXML timeline that points at the original files. Flow: 'new' (folder or files, people) → check the guessed mapping with 'show' and fix it with 'map' → 'sync' → 'plan' → 'render' or 'export'. 'new' returns the session with guessed roles; calling it again on the same files reopens that edit. 'sync', 'plan' and 'render' start a background job and return job_id: poll job_status, then call 'show'. Mapping fields (people, sources, range_start, range_end, cut_settings, speaker_map, look, removals) apply on 'map', 'sync' and 'plan'; 'render' takes only look and stems. Changing who is in a file or where it sits clears the cut, so run 'plan' again. 'render' skips work when nothing changed and reuses shots it already encoded. Every render checks the finished file (frame count, a full decode, loudness and true peak) and reports outputs.validation; only a broken decode or a picture more than a frame off the cut fails it, the rest are warnings. Other actions: 'list', 'cut' (index, source_id: swap one shot's camera), 'set_cuts' (cuts: replace the whole cut with back-to-back shots), 'activity' (who speaks when, as spans per person), 'previews' (still frames per camera, looks: true adds every color look on every camera), 'preview' (background job: playback proxies, a mic mix and stills, for a browser editor such as podcli cloud), 'delete'. 'cloud' (background job, needs podcli login and Pro: sends previews and the edit to the podcli cloud editor; camera files stay here) and 'pull' (background job: renders the cut made in that editor from the files here). 'export' with review: true writes a review timeline: the whole episode, every camera on its own track under the cut, and each removal left in place, named 'Remove', labelled orange in Premiere and marked with its reason. 'import_timeline' (path) reads an FCP 7 XML timeline edited in Premiere or Resolve back as the cut and removals: deleted stretches become removals, kept ones are restored. With the DaVinci Resolve MCP server connected, import the review timeline into a Resolve project, color the 'Remove' clips, let the editor review, export the timeline as FCP 7 XML, then call 'import_timeline'. Call recordings work too: one file per person becomes a split screen, one gallery recording is split into a camera per tile; Premiere and FCPXML export refuse those layouts for now.

Inputs: action (required), at, cuts, look, +19 more.

manage_presetsA

Save, load, list, or delete rendering presets. Presets store caption_style, crop_strategy, logo_path, and outro_path for quick reuse.

Inputs: action (required), name, config.

manage_reelA

Create and iterate on a highlights reel. Detection runs once with action 'new'; after that, edit individual moments fast (longer/shorter/earlier/later/shift/drop/toggle) and rebuild without re-detecting. Pass video_paths (a list) to pool many videos and rank the best moments across all of them. Actions: 'new' (video_path or video_paths, profile, format, top_n, min_dur, max_dur), 'list', 'show' (session_id), 'edit' (session_id, index, op, seconds), 'build' (session_id), 'delete' (session_id).

Inputs: action (required), op, end, auto, +12 more.

manage_thumbnail_configA

Show, export, import, or reset the thumbnail template (colors, fonts, frame, box, layout) podcli uses to generate thumbnails. 'show' returns the effective config; 'export' writes it to a file path; 'import' replaces it from a file path; 'reset' reverts to the generic default; 'set_layout' picks the layout: 'single' (one face) or 'pair' (two people from the clip, guest left and host right, for interview clips; falls back to one face when podcli cannot tell two people apart).

Inputs: action (required), path, layout.

mine_channelA

Mine a YouTube channel's back catalog for clip-worthy moments without downloading any video. action='list' lists a channel's uploads (title, duration, upload date), flagging ones already mined into clip_history so you don't re-suggest from them. action='mine' fetches one video's existing captions (never the video itself), preferring the original-language track over an auto-translated one, and converts them to podcli's word-level transcript format. Feed the result straight into the suggest_clips flow the same way import_transcript's output is used. Never downloads a full video; that only happens if you separately choose to render a clip from one.

Inputs: action (required), limit, video_url, channel_url, +1 more.

modify_clipA

Adjust a suggested clip before exporting. Change timing, title, caption style, or opening hook. Use action='delete' to remove a clip entirely. Reference clips by clip_number (from get_ui_state).

Inputs: index, action, clip_id, updates, +1 more.

parse_transcriptA

Parse a raw speaker-labeled plain text transcript into word-level timestamps. Input format: 'Speaker (MM:SS)\ntext...\n\nSpeaker2 (MM:SS)\ntext...'. Uses the Python backend to generate accurate word timings.

Inputs: raw_text (required), file_path (required), language, time_adjust, +1 more.

process_episodeA

One-shot episode job: transcribe, rank moments, render clips, write titles/descriptions/tags. Returns { job_id } immediately. Poll with job_status until done; the result is the same JSON podcli process --json prints (clip paths, durations, scores, titles, captions).

Does not require the web studio. For a shortlist without rendering, use rank_clip_candidates instead.

Inputs: video_path (required), top, crop, fast, +7 more.

rank_clip_candidatesA

After transcribe_podcast, call this instead of reading the whole transcript. Returns ~20 pre-ranked, sentence-aligned candidates (start/end, duration, score, title, preview). Pick from the list, then submit winners with suggest_clips or render with create_clip.

Uses the cached transcript for video_path. Does not call an AI CLI.

Inputs: video_path (required), top_n.

record_decisionsA

Record per-episode workflow decisions (clip count, clip duration range, caption style, captions on/off, language, whether thumbnails are wanted, delivery target, free-form notes) so later runs against the same video never ask the same question twice. Keyed by the video's path + file size, not by session, so these answers survive a new episode overwriting ui-state.json. Pass only the fields you have an answer for; existing answers are preserved unless explicitly overwritten. get_ui_state lists any fields still unanswered as open questions.

Inputs: video_path (required), notes, language, clip_count, +6 more.

set_videoA

Set the working video file without transcribing. Use this when you'll import a transcript separately. After this, either transcribe_podcast or import a transcript via import_transcript / parse_transcript.

Inputs: file_path (required).

suggest_clipsA

STEP 2 — Submit your clip suggestions after analyzing the transcript.

Before calling this: read the transcript via get_ui_state(include_transcript: true) and identify the best viral moments.

Every suggestion must carry its own context. A clip that opens on an answer whose question stayed behind the cut is rejected: widen start_second so the question is inside the clip.

What it does: Stores your suggestions, assigns clip numbers (#1, #2, etc.), and pushes them to the Web UI for the user to review.

After this: the user reviews in the UI. Then export with batch_create_clips(export_selected: true) or create_clip(clip_number: N).

Inputs: suggestions (required).

toggle_clipA

Select or deselect a suggested clip by clip_number. Selected clips are exported with export_selected.

Inputs: selected (required), index, clip_id, clip_number.

transcribe_podcastA

STEP 1 — Transcribe a podcast video/audio file. This is typically the first tool you call.

What it does: Uses Whisper AI for word-level timestamps, with speaker detection (who said what) on by default. Speaker labels are what let a clip tell a question from an answer, so leave them on for any interview. Pass enable_diarization=false to skip them and save time on a single-speaker recording. Returns: Lightweight metadata only — duration, language, word/segment counts, speaker summary, and packed_ready flag. The actual transcript body is NOT returned here (it would be 500KB+ for a typical episode). Read the content via get_ui_state(include_transcript: true) which returns a compact phrase-grouped markdown view (~10x smaller than raw segments). Caching: Results are cached by file hash — same file won't be re-transcribed. Supported formats: MP4, MOV, WebM, MKV, MP3, WAV.

After transcription: call rank_clip_candidates(video_path) for a ~20-clip shortlist (do not read the whole transcript unless you need to rewrite a range). Or call process_episode(video_path) to transcribe, rank, and render in one job.

Inputs: file_path (required), engine, language, model_size, +4 more.

transcribe_startA

Start transcription as a background job and return a job_id immediately. Use this instead of transcribe_podcast for long files so you can narrate progress to the user while it runs (a 60-min episode takes 15–25 min).

Flow: call transcribe_start(file_path) → emit status text to user → call job_status(job_id, wait_seconds: 30) in a loop until done → then read the packed transcript via get_ui_state(include_transcript: true).

Requires the Web UI to be running (npm run ui). Returns { job_id, cached, status, estimate_minutes }.

Inputs: file_path (required), engine, language, model_size, +2 more.

update_settingsC

Update rendering settings (caption style, crop strategy, logo, outro) in the Web UI.

Inputs: logo_path, intro_path, outro_path, caption_style, +1 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 32 tools

    Disambiguation3/5

    There is real overlap between multiple entry points: transcribe_podcast vs transcribe_start, create_clip vs batch_create_clips, and process_episode vs the manual transcribe/rank/render flow. The many umbrella manage_* tools are distinguishable by domain, and descriptions are detailed enough to guide selection, but an agent can still hesitate over which workflow path to use.

    Naming Consistency4/5

    Most tools follow a predictable snake_case verb_noun pattern such as create_clip, batch_create_clips, manage_assets, and transcribe_start. A few resource/status names like job_status, clip_history, and knowledge_base are noun-only, and the manage_* pattern is used broadly, but the convention remains readable and mostly consistent.

    Tool Count2/5

    At 32 tools, the surface is heavy and includes many secondary configuration, environment, integration, preset, and thumbnail-management tools alongside the core podcast workflow. The domain is broad enough to justify more than a small set, but the count still exceeds a comfortable scoped surface.

    Completeness4/5

    Coverage is extensive: transcription, transcript import/parsing, candidate ranking, clip suggestion, modification, single/batch export, reels, multicam editing, job polling, history, assets, presets, and integrations are all present. Minor gaps remain around direct publishing/upload and output cleanup, but the core lifecycle is well covered.

    Maintenance

    ActivityActive
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Turn YouTube videos into short clips — from Claude, Cursor, or any AI assistant that supports MCP. You give it a YouTube link. It finds the best moments, reframes them for vertical video, adds subtitles, and gives you download links. All from a chat.
      6
      65 npm
      2
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      An MCP server that turns Claude into a hands-on video editor for short-form videos, enabling music generation, script writing, voiceover synthesis, and video stitching with FFmpeg. It also features a text-to-documentary skill that converts long-form text into structured documentary videos.
      MIT