Inside CapCut's draft files: how automation works without an API
In the last post I claimed you can automate CapCut even though it has no API. This post shows the actual mechanism, because “trust me, it works” is not how this site operates.
The discovery that makes everything possible
CapCut is a desktop app, but it is not a black box. Every project you see on its home screen lives on your disk as a draft folder, and inside that folder the project is described in plain JSON text files: which clips sit on which track, where each subtitle appears, when the audio starts, what effects are applied.
When you edit in CapCut, you are editing that JSON through a GUI. When CapCut opens a project, it just reads the JSON.
So the question becomes: what if another program writes that JSON first?
What my pipeline actually writes
For a 15-20 second short, the builder generates a draft containing:
| Layer | What goes in | Where it comes from |
|---|---|---|
| Video track | background clips, cut to scene lengths | a stock folder or one source video |
| Voice track | narration audio file | free Edge neural TTS |
| Subtitle track | styled text, word-wrapped, timed to the voice | the script, split by scene |
| Music track | royalty-free BGM under the voice | a local library |
The output lands in CapCut’s own drafts directory. Next time I open CapCut, the project is just there, indistinguishable from one I built by hand, except it took minutes and I hadn’t touched the timeline.
The three problems that ate most of the build time
1. Timing is everything. Subtitles must match the narration to the millisecond or the video feels broken. The pipeline reads the exact duration of each generated voice clip and positions every subtitle from that, not from estimates.
2. Korean line breaks. Breaking a subtitle mid-word looks amateur in any language. The builder wraps text by word units, so a line never cuts a word in half. This took longer to get right than the entire music system.
3. CapCut updates. This is the honest risk of the whole approach: the draft format is undocumented, and CapCut can change it in any update. It has survived the updates I’ve been through so far, but I treat every CapCut update as a “test before trusting” event. If you build on undocumented formats, that is the tax you accept.
What you can use today
You don’t need my pipeline to start poking at this:
- Find your drafts. On Windows they live at
%LOCALAPPDATA%\CapCut\User Data\Projects\com.lveditor.draft. Every folder in there is one project. Open one and read the JSON in any text editor. That alone demystifies the whole thing. - Use the library my pipeline is built on. Credit where it’s due:
the JSON structure is handled by the open-source
pycapcutpackage (pip install pycapcut), so you write Python, not raw draft files. - Back up the drafts folder first. You are editing files CapCut expects to own. A copied folder is a free undo button.
Should you build this yourself?
If you upload a few videos a month: no. Learning the format takes real time, and clicking is faster at that volume.
It starts paying off when volume is the problem. I run four channels alone, and over 85 videos have gone through this pipeline. At that scale, every manual minute per video is an hour per month.
Next in this series: the free TTS setup that voices all of it, and what it sounds like compared to the paid options.
Here are the receipts.
Subscribe below if you want the next one when it lands.