Video editing with Claude Code on the Mac — say a keyword, get a cut, captions, a motion graphic, a demo or a reel. Arabic-first, all local, zero API spend

Edit

Claude Code edits video by reading it, not watching it. A word-level transcript of the footage, a few KB of text, lets Claude choose cuts at word boundaries. It looks at a filmstrip only when a decision needs it, then renders with ffmpeg. Everything runs on the Mac, so there are no uploads and no API spend.

record and shoot film the product, higgs generates clips with AI, and edit finishes them.

Quick start

  1. One-time setup (already done on Abdout's Mac):
    bash ~/.claude/skills/edit/scripts/setup.sh
    Then start a new Claude Code session so the HyperFrames plugin loads.
  2. Put the footage in a folder. One folder per video, holding every take you want considered, for example ~/media/inbox/launch/.
  3. Open Claude Code and say what you want, in Arabic or English, with no slash commands:

    "rough cut ~/media/inbox/launch into a 60-second video with Arabic captions"

  4. Claude transcribes the footage and tells you what it found. It proposes a plan and waits for your yes, then renders a draft and shows you frames at the cut points.
  5. Give feedback in plain words until it's right. The final file is overwritten in place.

Keywords

Say any of these in a sentence and the edit lane runs. The full list is on the spellbook under The Pensieve.

SayWhat happensYou get
edit · مونتاجClaude asks what the footage is and what you need, then picks the laneWhatever the lane below produces
rough cut · قص الفيديوA transcript-driven cut that removes silences, fillers ("umm", "يعني") and false starts. When you repeat a line, the last take wins<folder>/edit/final.mp4
captions · ترجمة الفيديوArabic captions burned in from the transcript, in Thmanyah Sans on a dark boxThe same file, captioned
title cardAn animated Arabic title, intro or outro card in the brand type and colorsA short MP4 card
motion graphicA promo or explainer composed from code (HyperFrames), with no cameraAn MP4 promo
reelA vertical 9:16 version of a cut, captioned and capped at 58 s. With no footage it falls back to an AI clip (higgs), which only plans while credits are outreel.mp4, 1080×1920

Example phrasings that route correctly:

ArabicEnglish
"مونتاج للفيديو في مجلد launch""edit the clips in ~/media/inbox/launch"
"قص الفيديو وشيل السكتات""cut the silences out of this recording"
"ترجمة الفيديو بالعربي""add Arabic captions to final.mp4"
"اعمل ريلز من الفيديو""make a reel from the add-student demo"
"كرت عنوان: إضافة طالب جديد""title card for the admission flow"

Walkthroughs

1. Cut raw footage

"rough cut ~/media/inbox/launch — 60 seconds, Arabic captions, warm grade"

  1. Transcribe. Every take is transcribed locally with mlx-whisper, at about 5 s per 30 s of audio. Transcripts are cached and never redone.
  2. Read. Claude reads edit/takes_packed.md, one line per phrase with its timestamps, and describes the material back to you.
  3. Plan. It proposes what to keep, what to cut and the order, then waits for your yes.
  4. Draft. It renders a fast draft and checks the frames on both sides of every cut.
  5. Final. It renders edit/final.mp4 at −14 LUFS loudness, with captions applied last. It reports the loudness numbers, because it can't listen.

Feedback that works: "tighter", "keep the joke at 1:20", "drop the second example", "less warm", "English captions", "no captions", "square for Instagram". Every change re-renders from the cached transcript.

2. Captions only

"captions for ~/media/inbox/talk/final.mp4"

Whisper sometimes misspells Arabic (الأضافة for الإضافة). Claude fixes the transcript before burning the captions. Ask to see the caption file first if the wording matters, such as names, brands or Quranic verses.

3. Title card or motion graphic

"title card: إضافة طالب جديد — بالقلم" · "motion graphic announcing the admission season, 20 seconds"

Claude writes an HTML composition: Thmanyah Serif Display headlines, Thmanyah Sans body text and the clay accent #e05638. It runs the HyperFrames check, which covers contrast and layout, then renders and shows you a frame. Ask for "preview" to scrub it in the browser before the final render.

4. A product demo with intro and outro

"demo video for add-student with an intro and outro card"

The take comes from shoot's sim. Its cached take is re-composed with no new filming. A record screen recording also works. The cards come from HyperFrames, and everything is joined at a constant 30 fps. The result overwrites ~/media/<repo>/<flow>/<flow>-ar.mp4, with one file per flow.

5. A reel

"reel from the launch cut"

Claude takes the finished cut without captions, reframes it to 1080×1920 and burns the captions last, placed above the TikTok, Instagram and Facebook buttons. There are two modes:

  • pad (default for screen recordings): the whole frame sits over a blurred fill, so nothing is cut off.
  • crop: a centered 9:16 crop, for talking heads.

Get better edits

  • Record clean audio. The transcript drives every decision, so a lapel or phone mic close to the speaker beats the laptop mic.
  • Flub a line? Pause, then say the whole sentence again. The last take wins.
  • One folder per video, with every take inside. Claude chooses across takes.
  • Say the target up front: length, aspect (16:9, 9:16 or 1:1), captions yes or no, and the language.

Where files land

WhatWhere
Transcripts (cached)<folder>/edit/transcripts/*.json
Transcript Claude reads<folder>/edit/takes_packed.md
Edit decision list<folder>/edit/edl.json
Captions<folder>/edit/master.srt
Final video<folder>/edit/final.mp4, overwritten on every re-render
Session notes<folder>/edit/project.md, so the next session continues where this one stopped
HyperFrames renders<project>/renders/

Troubleshooting

SymptomFix
edit: only N GiB free (floor 10)Free disk space. Delete old edit/ scratch, renders/ drafts and ~/Downloads media
Captions show boxes or broken lettersThmanyah Sans is missing. Run setup.sh; it reports the font
Captions are missing entirelyThe slim ffmpeg is on PATH. Use the scripts, which prepend ffmpeg-full
A HyperFrames video renders blackdir="rtl" is on <html>. Move direction: rtl onto each text element
A cut clips the first syllableWhisper word starts drift after silence. Ask for "more padding on the cuts"
video-use: patch no longer appliesUpstream changed. Re-port helpers/transcribe_local.py

Manual commands

The scripts live in ~/.claude/skills/edit/scripts/. Claude runs them for you, but they also work from a terminal:

S=~/.claude/skills/edit/scripts
$S/vu.sh transcribe_batch ~/media/inbox/launch --language ar   # local transcription
$S/vu.sh pack_transcripts --edit-dir ~/media/inbox/launch/edit  # → takes_packed.md
$S/vu.sh render <edit>/edl.json -o <edit>/final.mp4 --build-subtitles
$S/reel.sh final.mp4 reel.mp4 --srt <edit>/master.srt --mode pad
cd <project> && $S/hf.sh check && $S/hf.sh render              # HyperFrames
auto-editor long.mp4 --margin 0.2s -o long-cut.mp4             # quick silence strip

Under the hood

ToolRoleWhy this one
video-use (MIT)Transcript → EDL → render, with a self-check at every cutWorks from a ~12 KB transcript instead of frames
mlx-whisper, large-v3-turboArabic and English transcription with word timestampsFast on the M4, with no upload and no spend. It replaces video-use's paid ElevenLabs Scribe through a local patch
HyperFrames (Apache-2.0)Compositions written as HTML and GSAP, rendered to MP4Chrome shapes Arabic correctly, the same model shoot's motion lane uses
ffmpeg-full (Homebrew, keg-only)Encodes and burns captionsThe slim ffmpeg has no libass, so it can't burn subtitles. ffmpeg-full sits beside it, and shoot and record stay untouched
auto-editor, yt-dlpQuick silence cuts; pulling in video from a URL

Not used, on purpose:

  • Remotion. A company of 4 or more people needs its Company licence ($100/mo minimum), and HyperFrames covers the same ground for free.
  • ElevenLabs Scribe. It is a paid API.
  • ffmpeg, Final Cut Pro and DaVinci Resolve MCP servers. Skills that call the CLI cost fewer tokens, and the workflow is fully agentic, with no desktop editor.

What setup.sh does:

  • Installs the Homebrew formulas and mlx-whisper.
  • Clones video-use to ~/oss/video-use and applies .claude/skills/edit/patches/video-use-local-asr.patch.
  • Symlinks the clone as the video-use skill and installs the hyperframes@hyperframes plugin.

The first transcription downloads about 1.5 GB of model weights.

House rules

  • One file per piece, always overwritten. Never -v2 or -final2.
  • Disk floor: 10 GiB. The render scripts refuse below it. Scratch is purged after delivery.
  • Plan before render. The strategy is confirmed before the first full render.
  • Measured, not claimed. Audio is reported as loudness numbers.

Verified on 2026-10-07

TestResult
Arabic transcription, 30 s clip27 words with timestamps in 5 s
Rough cut: 3 pauses + 1 false start30 s → 16 s. No gap over 0.6 s remains, loudness is −14 LUFS, and Arabic captions are shaped correctly
HyperFrames Arabic title card, 6 sRendered in 10 s, with 8/8 contrast checks passing
Demo: card + take + card22 s at a constant 30 fps
Reel, pad mode1080×1920 @ 30 fps with captions above the platform UI