Local AI-assisted rough-cut tooling for TikTok, Shorts, and Reels.
This prototype takes a local video file and generates:
- a vertical
1080x1920MP4 rough cut - editable
.srtcaptions for CapCut - a transcript JSON
- an intermediate rough-cut JSON
- an optional burned-caption preview
- a single
.zipbundle containing the generated files
It is built on top of the OpenCut web app while the automation pipeline is being explored. The current practical workflow is to use this app to generate a CapCut-ready rough cut, then polish the video and captions manually in CapCut.
This is a working prototype, not a polished product.
What works:
- browser-based local GUI for selecting a video
- FFprobe metadata detection
- FFmpeg silence detection and rough-cut rendering
- local Whisper transcription through
whisper.cpp - transcript-aware protection for quiet opening speech
- caption chunking tuned for short-form social videos
- SRT export for CapCut
- optional MCP wrapper for agent workflows
What is intentionally deferred:
- cloud transcription APIs
- Whisper installation automation
- full timeline editor UX
- visual crop/zoom/keyframe decisions
- direct CapCut project generation
- OpenCut renderer/export/WASM changes
- macOS or another local machine with shell access
- Bun
- FFmpeg with
ffmpegandffprobeonPATH whisper.cppCLI onPATHaswhisper-cli- a local whisper.cpp model, for example:
~/.cache/whisper.cpp/ggml-small.en.bin~/.cache/whisper.cpp/ggml-base.en.bin
On macOS with Homebrew:
brew install ffmpeg whisper-cppDownload a model using your preferred whisper.cpp model workflow. This prototype currently looks for:
~/.cache/whisper.cpp/ggml-small.en.bin
~/.cache/whisper.cpp/ggml-base.en.bin
bun install
bun run roughcut:guiOpen:
http://localhost:3000/automation/roughcut-gui
On macOS, you can also double-click:
scripts/Launch Rough Cut.command
- Choose a local video file.
- Leave
Cut dead airenabled. - Choose a
Cut strength:Smoothkeeps more breathing room.Naturalis the default.Tightremoves shorter pauses.Harduses minimal padding for faster jump cuts.
- Leave
Trim startat0unless you explicitly want to remove the opening. - Keep
Render burned-caption previewenabled if you want a quick visual timing check. - Click
Generate files. - Import these generated files into CapCut:
capcut-clean.mp4captions.srt
The generated files are written under:
~/Downloads/roughcut-gui/
Each video gets its own timestamped folder. The GUI also creates
roughcut-files.zip in that folder so you can download/share one bundle instead
of grabbing files individually.
Use CapCut Desktop or CapCut Web.
- Create a new CapCut project.
- Import
capcut-clean.mp4. - Drag the video onto the timeline.
- Open the captions/subtitles area.
- Import
captions.srt. - Polish caption wording, timing, style, and edits manually.
CapCut mobile does not reliably support direct SRT import.
Generate rough-cut JSON:
bun run generate:roughcut --video input.mp4 --auto-silence-cut --auto-transcribe --captions-from-transcript --roughcut-out roughcut.json --transcript-out transcript.jsonRender a clean MP4:
bun run render:roughcut --roughcut roughcut.json --out capcut-clean.mp4 --no-captionsRender a burned-caption preview:
bun run render:roughcut --roughcut roughcut.json --out preview-burned-captions.mp4The prototype includes a thin MCP wrapper around the same rough-cut modules.
bun run roughcut:mcpSee:
docs/automation/opencut-roughcut-mcp.md
Focused rough-cut tests:
bun test apps/web/src/automation/roughcutFull upstream OpenCut tests may currently fail on unrelated upstream/local issues. See:
docs/automation/roughcut-known-repo-issues.md
Main rough-cut modules:
apps/web/src/automation/roughcut/
apps/web/scripts/roughcut/
apps/web/src/app/automation/roughcut-gui/
apps/web/src/app/api/automation/roughcut-gui/
The generated rough-cut JSON is an intermediate format, not a stable public OpenCut project format. The practical handoff format today is:
- MP4 for video
- SRT for editable captions
This repo is based on OpenCut, an MIT-licensed open-source video editor:
https://github.com/OpenCut-app/OpenCut
OpenCut license terms remain in LICENSE.