proofcut 0.29.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- proofcut-0.29.0/LICENSE +166 -0
- proofcut-0.29.0/PKG-INFO +444 -0
- proofcut-0.29.0/README.md +427 -0
- proofcut-0.29.0/pyproject.toml +48 -0
- proofcut-0.29.0/src/proofcut/__init__.py +14 -0
- proofcut-0.29.0/src/proofcut/_face_worker.py +109 -0
- proofcut-0.29.0/src/proofcut/_tts_worker.py +108 -0
- proofcut-0.29.0/src/proofcut/_vlm_worker.py +170 -0
- proofcut-0.29.0/src/proofcut/asr.py +711 -0
- proofcut-0.29.0/src/proofcut/autoeditor.py +309 -0
- proofcut-0.29.0/src/proofcut/briefs.py +214 -0
- proofcut-0.29.0/src/proofcut/captions.py +908 -0
- proofcut-0.29.0/src/proofcut/cli.py +3345 -0
- proofcut-0.29.0/src/proofcut/deps.py +36 -0
- proofcut-0.29.0/src/proofcut/describe.py +308 -0
- proofcut-0.29.0/src/proofcut/doctor.py +1059 -0
- proofcut-0.29.0/src/proofcut/duck.py +149 -0
- proofcut-0.29.0/src/proofcut/energy.py +499 -0
- proofcut-0.29.0/src/proofcut/faces.py +352 -0
- proofcut-0.29.0/src/proofcut/finish.py +362 -0
- proofcut-0.29.0/src/proofcut/finishlog.py +118 -0
- proofcut-0.29.0/src/proofcut/fonts/FONTS.md +96 -0
- proofcut-0.29.0/src/proofcut/fonts/OFL-Outfit.txt +93 -0
- proofcut-0.29.0/src/proofcut/fonts/Outfit[wght].ttf +0 -0
- proofcut-0.29.0/src/proofcut/fonts/static/Outfit-Bold.ttf +0 -0
- proofcut-0.29.0/src/proofcut/fonts/static/Outfit-Regular.ttf +0 -0
- proofcut-0.29.0/src/proofcut/fonts.py +601 -0
- proofcut-0.29.0/src/proofcut/graphics.py +2215 -0
- proofcut-0.29.0/src/proofcut/install.py +663 -0
- proofcut-0.29.0/src/proofcut/media.py +1298 -0
- proofcut-0.29.0/src/proofcut/mlt.py +2025 -0
- proofcut-0.29.0/src/proofcut/ops.py +16721 -0
- proofcut-0.29.0/src/proofcut/pack.py +327 -0
- proofcut-0.29.0/src/proofcut/picture.py +1156 -0
- proofcut-0.29.0/src/proofcut/progress.py +254 -0
- proofcut-0.29.0/src/proofcut/project.py +967 -0
- proofcut-0.29.0/src/proofcut/py.typed +0 -0
- proofcut-0.29.0/src/proofcut/renderlog.py +149 -0
- proofcut-0.29.0/src/proofcut/reviewserver.py +487 -0
- proofcut-0.29.0/src/proofcut/server.py +5194 -0
- proofcut-0.29.0/src/proofcut/speakers.py +279 -0
- proofcut-0.29.0/src/proofcut/speech.py +87 -0
- proofcut-0.29.0/src/proofcut/templates/bumper.portrait.svg +10 -0
- proofcut-0.29.0/src/proofcut/templates/bumper.svg +10 -0
- proofcut-0.29.0/src/proofcut/templates/chapter.portrait.svg +11 -0
- proofcut-0.29.0/src/proofcut/templates/chapter.svg +11 -0
- proofcut-0.29.0/src/proofcut/templates/endcard.portrait.svg +5 -0
- proofcut-0.29.0/src/proofcut/templates/endcard.svg +5 -0
- proofcut-0.29.0/src/proofcut/templates/receipt.portrait.svg +8 -0
- proofcut-0.29.0/src/proofcut/templates/receipt.svg +8 -0
- proofcut-0.29.0/src/proofcut/templates/rerate.portrait.svg +7 -0
- proofcut-0.29.0/src/proofcut/templates/rerate.svg +7 -0
- proofcut-0.29.0/src/proofcut/templates/reveal.portrait.svg +7 -0
- proofcut-0.29.0/src/proofcut/templates/reveal.svg +7 -0
- proofcut-0.29.0/src/proofcut/timeline.py +797 -0
- proofcut-0.29.0/src/proofcut/transcript.py +584 -0
- proofcut-0.29.0/src/proofcut/tts.py +279 -0
- proofcut-0.29.0/src/proofcut/verify.py +235 -0
- proofcut-0.29.0/src/proofcut/web/FONTS.md +26 -0
- proofcut-0.29.0/src/proofcut/web/LICENSE-geist-sans.txt +92 -0
- proofcut-0.29.0/src/proofcut/web/LICENSE-jetbrains-mono.txt +93 -0
- proofcut-0.29.0/src/proofcut/web/LICENSE-source-serif-4.txt +93 -0
- proofcut-0.29.0/src/proofcut/web/agent.js +989 -0
- proofcut-0.29.0/src/proofcut/web/api.js +110 -0
- proofcut-0.29.0/src/proofcut/web/app.css +4217 -0
- proofcut-0.29.0/src/proofcut/web/app.js +749 -0
- proofcut-0.29.0/src/proofcut/web/assets.js +745 -0
- proofcut-0.29.0/src/proofcut/web/dom.js +107 -0
- proofcut-0.29.0/src/proofcut/web/favicon.svg +10 -0
- proofcut-0.29.0/src/proofcut/web/finish.js +493 -0
- proofcut-0.29.0/src/proofcut/web/frame.js +951 -0
- proofcut-0.29.0/src/proofcut/web/geist-sans-400.woff2 +0 -0
- proofcut-0.29.0/src/proofcut/web/geist-sans-500.woff2 +0 -0
- proofcut-0.29.0/src/proofcut/web/geist-sans-600.woff2 +0 -0
- proofcut-0.29.0/src/proofcut/web/geist-sans-700.woff2 +0 -0
- proofcut-0.29.0/src/proofcut/web/index.html +629 -0
- proofcut-0.29.0/src/proofcut/web/jetbrains-mono.woff2 +0 -0
- proofcut-0.29.0/src/proofcut/web/picker.html +45 -0
- proofcut-0.29.0/src/proofcut/web/picker.js +570 -0
- proofcut-0.29.0/src/proofcut/web/player.js +1152 -0
- proofcut-0.29.0/src/proofcut/web/properties.js +271 -0
- proofcut-0.29.0/src/proofcut/web/source-serif-4-italic.woff2 +0 -0
- proofcut-0.29.0/src/proofcut/web/source-serif-4.woff2 +0 -0
- proofcut-0.29.0/src/proofcut/web/theme.js +94 -0
- proofcut-0.29.0/src/proofcut/web/timeline.js +2531 -0
- proofcut-0.29.0/src/proofcut/web/transcript.js +1082 -0
- proofcut-0.29.0/src/proofcut/webui.py +4022 -0
proofcut-0.29.0/LICENSE
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
Required Notice: Copyright 2026 tydude001 (https://github.com/tydude001/proofcut)
|
|
2
|
+
|
|
3
|
+
# PolyForm Shield License 1.0.0
|
|
4
|
+
|
|
5
|
+
<https://polyformproject.org/licenses/shield/1.0.0>
|
|
6
|
+
|
|
7
|
+
## Acceptance
|
|
8
|
+
|
|
9
|
+
In order to get any license under these terms, you must agree
|
|
10
|
+
to them as both strict obligations and conditions to all
|
|
11
|
+
your licenses.
|
|
12
|
+
|
|
13
|
+
## Copyright License
|
|
14
|
+
|
|
15
|
+
The licensor grants you a copyright license for the
|
|
16
|
+
software to do everything you might do with the software
|
|
17
|
+
that would otherwise infringe the licensor's copyright
|
|
18
|
+
in it for any permitted purpose. However, you may
|
|
19
|
+
only distribute the software according to [Distribution
|
|
20
|
+
License](#distribution-license) and make changes or new works
|
|
21
|
+
based on the software according to [Changes and New Works
|
|
22
|
+
License](#changes-and-new-works-license).
|
|
23
|
+
|
|
24
|
+
## Distribution License
|
|
25
|
+
|
|
26
|
+
The licensor grants you an additional copyright license
|
|
27
|
+
to distribute copies of the software. Your license
|
|
28
|
+
to distribute covers distributing the software with
|
|
29
|
+
changes and new works permitted by [Changes and New Works
|
|
30
|
+
License](#changes-and-new-works-license).
|
|
31
|
+
|
|
32
|
+
## Notices
|
|
33
|
+
|
|
34
|
+
You must ensure that anyone who gets a copy of any part of
|
|
35
|
+
the software from you also gets a copy of these terms or the
|
|
36
|
+
URL for them above, as well as copies of any plain-text lines
|
|
37
|
+
beginning with `Required Notice:` that the licensor provided
|
|
38
|
+
with the software. For example:
|
|
39
|
+
|
|
40
|
+
> Required Notice: Copyright Yoyodyne, Inc. (http://example.com)
|
|
41
|
+
|
|
42
|
+
## Changes and New Works License
|
|
43
|
+
|
|
44
|
+
The licensor grants you an additional copyright license to
|
|
45
|
+
make changes and new works based on the software for any
|
|
46
|
+
permitted purpose.
|
|
47
|
+
|
|
48
|
+
## Patent License
|
|
49
|
+
|
|
50
|
+
The licensor grants you a patent license for the software that
|
|
51
|
+
covers patent claims the licensor can license, or becomes able
|
|
52
|
+
to license, that you would infringe by using the software.
|
|
53
|
+
|
|
54
|
+
## Noncompete
|
|
55
|
+
|
|
56
|
+
Any purpose is a permitted purpose, except for providing any
|
|
57
|
+
product that competes with the software or any product the
|
|
58
|
+
licensor or any of its affiliates provides using the software.
|
|
59
|
+
|
|
60
|
+
## Competition
|
|
61
|
+
|
|
62
|
+
Goods and services compete even when they provide functionality
|
|
63
|
+
through different kinds of interfaces or for different technical
|
|
64
|
+
platforms. Applications can compete with services, libraries
|
|
65
|
+
with plugins, frameworks with development tools, and so on,
|
|
66
|
+
even if they're written in different programming languages
|
|
67
|
+
or for different computer architectures. Goods and services
|
|
68
|
+
compete even when provided free of charge. If you market a
|
|
69
|
+
product as a practical substitute for the software or another
|
|
70
|
+
product, it definitely competes.
|
|
71
|
+
|
|
72
|
+
## New Products
|
|
73
|
+
|
|
74
|
+
If you are using the software to provide a product that does
|
|
75
|
+
not compete, but the licensor or any of its affiliates brings
|
|
76
|
+
your product into competition by providing a new version of
|
|
77
|
+
the software or another product using the software, you may
|
|
78
|
+
continue using versions of the software available under these
|
|
79
|
+
terms beforehand to provide your competing product, but not
|
|
80
|
+
any later versions.
|
|
81
|
+
|
|
82
|
+
## Discontinued Products
|
|
83
|
+
|
|
84
|
+
You may begin using the software to compete with a product
|
|
85
|
+
or service that the licensor or any of its affiliates has
|
|
86
|
+
stopped providing, unless the licensor includes a plain-text
|
|
87
|
+
line beginning with `Licensor Line of Business:` with the
|
|
88
|
+
software that mentions that line of business. For example:
|
|
89
|
+
|
|
90
|
+
> Licensor Line of Business: YoyodyneCMS Content Management
|
|
91
|
+
System (http://example.com/cms)
|
|
92
|
+
|
|
93
|
+
## Sales of Business
|
|
94
|
+
|
|
95
|
+
If the licensor or any of its affiliates sells a line of
|
|
96
|
+
business developing the software or using the software
|
|
97
|
+
to provide a product, the buyer can also enforce
|
|
98
|
+
[Noncompete](#noncompete) for that product.
|
|
99
|
+
|
|
100
|
+
## Fair Use
|
|
101
|
+
|
|
102
|
+
You may have "fair use" rights for the software under the
|
|
103
|
+
law. These terms do not limit them.
|
|
104
|
+
|
|
105
|
+
## No Other Rights
|
|
106
|
+
|
|
107
|
+
These terms do not allow you to sublicense or transfer any of
|
|
108
|
+
your licenses to anyone else, or prevent the licensor from
|
|
109
|
+
granting licenses to anyone else. These terms do not imply
|
|
110
|
+
any other licenses.
|
|
111
|
+
|
|
112
|
+
## Patent Defense
|
|
113
|
+
|
|
114
|
+
If you make any written claim that the software infringes or
|
|
115
|
+
contributes to infringement of any patent, your patent license
|
|
116
|
+
for the software granted under these terms ends immediately. If
|
|
117
|
+
your company makes such a claim, your patent license ends
|
|
118
|
+
immediately for work on behalf of your company.
|
|
119
|
+
|
|
120
|
+
## Violations
|
|
121
|
+
|
|
122
|
+
The first time you are notified in writing that you have
|
|
123
|
+
violated any of these terms, or done anything with the software
|
|
124
|
+
not covered by your licenses, your licenses can nonetheless
|
|
125
|
+
continue if you come into full compliance with these terms,
|
|
126
|
+
and take practical steps to correct past violations, within
|
|
127
|
+
32 days of receiving notice. Otherwise, all your licenses
|
|
128
|
+
end immediately.
|
|
129
|
+
|
|
130
|
+
## No Liability
|
|
131
|
+
|
|
132
|
+
***As far as the law allows, the software comes as is, without
|
|
133
|
+
any warranty or condition, and the licensor will not be liable
|
|
134
|
+
to you for any damages arising out of these terms or the use
|
|
135
|
+
or nature of the software, under any kind of legal claim.***
|
|
136
|
+
|
|
137
|
+
## Definitions
|
|
138
|
+
|
|
139
|
+
The **licensor** is the individual or entity offering these
|
|
140
|
+
terms, and the **software** is the software the licensor makes
|
|
141
|
+
available under these terms.
|
|
142
|
+
|
|
143
|
+
A **product** can be a good or service, or a combination
|
|
144
|
+
of them.
|
|
145
|
+
|
|
146
|
+
**You** refers to the individual or entity agreeing to these
|
|
147
|
+
terms.
|
|
148
|
+
|
|
149
|
+
**Your company** is any legal entity, sole proprietorship,
|
|
150
|
+
or other kind of organization that you work for, plus all
|
|
151
|
+
its affiliates.
|
|
152
|
+
|
|
153
|
+
**Affiliates** means the other organizations than an
|
|
154
|
+
organization has control over, is under the control of, or is
|
|
155
|
+
under common control with.
|
|
156
|
+
|
|
157
|
+
**Control** means ownership of substantially all the assets of
|
|
158
|
+
an entity, or the power to direct its management and policies
|
|
159
|
+
by vote, contract, or otherwise. Control can be direct or
|
|
160
|
+
indirect.
|
|
161
|
+
|
|
162
|
+
**Your licenses** are all the licenses granted to you for the
|
|
163
|
+
software under these terms.
|
|
164
|
+
|
|
165
|
+
**Use** means anything you do with the software requiring one
|
|
166
|
+
of your licenses.
|
proofcut-0.29.0/PKG-INFO
ADDED
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: proofcut
|
|
3
|
+
Version: 0.29.0
|
|
4
|
+
Summary: Source-available, local-first AI video editor and MCP server: recordings to a finished film, cut by transcript, then verified
|
|
5
|
+
Author: tydude001
|
|
6
|
+
Author-email: tydude001 <tylergrose321@gmail.com>
|
|
7
|
+
License-Expression: LicenseRef-PolyForm-Shield-1.0.0
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Requires-Dist: mcp>=2
|
|
10
|
+
Requires-Dist: opentimelineio>=0.18.1
|
|
11
|
+
Requires-Dist: pydantic>=2
|
|
12
|
+
Requires-Python: >=3.13, <3.14
|
|
13
|
+
Project-URL: Homepage, https://github.com/tydude001/proofcut
|
|
14
|
+
Project-URL: Documentation, https://github.com/tydude001/proofcut/blob/main/docs/MANUAL.md
|
|
15
|
+
Project-URL: Issues, https://github.com/tydude001/proofcut/issues
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
|
|
18
|
+
# proofcut
|
|
19
|
+
|
|
20
|
+
**An AI video editor that proves its cuts.** Your recordings in, a finished,
|
|
21
|
+
mastered film out: cut by transcript, with b-roll, cards, music and captions,
|
|
22
|
+
and every step an agent can call. proofcut renders on your own machine, then
|
|
23
|
+
transcribes the render and checks that it says what the edit says.
|
|
24
|
+
|
|
25
|
+
https://github.com/user-attachments/assets/4153d180-3d7c-4c70-af5f-54d63d0a8bd5
|
|
26
|
+
|
|
27
|
+
Above: an agent cutting a demo video, unattended. The two runs it was cut
|
|
28
|
+
from, uncut (silent: the recorder took frames only, and the voice is in the
|
|
29
|
+
film the agent cut): [the workspace](https://github.com/tydude001/proofcut/releases/download/v0.23.0/proofcut-v0.23.0-uncut-workspace-run.mp4)
|
|
30
|
+
(2:26) and [Claude Code with the proofcut plugin](https://github.com/tydude001/proofcut/releases/download/v0.23.0/proofcut-v0.23.0-uncut-claude-code-run.mp4)
|
|
31
|
+
(3:09).
|
|
32
|
+
|
|
33
|
+
That is not a staged run. [TRIAL.md](https://github.com/tydude001/proofcut/blob/main/docs/TRIAL.md) scores three unattended
|
|
34
|
+
ones, each handed a goal and no steps, and each passed every one of its checks.
|
|
35
|
+
- **The demo cut**, the one above.
|
|
36
|
+
- **Real footage:** 96 seconds of narration with its fluffed takes left in,
|
|
37
|
+
plus four clips of film footage. The agent cut it to 45 seconds, chose
|
|
38
|
+
footage by what each line was about, burned captions, and checked its own
|
|
39
|
+
render: all 123 expected words heard back.
|
|
40
|
+
- **A whole film:** the demo material plus a score, briefed as a finished film
|
|
41
|
+
ready to upload. In 192 seconds and $2.27 the agent cut it, laid the music
|
|
42
|
+
under the voice, ended on a card, mastered it to −16 LUFS, and checked it.
|
|
43
|
+
The score, the level and the end card were each measured in the delivered
|
|
44
|
+
file, not taken from the project.
|
|
45
|
+
|
|
46
|
+
> **Have a Mac or a Windows PC and half an hour?** Nobody has run proofcut on
|
|
47
|
+
> a Mac yet, and on Windows only its author has. One script runs the whole
|
|
48
|
+
> test and removes what it installed:
|
|
49
|
+
> [Mac](#help-wanted-the-first-run-on-a-mac) or [Windows](#help-wanted-a-windows-run-by-someone-else).
|
|
50
|
+
|
|
51
|
+
## From recordings to a finished film
|
|
52
|
+
|
|
53
|
+
One project, and proofcut's own commands from the first import to the
|
|
54
|
+
delivered file. No NLE finishes the film, and nothing else touches the render.
|
|
55
|
+
Each stage is one command. The [manual](https://github.com/tydude001/proofcut/blob/main/docs/MANUAL.md) walks every one, and
|
|
56
|
+
its [§ Music, holds, a cold open and the master](https://github.com/tydude001/proofcut/blob/main/docs/MANUAL.md#music-holds-a-cold-open-and-the-master)
|
|
57
|
+
covers the sound:
|
|
58
|
+
|
|
59
|
+
| Stage | Command |
|
|
60
|
+
|---|---|
|
|
61
|
+
| Bring in the voiceover and footage, and transcribe | `import`, `transcribe` |
|
|
62
|
+
| Cut retakes and asides by naming their words | `cut vo 111:114` |
|
|
63
|
+
| Hang b-roll and cards off the lines they belong to | `cue add`, `card new` |
|
|
64
|
+
| Open cold on a scene, end on a card | `head`, `tail` |
|
|
65
|
+
| Play the footage's own lines in a gap, or under the narration | `hold add`, `hold under` |
|
|
66
|
+
| Score it: placed passages, crossfaded, levelled under the voice | `music` |
|
|
67
|
+
| Pull breaths down without cutting them | `attenuate` |
|
|
68
|
+
| Render and master to a loudness target | `export --render --loudness -16` |
|
|
69
|
+
| Burn in captions | `captions --burn` |
|
|
70
|
+
| Check the render says what the edit says | `verify`, `frames`, `hold check` |
|
|
71
|
+
|
|
72
|
+
Two video essays of five to six minutes have been rebuilt this way and
|
|
73
|
+
measured against their originals, which had been finished outside proofcut.
|
|
74
|
+
One came out the same length to the frame. The other matched its original's
|
|
75
|
+
63 voiceover ranges to the millisecond, with the voice aligned to the sample,
|
|
76
|
+
starting from a retake pass made in Kdenlive. Both master at the original's
|
|
77
|
+
−16 LUFS (HISTORY.md § The Lambs/Longlegs native rebuild, § The Scream native
|
|
78
|
+
rebuild).
|
|
79
|
+
|
|
80
|
+
proofcut makes no footage and writes no script. It takes what you recorded to
|
|
81
|
+
a film, and proves the film matches the edit.
|
|
82
|
+
|
|
83
|
+
## Why proofcut
|
|
84
|
+
|
|
85
|
+
- **It checks its own work.** `verify` transcribes the finished file and
|
|
86
|
+
diffs it word by word against the timeline, so a retake left in the film is
|
|
87
|
+
caught before anyone watches it. Frame counts and the picture are measured
|
|
88
|
+
too, because ffmpeg, melt and auto-editor all exit 0 on some failures.
|
|
89
|
+
- **Cuts stay addressable.** Every word in a recording keeps a fixed index
|
|
90
|
+
that never renumbers, so `cut vo 111:114` names the same words however many
|
|
91
|
+
cuts came before it. `--plan` prints what a range says before anything
|
|
92
|
+
changes, and `restore` and `undo` walk it back.
|
|
93
|
+
- **Built for agents.** 93 MCP tools with typed inputs and structured
|
|
94
|
+
returns, so Claude Code, Codex or your own agent can drive it. Tools like
|
|
95
|
+
`shot-sheet` return an image of the edit, not a file path the agent can't
|
|
96
|
+
open.
|
|
97
|
+
- **One engine, three ways in.** The MCP server, the `proofcut` command line
|
|
98
|
+
and a browser workspace all call the same operations. Every tool has a
|
|
99
|
+
matching command (the test suite enforces it), so anything an agent does,
|
|
100
|
+
you can script or re-run by hand.
|
|
101
|
+
- **Local-first.** Commercial AI editors are apps around a metered cloud
|
|
102
|
+
service. proofcut transcribes, edits and renders on your machine, and calls
|
|
103
|
+
no cloud service of its own: no account, no per-minute billing. The only
|
|
104
|
+
thing that talks to a model provider is the agent you choose to run (the
|
|
105
|
+
optional footage-description and voice models download once, on first use).
|
|
106
|
+
- **No lock-in.** The timeline is OpenTimelineIO. Export a `.kdenlive` or
|
|
107
|
+
OTIO file, finish in Resolve, Premiere or Kdenlive, and bring your trim back
|
|
108
|
+
with `import-edit`.
|
|
109
|
+
|
|
110
|
+

|
|
115
|
+
|
|
116
|
+
## How it works
|
|
117
|
+
|
|
118
|
+
Every hard part of an editor already exists as mature open source. proofcut
|
|
119
|
+
is the layer that lets an agent drive them, and check what they produced:
|
|
120
|
+
|
|
121
|
+
| Job | Done by |
|
|
122
|
+
|---|---|
|
|
123
|
+
| Cutting, concatenating, captions, rendering | ffmpeg |
|
|
124
|
+
| Word-timed transcription (30+ languages) | openai-whisper |
|
|
125
|
+
| Silence and bad-take removal | auto-editor |
|
|
126
|
+
| The timeline, and export to other editors | OpenTimelineIO |
|
|
127
|
+
| Layered rendering (b-roll, cards, music) | MLT |
|
|
128
|
+
| Title and end cards | SVG templates, rendered by ImageMagick |
|
|
129
|
+
|
|
130
|
+
## Try it
|
|
131
|
+
|
|
132
|
+
Check your machine first, before cloning anything. `proofcut doctor` probes
|
|
133
|
+
every tool proofcut uses and prints the fix for anything missing
|
|
134
|
+
([§ Requirements](#requirements) has the list). With
|
|
135
|
+
[uv](https://docs.astral.sh/uv/) and git installed:
|
|
136
|
+
|
|
137
|
+
```sh
|
|
138
|
+
uvx --from git+https://github.com/tydude001/proofcut proofcut doctor
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
The first run downloads Python 3.13 if uv has none, plus proofcut's
|
|
142
|
+
dependencies, about 230 MB together.
|
|
143
|
+
|
|
144
|
+
On Linux, `proofcut setup` installs whatever doctor marked ✗, for you alone
|
|
145
|
+
and with no sudo, and `proofcut setup --uninstall` removes exactly what it
|
|
146
|
+
added. It says what it will download and asks first; whisper is about 1.9 GB
|
|
147
|
+
of it. On a Mac or a Windows PC, follow the fix doctor prints under each ✗.
|
|
148
|
+
|
|
149
|
+
```sh
|
|
150
|
+
uvx --from git+https://github.com/tydude001/proofcut proofcut setup
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
The demo and your own recordings run from a checkout:
|
|
154
|
+
|
|
155
|
+
```sh
|
|
156
|
+
git clone https://github.com/tydude001/proofcut && cd proofcut
|
|
157
|
+
uv sync
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### The two-minute demo
|
|
161
|
+
|
|
162
|
+
No footage needed. [docs/DEMO.md](https://github.com/tydude001/proofcut/blob/main/docs/DEMO.md) generates a voiceover with a
|
|
163
|
+
real retake, b-roll and a score, then walks a whole small film: cut the retake
|
|
164
|
+
by naming its words, hang b-roll off a phrase, lay the score under the voice,
|
|
165
|
+
render and master it, end on a card, and check the render against the
|
|
166
|
+
timeline.
|
|
167
|
+
|
|
168
|
+
```sh
|
|
169
|
+
uv run python scripts/make_demo.py ~/proofcut-demo
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### In Claude Code
|
|
173
|
+
|
|
174
|
+
The plugin registers proofcut's MCP server, so all 93 tools are available
|
|
175
|
+
with no setup of your own:
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
/plugin marketplace add tydude001/proofcut
|
|
179
|
+
/plugin install proofcut@proofcut
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
The first start downloads about 175 MB of Python dependencies, and Claude
|
|
183
|
+
Code gives a server 30 seconds to connect. On a slow connection, start that
|
|
184
|
+
first session as `MCP_TIMEOUT=300000 claude`. If `/mcp` already shows proofcut
|
|
185
|
+
as failed, reconnect it there; the download keeps what it fetched.
|
|
186
|
+
|
|
187
|
+
Any other MCP client runs the same server, from a checkout or with no
|
|
188
|
+
checkout at all:
|
|
189
|
+
|
|
190
|
+
```sh
|
|
191
|
+
uv run --project /path/to/proofcut proofcut mcp
|
|
192
|
+
uvx --from git+https://github.com/tydude001/proofcut proofcut mcp
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### On your own recording
|
|
196
|
+
|
|
197
|
+
```sh
|
|
198
|
+
uv run proofcut init myproject
|
|
199
|
+
uv run proofcut -C myproject import VO.wav --clip-id vo
|
|
200
|
+
uv run proofcut -C myproject transcribe vo # whisper, word-timed
|
|
201
|
+
uv run proofcut -C myproject seed vo # auto-editor strips silences
|
|
202
|
+
uv run proofcut -C myproject transcript vo --search "here's the thing"
|
|
203
|
+
uv run proofcut -C myproject cut vo 111:114 --plan # what do those indices say?
|
|
204
|
+
uv run proofcut -C myproject cut vo 111:114 --pad 0.1 # inclusive word range
|
|
205
|
+
uv run proofcut -C myproject export final.mp4 --render # or a .kdenlive to finish in an NLE
|
|
206
|
+
uv run proofcut -C myproject verify final.mp4 # did the render say what you edited?
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
To watch the edit instead, open the workspace. It plays the source through
|
|
210
|
+
the edit, so seeing a cut costs no render:
|
|
211
|
+
|
|
212
|
+
```sh
|
|
213
|
+
uv run proofcut -C myproject open # server plus an app window
|
|
214
|
+
uv run proofcut -C myproject web --open # the same page in a browser tab
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## What it does
|
|
218
|
+
|
|
219
|
+
One line each. The [manual](https://github.com/tydude001/proofcut/blob/main/docs/MANUAL.md) covers every command and the
|
|
220
|
+
reasoning behind it.
|
|
221
|
+
|
|
222
|
+
**Editing**
|
|
223
|
+
|
|
224
|
+
- **Cut by transcript.** Word ranges, phrases, or spans of timeline time, all
|
|
225
|
+
undoable.
|
|
226
|
+
- **The workspace.** Edit (transcript, preview, drag-trim and razor), Frame
|
|
227
|
+
(review every crop in place) and Finish (presets, verify, and the finished
|
|
228
|
+
file). The truth strip warns while you edit if the film would ship wrong.
|
|
229
|
+
- **Captions from the timeline.** They stay right after cuts, and the style
|
|
230
|
+
is saved with the project. Karaoke highlight, sidecar ASS, or burned in.
|
|
231
|
+
- **Multi-mic recordings.** A file with two mics is refused until you say how
|
|
232
|
+
to use it (`--mix` or `--audio-stream k`), and `attribute-speakers` labels
|
|
233
|
+
each word with who said it.
|
|
234
|
+
|
|
235
|
+
**Sound**
|
|
236
|
+
|
|
237
|
+
- **A score, placed.** `music` lays a bed under the voiceover from a word,
|
|
238
|
+
as passages that crossfade into each other or assets that rotate. Its level
|
|
239
|
+
is measured against the voice, and it moves with every cut because it stores
|
|
240
|
+
words, not seconds.
|
|
241
|
+
- **The footage's own lines.** `hold add` opens a gap in the narration and
|
|
242
|
+
plays a clip's line across it, with the picture pinned to it. `hold under`
|
|
243
|
+
plays it quietly beneath the voice instead, and `hold check` transcribes
|
|
244
|
+
each one off the render.
|
|
245
|
+
- **A cold open.** `head` plays a scene before the first word, with its own
|
|
246
|
+
audio.
|
|
247
|
+
- **Breaths and the master.** `attenuate` pulls short noises down rather than
|
|
248
|
+
cutting holes. `export --loudness` masters the render to a target, measures
|
|
249
|
+
it before and after, and refuses a master that misses.
|
|
250
|
+
|
|
251
|
+
**Checking**
|
|
252
|
+
|
|
253
|
+
- **Render verification.** `verify` diffs the render's words against the
|
|
254
|
+
timeline. `frames`, `film-check`, `black` and `spots` check the picture.
|
|
255
|
+
- **Transcript self-checks.** Retake seams, invented words, swallowed repeats
|
|
256
|
+
and suspect durations are reported when a transcript is attached, and
|
|
257
|
+
`unspoken` lets the render itself testify to words nobody said.
|
|
258
|
+
- **An agent that can look.** `shot-sheet` draws the whole picture track as
|
|
259
|
+
one labelled grid, and `footage-sheet` browses a clip you haven't cut yet.
|
|
260
|
+
Both return the image itself over MCP.
|
|
261
|
+
|
|
262
|
+
**Picture**
|
|
263
|
+
|
|
264
|
+
- **B-roll by description.** `describe` writes what is on screen in each
|
|
265
|
+
~10-second window of footage, and a cue table lays clips and cards over the
|
|
266
|
+
voiceover by word index.
|
|
267
|
+
- **Cards.** Six SVG title and end card templates, rendered at the project's
|
|
268
|
+
own frame size. Change the size and they are flagged stale, and `card
|
|
269
|
+
reauthor` redraws them at the new size instead of stretching them.
|
|
270
|
+
- **Reframing.** Per-shot crop windows for aspect changes, face-aware
|
|
271
|
+
proposals (`reframe-detect`), a review sheet, and stacked splits for two
|
|
272
|
+
speakers.
|
|
273
|
+
- **Layered rendering.** Timelines with b-roll, cards or music render through
|
|
274
|
+
MLT, and the output file is measured, not trusted.
|
|
275
|
+
- **Derived reels.** `reel` cuts part of the film into a new project, such as
|
|
276
|
+
a vertical teaser. It reports every picture it dropped and pins the ones it
|
|
277
|
+
kept.
|
|
278
|
+
- **NLE round-trip.** Export to Kdenlive or OTIO, finish elsewhere, and
|
|
279
|
+
`import-edit` the trim back.
|
|
280
|
+
|
|
281
|
+

|
|
286
|
+
|
|
287
|
+
proofcut is 0.x software. A project from an older version is refused rather
|
|
288
|
+
than guessed at, and `proofcut migrate` brings it forward.
|
|
289
|
+
|
|
290
|
+
## Help wanted: the first run on a Mac
|
|
291
|
+
|
|
292
|
+
GitHub's macOS runner takes the demo to a checked render, but a runner never
|
|
293
|
+
reads the instructions, and no person has run proofcut on a Mac. If you have
|
|
294
|
+
one and half an hour, one script installs what proofcut needs, makes a short
|
|
295
|
+
test video, has proofcut cut, score, master and check it, and puts a report on your
|
|
296
|
+
Desktop. It asks before it starts.
|
|
297
|
+
|
|
298
|
+
```sh
|
|
299
|
+
git clone https://github.com/tydude001/proofcut
|
|
300
|
+
bash proofcut/scripts/mac_trial.sh
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
It installs `uv`, `ffmpeg-full`, `espeak-ng` and `auto-editor` with Homebrew
|
|
304
|
+
(and Homebrew itself if you have none), plus the Shotcut app for its renderer
|
|
305
|
+
and whisper. It records what it added, and `bash
|
|
306
|
+
proofcut/scripts/mac_trial.sh --uninstall` removes exactly that and nothing
|
|
307
|
+
you already had. Then [file the report](https://github.com/tydude001/proofcut/issues/new?template=mac-test.yml).
|
|
308
|
+
A run that stops at the first step is just as useful, because where it stops
|
|
309
|
+
is the finding.
|
|
310
|
+
|
|
311
|
+
<a id="help-wanted-the-first-run-on-windows"></a>
|
|
312
|
+
|
|
313
|
+
## Help wanted: a Windows run by someone else
|
|
314
|
+
|
|
315
|
+
The author's own Windows 11 laptop ran this test end to end on 2026-09-14
|
|
316
|
+
([#3](https://github.com/tydude001/proofcut/issues/3)), once the one bug it
|
|
317
|
+
found was fixed: the render finished its file and then never exited, which
|
|
318
|
+
GitHub's runner could not show because it has no console. It ran again on
|
|
319
|
+
2026-09-15 with the score and the master the demo now makes, and passed every
|
|
320
|
+
check, including hearing the score in the render. That is one x64 PC,
|
|
321
|
+
set up by the person who wrote the script, so a run by anyone else is still
|
|
322
|
+
the missing report. Windows 10 and ARM64 PCs have not been tried at all. From
|
|
323
|
+
PowerShell:
|
|
324
|
+
|
|
325
|
+
```powershell
|
|
326
|
+
git clone https://github.com/tydude001/proofcut
|
|
327
|
+
powershell -ExecutionPolicy Bypass -File proofcut\scripts\windows_trial.ps1
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
It downloads `uv`, `ffmpeg`, `auto-editor`, `espeak-ng`, Shotcut's renderer
|
|
331
|
+
and whisper into one folder under `%LOCALAPPDATA%`. Nothing is installed
|
|
332
|
+
system-wide and it needs no administrator rights. The same command with
|
|
333
|
+
`-Uninstall` deletes that folder. It puts `proofcut-windows-report.zip` on
|
|
334
|
+
your Desktop with your home folder's name taken out; [file the report](https://github.com/tydude001/proofcut/issues/new?template=windows-test.yml).
|
|
335
|
+
|
|
336
|
+
## Requirements
|
|
337
|
+
|
|
338
|
+
proofcut is developed on Linux (a Fedora-based desktop). On macOS and
|
|
339
|
+
Windows the test suite passes on CI and GitHub's runners take the demo to a
|
|
340
|
+
checked render. On Windows one person's PC has too, the author's; no person
|
|
341
|
+
has run it on a Mac yet. Where each OS stands is in
|
|
342
|
+
[docs/plans/PORTABILITY.md](https://github.com/tydude001/proofcut/blob/main/docs/plans/PORTABILITY.md).
|
|
343
|
+
|
|
344
|
+
Run `uv run proofcut doctor` to check everything below at once. On Linux,
|
|
345
|
+
`uv run proofcut setup` installs any of the last four that doctor marks ✗:
|
|
346
|
+
a static ffmpeg, whisper, auto-editor's release binary and Shotcut's
|
|
347
|
+
portable melt, which renders with no display at all
|
|
348
|
+
([docs/plans/INSTALL.md](https://github.com/tydude001/proofcut/blob/main/docs/plans/INSTALL.md)).
|
|
349
|
+
|
|
350
|
+
| You need | For | Notes |
|
|
351
|
+
|---|---|---|
|
|
352
|
+
| **Python 3.13** and [uv](https://docs.astral.sh/uv/) | everything | `uv sync` installs the Python side. The only runtime dependencies are `mcp` and OpenTimelineIO. |
|
|
353
|
+
| **ffmpeg / ffprobe** built with `libx264`, freetype and libass | every media operation, captions | Fedora's default `ffmpeg-free` has no `libx264`: use RPM Fusion's `ffmpeg`. On a Mac, Homebrew's `ffmpeg` lacks freetype and libass: install `ffmpeg-full` and put `$(brew --prefix ffmpeg-full)/bin` first on `PATH` (it is keg-only). |
|
|
354
|
+
| **[auto-editor](https://github.com/WyattBlue/auto-editor) 31+** | silence removal, single-source renders | Install the upstream binary. The PyPI package is a stale 29.x. |
|
|
355
|
+
| **whisper** | transcription, render verification | Any `openai-whisper` install. `uv tool install --python 3.12 openai-whisper` is the short route (3.12 because torch's Intel-Mac builds stop there); add `--torch-backend cpu` without an NVIDIA GPU (1.9 GB instead of 5.5 GB). Found via `PROOFCUT_WHISPER`, then `PATH`. The CPU build transcribed the demo's 19-second voiceover in 33 seconds. |
|
|
356
|
+
| **MLT (`melt`)** | layered renders (b-roll, cards, music) | Your distribution's MLT package (`mlt` on Fedora, whose `melt` package is an unrelated compression tool), or Kdenlive, whose flatpak copy is found automatically. `PROOFCUT_MELT` overrides both. |
|
|
357
|
+
|
|
358
|
+
Optional. Each unlocks one feature, `proofcut doctor` reports whether it is
|
|
359
|
+
available, and everything else works without it:
|
|
360
|
+
|
|
361
|
+
| Optional | Unlocks | Notes |
|
|
362
|
+
|---|---|---|
|
|
363
|
+
| **ImageMagick 7** (`magick`) | title and end cards | ImageMagick 6's `convert` is not used, so distributions that still ship 6 (Ubuntu 24.04) need ImageMagick's own build. |
|
|
364
|
+
| **[Claude Code](https://docs.claude.com/en/docs/claude-code)** (`claude`, logged in) | the agent pane in the workspace | `proofcut mcp` works with any MCP client; only the pane runs `claude` itself. |
|
|
365
|
+
| **`PROOFCUT_VLM`** | `describe` (b-roll search by what's on screen) | The python of a venv with torch, transformers, bitsandbytes and Pillow, on a CUDA GPU. The Qwen2.5-VL model downloads on first use. |
|
|
366
|
+
| **`PROOFCUT_FACE`** | `reframe-detect` (face-aware crops) | The python of a venv with insightface, onnxruntime and opencv-python. |
|
|
367
|
+
| **`PROOFCUT_TTS`**, **`PROOFCUT_TTS_MODEL`**, **`PROOFCUT_TTS_VOICE`** | `vo-synth` (a line in a cloned voice) | A python with qwen-tts and a CUDA torch, a local Qwen3-TTS snapshot, and a directory holding a reference clip of the voice. There is no default voice, on purpose. |
|
|
368
|
+
|
|
369
|
+
## Working on proofcut
|
|
370
|
+
|
|
371
|
+
Whether you're a person or a coding agent, start with
|
|
372
|
+
[CLAUDE.md](https://github.com/tydude001/proofcut/blob/main/CLAUDE.md). It holds the rules and the traps this repo has
|
|
373
|
+
already hit, and Claude Code loads it automatically.
|
|
374
|
+
[CONTRIBUTING.md](https://github.com/tydude001/proofcut/blob/main/CONTRIBUTING.md) is the short version a pull request is
|
|
375
|
+
checked against, and [SECURITY.md](https://github.com/tydude001/proofcut/blob/main/SECURITY.md) says how to report a
|
|
376
|
+
vulnerability.
|
|
377
|
+
|
|
378
|
+
Where things live:
|
|
379
|
+
|
|
380
|
+
| Path | What it is |
|
|
381
|
+
|---|---|
|
|
382
|
+
| `src/proofcut/ops.py` | Every operation. The MCP tools, the CLI and the web UI all call these. |
|
|
383
|
+
| `src/proofcut/server.py` | The MCP server. Register tools with `@_tool()`, never `@mcp.tool()`. |
|
|
384
|
+
| `src/proofcut/cli.py` | The `proofcut` command: one subcommand per tool, printing JSON. |
|
|
385
|
+
| `src/proofcut/webui.py`, `src/proofcut/web/` | The workspace. It posts to `ops` and renders what comes back; it never decides anything itself. |
|
|
386
|
+
| `src/proofcut/project.py`, `timeline.py` | The project manifest (`proofcut.json`) and the OTIO timeline. |
|
|
387
|
+
| `tests/` | `test_server_stdio.py` drives a real `proofcut mcp` subprocess; `test_webui_http.py` a real socket. |
|
|
388
|
+
| `scripts/` | The demo maker, the Mac and Windows trial kits, screenshot capture. |
|
|
389
|
+
| `docs/` | The manual, the demo, and the design record (below). |
|
|
390
|
+
|
|
391
|
+
Run the checks:
|
|
392
|
+
|
|
393
|
+
```sh
|
|
394
|
+
uv sync
|
|
395
|
+
uv run ruff check . # never `ruff format`; see CONTRIBUTING.md
|
|
396
|
+
uv run pytest
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
The suite talks to a real `proofcut mcp` subprocess, so it is slower than a
|
|
400
|
+
pure unit suite. Tests that need whisper, auto-editor, melt or ImageMagick
|
|
401
|
+
skip when the tool is missing. Tests that render through `melt` also need a
|
|
402
|
+
display: on a headless machine use `QT_QPA_PLATFORM=offscreen` or `xvfb-run
|
|
403
|
+
-a` (`proofcut doctor` tells you which your MLT needs). Without one they fail
|
|
404
|
+
with "no display for MLT's Qt module to open", which is the environment, not a
|
|
405
|
+
regression.
|
|
406
|
+
|
|
407
|
+
## Documentation
|
|
408
|
+
|
|
409
|
+
- [docs/MANUAL.md](https://github.com/tydude001/proofcut/blob/main/docs/MANUAL.md): every command, with the reasoning.
|
|
410
|
+
- [docs/DEMO.md](https://github.com/tydude001/proofcut/blob/main/docs/DEMO.md): the whole loop in two minutes.
|
|
411
|
+
|
|
412
|
+
proofcut's reasoning is part of what it ships, so the design record is public:
|
|
413
|
+
|
|
414
|
+
- [PLAN.md](https://github.com/tydude001/proofcut/blob/main/docs/PLAN.md): architecture, stack decisions, open questions.
|
|
415
|
+
- [HISTORY.md](https://github.com/tydude001/proofcut/blob/main/docs/HISTORY.md): the dated record of what shipped and what the
|
|
416
|
+
evidence said.
|
|
417
|
+
- [PRIOR-ART.md](https://github.com/tydude001/proofcut/blob/main/docs/PRIOR-ART.md): what else exists in this space, and what
|
|
418
|
+
proofcut does that they don't.
|
|
419
|
+
- [NEXT.md](https://github.com/tydude001/proofcut/blob/main/docs/NEXT.md): the directions after the queues closed, ranked.
|
|
420
|
+
- [TRIAL.md](https://github.com/tydude001/proofcut/blob/main/docs/TRIAL.md): an agent cutting a video end to end, unattended
|
|
421
|
+
and scored.
|
|
422
|
+
- [docs/plans/](https://github.com/tydude001/proofcut/tree/main/docs/plans): the plans. LAUNCH.md, PORTABILITY.md, NATIVE.md
|
|
423
|
+
and SHOWCASE.md are in progress, and RENAME.md is done. Three are finished and kept because the code
|
|
424
|
+
cites their reasoning: [DAYDREAM.md](https://github.com/tydude001/proofcut/blob/main/docs/plans/DAYDREAM.md), the
|
|
425
|
+
feature map from [Daydream](https://www.daydreamvideo.com), the closest
|
|
426
|
+
commercial product; [STUDIO.md](https://github.com/tydude001/proofcut/blob/main/docs/plans/STUDIO.md), the workspace
|
|
427
|
+
design; and [POLISH.md](https://github.com/tydude001/proofcut/blob/main/docs/plans/POLISH.md), the works-for-anyone pass.
|
|
428
|
+
|
|
429
|
+
## License
|
|
430
|
+
|
|
431
|
+
[PolyForm Shield 1.0.0](https://github.com/tydude001/proofcut/blob/main/LICENSE). proofcut is source-available, not open
|
|
432
|
+
source: you can read, run, change and redistribute it for any purpose except
|
|
433
|
+
building a product that competes with it. Cutting your own videos, running it
|
|
434
|
+
for clients, building on it and forking it to fix a bug are all fine. For a
|
|
435
|
+
commercial licence, ask.
|
|
436
|
+
|
|
437
|
+
The bundled typefaces are not proofcut's to relicense. The caption face in
|
|
438
|
+
`src/proofcut/fonts/` and the three browser faces in `src/proofcut/web/` are
|
|
439
|
+
OFL-1.1, each with its licence text beside it and its source in that
|
|
440
|
+
directory's `FONTS.md`.
|
|
441
|
+
|
|
442
|
+
## Say thanks
|
|
443
|
+
|
|
444
|
+
If proofcut cut a video for you, you can [buy me a coffee on Ko-fi](https://ko-fi.com/tydude001).
|