cutpoint 0.1.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.
Files changed (84) hide show
  1. cutpoint-0.1.0/.gitignore +53 -0
  2. cutpoint-0.1.0/AGENTS.md +139 -0
  3. cutpoint-0.1.0/LICENSE +21 -0
  4. cutpoint-0.1.0/PKG-INFO +137 -0
  5. cutpoint-0.1.0/README.md +85 -0
  6. cutpoint-0.1.0/config.example.json +46 -0
  7. cutpoint-0.1.0/docs/troubleshooting/README.md +36 -0
  8. cutpoint-0.1.0/docs/workflows/README.md +94 -0
  9. cutpoint-0.1.0/pyproject.toml +132 -0
  10. cutpoint-0.1.0/src/cutpoint/__init__.py +16 -0
  11. cutpoint-0.1.0/src/cutpoint/__main__.py +8 -0
  12. cutpoint-0.1.0/src/cutpoint/activity.py +476 -0
  13. cutpoint-0.1.0/src/cutpoint/analyze.py +1151 -0
  14. cutpoint-0.1.0/src/cutpoint/assemble.py +442 -0
  15. cutpoint-0.1.0/src/cutpoint/backends.py +52 -0
  16. cutpoint-0.1.0/src/cutpoint/boundaries.py +666 -0
  17. cutpoint-0.1.0/src/cutpoint/cache.py +109 -0
  18. cutpoint-0.1.0/src/cutpoint/cli.py +920 -0
  19. cutpoint-0.1.0/src/cutpoint/clips.py +836 -0
  20. cutpoint-0.1.0/src/cutpoint/config.py +240 -0
  21. cutpoint-0.1.0/src/cutpoint/crash.py +1193 -0
  22. cutpoint-0.1.0/src/cutpoint/crop.py +149 -0
  23. cutpoint-0.1.0/src/cutpoint/dsp.py +16 -0
  24. cutpoint-0.1.0/src/cutpoint/encode.py +216 -0
  25. cutpoint-0.1.0/src/cutpoint/events/__init__.py +1 -0
  26. cutpoint-0.1.0/src/cutpoint/events/audio_events.py +369 -0
  27. cutpoint-0.1.0/src/cutpoint/events/cli.py +249 -0
  28. cutpoint-0.1.0/src/cutpoint/events/common.py +311 -0
  29. cutpoint-0.1.0/src/cutpoint/events/discover.py +570 -0
  30. cutpoint-0.1.0/src/cutpoint/events/killfeed.py +1366 -0
  31. cutpoint-0.1.0/src/cutpoint/events/llama_server.py +283 -0
  32. cutpoint-0.1.0/src/cutpoint/events/paths.py +131 -0
  33. cutpoint-0.1.0/src/cutpoint/events/pipeline.py +492 -0
  34. cutpoint-0.1.0/src/cutpoint/events/presets/wt.json +90 -0
  35. cutpoint-0.1.0/src/cutpoint/events/regions.py +354 -0
  36. cutpoint-0.1.0/src/cutpoint/events/report.py +192 -0
  37. cutpoint-0.1.0/src/cutpoint/events/scoring.py +138 -0
  38. cutpoint-0.1.0/src/cutpoint/events/setup.py +224 -0
  39. cutpoint-0.1.0/src/cutpoint/events/sheets.py +171 -0
  40. cutpoint-0.1.0/src/cutpoint/events/tails.py +179 -0
  41. cutpoint-0.1.0/src/cutpoint/events/visual.py +782 -0
  42. cutpoint-0.1.0/src/cutpoint/events/vlm_windows.py +869 -0
  43. cutpoint-0.1.0/src/cutpoint/events/voice.py +363 -0
  44. cutpoint-0.1.0/src/cutpoint/extend.py +448 -0
  45. cutpoint-0.1.0/src/cutpoint/extras.py +54 -0
  46. cutpoint-0.1.0/src/cutpoint/ffmpeg_utils.py +1061 -0
  47. cutpoint-0.1.0/src/cutpoint/mix.py +768 -0
  48. cutpoint-0.1.0/src/cutpoint/pano/__init__.py +15 -0
  49. cutpoint-0.1.0/src/cutpoint/pano/check.py +56 -0
  50. cutpoint-0.1.0/src/cutpoint/pano/cli.py +710 -0
  51. cutpoint-0.1.0/src/cutpoint/pano/director.py +1319 -0
  52. cutpoint-0.1.0/src/cutpoint/pano/geometry.py +687 -0
  53. cutpoint-0.1.0/src/cutpoint/pano/project.py +470 -0
  54. cutpoint-0.1.0/src/cutpoint/pano/qa.py +954 -0
  55. cutpoint-0.1.0/src/cutpoint/pano/qa_paths.py +384 -0
  56. cutpoint-0.1.0/src/cutpoint/pano/render.py +574 -0
  57. cutpoint-0.1.0/src/cutpoint/pano/repair.py +488 -0
  58. cutpoint-0.1.0/src/cutpoint/pano/stitch.py +778 -0
  59. cutpoint-0.1.0/src/cutpoint/pano/views.py +936 -0
  60. cutpoint-0.1.0/src/cutpoint/pano/vlcheck.py +290 -0
  61. cutpoint-0.1.0/src/cutpoint/pano/x3.py +273 -0
  62. cutpoint-0.1.0/src/cutpoint/paths.py +142 -0
  63. cutpoint-0.1.0/src/cutpoint/planning.py +276 -0
  64. cutpoint-0.1.0/src/cutpoint/presets/activities/base.json +67 -0
  65. cutpoint-0.1.0/src/cutpoint/presets/activities/generic.json +21 -0
  66. cutpoint-0.1.0/src/cutpoint/presets/activities/hike.json +34 -0
  67. cutpoint-0.1.0/src/cutpoint/presets/activities/moto.json +40 -0
  68. cutpoint-0.1.0/src/cutpoint/presets/activities/mtb.json +43 -0
  69. cutpoint-0.1.0/src/cutpoint/presets/activities/skate.json +35 -0
  70. cutpoint-0.1.0/src/cutpoint/presets/activities/ski.json +57 -0
  71. cutpoint-0.1.0/src/cutpoint/presets/activities/snowboard.json +37 -0
  72. cutpoint-0.1.0/src/cutpoint/presets/activities/surf.json +37 -0
  73. cutpoint-0.1.0/src/cutpoint/refmatch.py +1345 -0
  74. cutpoint-0.1.0/src/cutpoint/ski.py +688 -0
  75. cutpoint-0.1.0/src/cutpoint/sources.py +166 -0
  76. cutpoint-0.1.0/src/cutpoint/stage.py +235 -0
  77. cutpoint-0.1.0/src/cutpoint/state.py +90 -0
  78. cutpoint-0.1.0/src/cutpoint/styles.py +370 -0
  79. cutpoint-0.1.0/src/cutpoint/tail.py +259 -0
  80. cutpoint-0.1.0/src/cutpoint/telemetry.py +863 -0
  81. cutpoint-0.1.0/src/cutpoint/timeline.py +140 -0
  82. cutpoint-0.1.0/src/cutpoint/transcribe.py +215 -0
  83. cutpoint-0.1.0/src/cutpoint/utils.py +95 -0
  84. cutpoint-0.1.0/src/cutpoint/vision.py +211 -0
@@ -0,0 +1,53 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .venv/
6
+ build/
7
+ dist/
8
+ .pytest_cache/
9
+ .ruff_cache/
10
+ .coverage
11
+ htmlcov/
12
+
13
+ # Runtime data (lives in CUTPOINT_HOME, default %LOCALAPPDATA%\cutpoint)
14
+ cache/
15
+ models/
16
+ tools/llama.cpp/
17
+ stage/
18
+ projects/
19
+
20
+ # Local, personal config and learned styles (old repo-root layout; now in CUTPOINT_HOME,
21
+ # keys documented in config.example.json)
22
+ config.json
23
+ styles_learned/
24
+ EDIT_NOTES.md
25
+
26
+ # Media
27
+ *.mp4
28
+ *.mov
29
+ *.mkv
30
+ *.insv
31
+ *.lrv
32
+ *.wav
33
+ *.npy
34
+ *.npz
35
+
36
+ # OS / editors
37
+ .DS_Store
38
+ Thumbs.db
39
+ .vscode/
40
+ .idea/
41
+
42
+ # Insta360 SDK (under NDA): never commit SDK files; keep them outside the repo,
43
+ # e.g. in <CUTPOINT_HOME>/sdk/insta360/
44
+ sdk/
45
+ **/insta360/
46
+ MediaSDK*
47
+ RealTimeStitcherSDKTest*
48
+ *CameraSDK*
49
+ *InsMetaDataSDK*
50
+ *.deb
51
+ ins_stitcher.h
52
+ ins_common.h
53
+ ins_realtime_stitcher.h
@@ -0,0 +1,139 @@
1
+ # Cutpoint for AI agents
2
+
3
+ You are an AI agent asked to edit video with Cutpoint. This file is what you need. Read this any
4
+ time with `cutpoint guide`. If you are instead changing this repository's code, read
5
+ [CONTRIBUTING.md](https://github.com/FerventOrange/cutpoint/blob/main/CONTRIBUTING.md).
6
+
7
+ Cutpoint finds the best moments in long recordings, exports them as numbered clips and
8
+ assembles a finished video. It runs locally, never modifies source videos, and writes
9
+ everything into a project folder.
10
+
11
+ ## Status: what you can rely on
12
+
13
+ | Available now | Planned (do not call; it does not exist yet) |
14
+ |---|---|
15
+ | CLI `cutpoint` with the commands below | `cutpoint edit`, `cutpoint init` |
16
+ | Result files in the project folder (JSON and text) | JSON on stdout for every command |
17
+ | Activity profiles for crash detection: `cutpoint profile`, `--context` on `profile` and `crashes` | Agent skill, profiles for the other layers and for games |
18
+
19
+ If the user asks for "edit this video and make it a montage" in one step, do it with the loop
20
+ below.
21
+
22
+ ## Calling the CLI
23
+
24
+ - If installed as a tool (`uv tool install cutpoint`), run `cutpoint <command> ...`; from a
25
+ clone, `uv run cutpoint <command> ...`. The examples below use `uv run cutpoint`; with a tool
26
+ install, drop `uv run`. First-time setup is in
27
+ [docs/getting-started.md](https://github.com/FerventOrange/cutpoint/blob/main/docs/getting-started.md).
28
+ Check it works with `cutpoint paths` (or `uv run cutpoint paths`).
29
+ - Exit codes: `0` success, `1` error, `130` interrupted, `2` bad arguments.
30
+ - Logs and errors go to stderr as `HH:MM:SS LEVEL message`; errors are `ERROR` lines. Use
31
+ `cutpoint -v <command>` (flag before the command) for debug output and tracebacks.
32
+ - Paths inside a project must start with `projects\<name>\...` or be absolute; a bare name means
33
+ the project itself.
34
+ - Results are files, not stdout. Read the JSON files below instead of parsing logs.
35
+ - Commands are re-runnable. Per-source results are cached (path, size, modification time).
36
+ `clips` refuses a non-empty output folder without `--force`.
37
+ - Transcription, `events` and export can take minutes to hours. Run them in the background or
38
+ with a long timeout.
39
+ - Never modify or delete the user's source videos. You may delete or rename clips in a project's
40
+ `clips` folder during review.
41
+ - Use the real options: `cutpoint <command> --help` is authoritative;
42
+ [docs/commands.md](https://github.com/FerventOrange/cutpoint/blob/main/docs/commands.md)
43
+ explains them.
44
+
45
+ ## The full edit
46
+
47
+ Given a request such as "edit D:\Videos\clip.mp4 into a funny-moments montage":
48
+
49
+ 1. **Pick a style** from the request: `funny`, `gaming`, `action`, `sport`, `commentary`
50
+ (long talk), `ski` (action-cam with telemetry). Footage that is not any of these: use `action`
51
+ or `gaming`.
52
+ 2. **Analyze.**
53
+
54
+ ```powershell
55
+ uv run cutpoint analyze D:\Videos\clip.mp4 --style funny --out clip-edit
56
+ ```
57
+
58
+ Writes `highlights.json` and `transcript.txt` into the project folder (`<projects>\clip-edit`, see
59
+ `cutpoint paths`).
60
+ 3. **Optional, game footage or when a model-based pass is requested:**
61
+ `uv run cutpoint events clip-edit` (needs the `events` extra and `cutpoint setup`). It
62
+ re-ranks `highlights.json` and writes `events.json` and `events.txt`. If it reports a missing
63
+ module, tell the user how to add the extra (see [When something fails](#when-something-fails)).
64
+ 4. **Choose moments.** Read `highlights.json` (`candidates` with `id`, `source`, `start`, `end`,
65
+ `score` 0-100, `label`, `transcript`; `suggested_top`) and, for banter and funny moments,
66
+ `transcript.txt` (`[file.mp4 00:12:31.4-00:12:38.9] text`). Then either:
67
+ - take the top N: `uv run cutpoint clips clip-edit --top 8` (or `--max-total 60` for a
68
+ length cap, `--ids h001 h004`), or
69
+ - export your own picks with a segments file:
70
+
71
+ ```json
72
+ [
73
+ {"source": "D:/Videos/clip.mp4", "start": 312.4, "end": 330.0, "label": "intro"},
74
+ {"source": "D:/Videos/clip.mp4", "start": 1204.0, "end": 1219.5, "label": "joke"}
75
+ ]
76
+ ```
77
+
78
+ `uv run cutpoint clips clip-edit --segments segments.json`
79
+ 5. **Review.** Clips are `clips\001_<label>.mp4`, `002_...`, and `clips\manifest.json` maps each
80
+ to its source and times. Tell the user what was exported. Delete clips the user rejects and
81
+ rename to reorder (for example `005_x.mp4` to `001b_x.mp4`).
82
+ 6. **Assemble.**
83
+
84
+ ```powershell
85
+ uv run cutpoint assemble projects\clip-edit\clips --transition fade --loudnorm
86
+ ```
87
+
88
+ Writes `final.mp4`, `final.fcpxml` and `final.otio` in the project folder.
89
+ 7. **Report** the paths of `final.mp4` and the clips folder.
90
+
91
+ Variants:
92
+
93
+ | Request | Do |
94
+ |---|---|
95
+ | Short clip or reel for social media | `clips <project> --vertical --max-total 60`, then `assemble projects\<project>\clips_vertical --captions` |
96
+ | Highlights of a specific length | `clips <project> --max-total <seconds>` |
97
+ | "Extra" instruction such as "only funny moments" or "keep the speech intact" | Choose `--style`, filter candidates by `transcript`/`label`, use `--segments`. The CLI does not parse these instructions |
98
+ | The user says what the footage is ("downhill mtb, chest mount, muddy lens") | Before `crashes`, run `profile <project> --context "<the user's words>"`; check the choice with `profile <project> --json`. Use `--activity NAME` only when the user names a sport that has a profile. Do not edit profile files |
99
+ | Room to trim in an editor | `clips ... --extend 1.5` or `extend <clips_dir> --seconds 2` |
100
+ | 360 (Insta360 X3) footage | [docs/workflows/360.md](https://github.com/FerventOrange/cutpoint/blob/main/docs/workflows/360.md) |
101
+ | Action-cam with telemetry | [docs/workflows/action-cam.md](https://github.com/FerventOrange/cutpoint/blob/main/docs/workflows/action-cam.md) |
102
+ | Gameplay with kill feeds | [docs/workflows/game-streams.md](https://github.com/FerventOrange/cutpoint/blob/main/docs/workflows/game-streams.md) |
103
+
104
+ ## Project files
105
+
106
+ | File | Written by | Content |
107
+ |---|---|---|
108
+ | `highlights.json` | `analyze`, `events` | Ranked candidates and settings |
109
+ | `transcript.txt` | `analyze` | Time-stamped transcript |
110
+ | `events.json`, `events.txt` | `events` | Detected sounds, HUD events, model descriptions |
111
+ | `clips/manifest.json` | `clips`, `extend` | Per clip: source, start, end, score, label, tail, crop |
112
+ | `final.mp4`, `final.fcpxml`, `final.otio` | `assemble` | Result and timelines |
113
+ | `crashes.json`, `telemetry.json`, `mix_segments.json` | action-cam commands | See the action-cam page |
114
+ | `activity.json` | `profile`, `crashes` | Activity profile in use: `name`, `source`, `profile` |
115
+
116
+ ## When something fails
117
+
118
+ Read the `ERROR` line, then
119
+ [docs/troubleshooting/README.md](https://github.com/FerventOrange/cutpoint/blob/main/docs/troubleshooting/README.md).
120
+ The usual causes: ffmpeg not on `PATH`, a missing optional extra, Ollama not reachable (only
121
+ affects `--vision`), a non-empty output folder.
122
+
123
+ A missing extra `X` (for example `events`) is added differently per install. Tell the user the
124
+ command for theirs:
125
+
126
+ - From a clone: `uv sync --extra X`, listing every other extra in use too (the error prints this
127
+ form).
128
+ - Tool install: `uv tool install "cutpoint[X]" --reinstall`, listing every extra in use. With an
129
+ NVIDIA GPU and the `events` extra, add
130
+ `--index https://download.pytorch.org/whl/cu126 --index-strategy unsafe-best-match` so torch
131
+ uses CUDA ([getting started](https://github.com/FerventOrange/cutpoint/blob/main/docs/getting-started.md#install-as-a-tool-optional)).
132
+
133
+ ## Rules
134
+
135
+ - Ask the user before running `cutpoint setup` (about 8 GB of downloads), `cutpoint stage`
136
+ (copies footage to local disk) or `clips --force` over an existing folder.
137
+ - Do not paste Insta360 SDK files, documentation or output into any file or message, other than
138
+ `error:` lines.
139
+ - Do not invent options. Check `--help`.
cutpoint-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 FerventOrange
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,137 @@
1
+ Metadata-Version: 2.5
2
+ Name: cutpoint
3
+ Version: 0.1.0
4
+ Summary: Local, agent-driven AI video editor: finds highlights, cuts clips, builds montages, handles 360 video.
5
+ License-Expression: MIT
6
+ License-File: LICENSE
7
+ Classifier: Operating System :: Microsoft :: Windows
8
+ Classifier: Operating System :: POSIX :: Linux
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Programming Language :: Python :: 3.12
11
+ Classifier: Topic :: Multimedia :: Video
12
+ Requires-Python: <3.13,>=3.12
13
+ Requires-Dist: faster-whisper>=1.2.1
14
+ Requires-Dist: numpy<3,>=2.5.4
15
+ Requires-Dist: nvidia-cublas-cu12>=12.4; sys_platform == 'linux'
16
+ Requires-Dist: nvidia-cublas-cu12>=12.9.2.10; sys_platform == 'win32'
17
+ Requires-Dist: nvidia-cudnn-cu12>=9.1; sys_platform == 'linux'
18
+ Requires-Dist: nvidia-cudnn-cu12>=9.27.0.42; sys_platform == 'win32'
19
+ Requires-Dist: opencv-python>=5.0.0.93
20
+ Requires-Dist: opentimelineio>=0.18.1
21
+ Requires-Dist: requests>=2.34.2
22
+ Requires-Dist: scenedetect>=0.7.2
23
+ Provides-Extra: all
24
+ Requires-Dist: onnxruntime>=1.31.0; extra == 'all'
25
+ Requires-Dist: open-clip-torch>=3.3.0; extra == 'all'
26
+ Requires-Dist: panns-inference>=0.1.1; extra == 'all'
27
+ Requires-Dist: rapidocr-onnxruntime>=1.4.4; extra == 'all'
28
+ Requires-Dist: scikit-learn>=1.9.1; extra == 'all'
29
+ Requires-Dist: scipy>=1.18.1; extra == 'all'
30
+ Requires-Dist: telemetry-parser>=0.3.0; extra == 'all'
31
+ Requires-Dist: torch==2.14.1; extra == 'all'
32
+ Requires-Dist: torchlibrosa>=0.1.0; extra == 'all'
33
+ Requires-Dist: torchvision==0.29.1; extra == 'all'
34
+ Provides-Extra: dev
35
+ Requires-Dist: pre-commit>=3.7; extra == 'dev'
36
+ Requires-Dist: pytest>=8; extra == 'dev'
37
+ Requires-Dist: ruff==0.17.1; extra == 'dev'
38
+ Provides-Extra: events
39
+ Requires-Dist: onnxruntime>=1.31.0; extra == 'events'
40
+ Requires-Dist: open-clip-torch>=3.3.0; extra == 'events'
41
+ Requires-Dist: panns-inference>=0.1.1; extra == 'events'
42
+ Requires-Dist: rapidocr-onnxruntime>=1.4.4; extra == 'events'
43
+ Requires-Dist: scikit-learn>=1.9.1; extra == 'events'
44
+ Requires-Dist: scipy>=1.18.1; extra == 'events'
45
+ Requires-Dist: torch==2.14.1; extra == 'events'
46
+ Requires-Dist: torchlibrosa>=0.1.0; extra == 'events'
47
+ Requires-Dist: torchvision==0.29.1; extra == 'events'
48
+ Provides-Extra: gpu
49
+ Provides-Extra: ski
50
+ Requires-Dist: telemetry-parser>=0.3.0; extra == 'ski'
51
+ Description-Content-Type: text/markdown
52
+
53
+ <p align="center">
54
+ <img src="https://raw.githubusercontent.com/FerventOrange/cutpoint/main/docs/assets/logo-256.png" alt="Cutpoint logo: a clapperboard with three characters peeking out" width="200">
55
+ </p>
56
+
57
+ # Cutpoint
58
+
59
+ Cutpoint is an AI video editor that your coding agent drives. Tell the agent to edit a video and
60
+ it finds the best moments, cuts them into clips and assembles the result. All analysis runs on
61
+ your own computer, so your agent does not spend API credits on video, and your original files
62
+ are never changed.
63
+
64
+ [Are you an AI agent? Start here](https://github.com/FerventOrange/cutpoint/blob/main/AGENTS.md)
65
+
66
+ (Installed from PyPI? Run `cutpoint guide`.)
67
+
68
+ ## What you get
69
+
70
+ - Trimmed, numbered clips of the best moments
71
+ - A transcript of the video with timestamps
72
+ - A finished video, `final.mp4`, plus timelines you can open in DaVinci Resolve
73
+ - Vertical (9:16) versions for shorts and reels
74
+ - Works on gameplay, action-cam, sport, funny moments, commentary and 360 video
75
+
76
+ ## Use it
77
+
78
+ 1. Install Cutpoint (below).
79
+ 2. Open your agent (Claude Code, Codex, Grok CLI or any CLI agent) in the Cutpoint folder, or
80
+ tell it where Cutpoint is.
81
+ 3. Ask it to edit your video:
82
+
83
+ > Edit D:\Videos\clip.mp4 into a 60 second highlights video with Cutpoint.
84
+
85
+ > Find the funniest moments in ~/Videos/stream.mp4 and show me the clips before you
86
+ > assemble them.
87
+
88
+ > Make a vertical montage from ~/Videos/ride.mp4.
89
+
90
+ The agent runs Cutpoint, shows you the clips and writes the result into a project folder.
91
+ Delete or rename clips to change the cut, then ask the agent to assemble again.
92
+
93
+ One-command editing (`cutpoint edit`), a first-run setup wizard and an agent skill are
94
+ planned. Today the agent runs the steps itself using [AGENTS.md](https://github.com/FerventOrange/cutpoint/blob/main/AGENTS.md).
95
+
96
+ ## Requirements
97
+
98
+ - Windows or Linux
99
+ - Python 3.12 and [uv](https://docs.astral.sh/uv/)
100
+ - ffmpeg
101
+ - An NVIDIA GPU is recommended. Without one, everything still runs but slower.
102
+ - Optional: Ollama for AI frame rating, extra downloads (about 8 GB) for sound, on-screen text
103
+ and scene-description features
104
+
105
+ ## Install
106
+
107
+ ```powershell
108
+ winget install --id Gyan.FFmpeg -e
109
+ winget install --id astral-sh.uv -e
110
+ git clone https://github.com/FerventOrange/cutpoint.git
111
+ cd cutpoint
112
+ uv sync
113
+ uv run cutpoint paths
114
+ ```
115
+
116
+ To get a global `cutpoint` command instead, run `uv tool install cutpoint` (from PyPI) after
117
+ installing ffmpeg and uv.
118
+
119
+ On Linux, install ffmpeg and uv with your package manager or their installers, then run the
120
+ last four commands. The optional extras and model downloads are explained in
121
+ [Getting started](https://github.com/FerventOrange/cutpoint/blob/main/docs/getting-started.md).
122
+
123
+ ## Documentation
124
+
125
+ - [Getting started](https://github.com/FerventOrange/cutpoint/blob/main/docs/getting-started.md): install, first run, where data is stored, models
126
+ - [Using Cutpoint from an agent](https://github.com/FerventOrange/cutpoint/blob/main/docs/agents.md): set up Claude Code, Codex, Grok or another agent
127
+ - [Workflows](https://github.com/FerventOrange/cutpoint/blob/main/docs/workflows/README.md): montages, game streams, action-cam, 360 video, vertical output
128
+ - [Command reference](https://github.com/FerventOrange/cutpoint/blob/main/docs/commands.md)
129
+ - [Configuration](https://github.com/FerventOrange/cutpoint/blob/main/docs/configuration.md)
130
+ - [Troubleshooting](https://github.com/FerventOrange/cutpoint/blob/main/docs/troubleshooting/README.md)
131
+ - [FAQ](https://github.com/FerventOrange/cutpoint/blob/main/docs/faq.md)
132
+ - [Architecture](https://github.com/FerventOrange/cutpoint/blob/main/docs/architecture.md), [Contributing](https://github.com/FerventOrange/cutpoint/blob/main/CONTRIBUTING.md), [Security](https://github.com/FerventOrange/cutpoint/blob/main/SECURITY.md)
133
+ - [Insta360 SDK](https://github.com/FerventOrange/cutpoint/blob/main/docs/insta360-sdk.md): optional, for high-quality 360 stitching
134
+
135
+ ## License
136
+
137
+ Cutpoint is released under the [MIT License](https://github.com/FerventOrange/cutpoint/blob/main/LICENSE).
@@ -0,0 +1,85 @@
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/FerventOrange/cutpoint/main/docs/assets/logo-256.png" alt="Cutpoint logo: a clapperboard with three characters peeking out" width="200">
3
+ </p>
4
+
5
+ # Cutpoint
6
+
7
+ Cutpoint is an AI video editor that your coding agent drives. Tell the agent to edit a video and
8
+ it finds the best moments, cuts them into clips and assembles the result. All analysis runs on
9
+ your own computer, so your agent does not spend API credits on video, and your original files
10
+ are never changed.
11
+
12
+ [Are you an AI agent? Start here](https://github.com/FerventOrange/cutpoint/blob/main/AGENTS.md)
13
+
14
+ (Installed from PyPI? Run `cutpoint guide`.)
15
+
16
+ ## What you get
17
+
18
+ - Trimmed, numbered clips of the best moments
19
+ - A transcript of the video with timestamps
20
+ - A finished video, `final.mp4`, plus timelines you can open in DaVinci Resolve
21
+ - Vertical (9:16) versions for shorts and reels
22
+ - Works on gameplay, action-cam, sport, funny moments, commentary and 360 video
23
+
24
+ ## Use it
25
+
26
+ 1. Install Cutpoint (below).
27
+ 2. Open your agent (Claude Code, Codex, Grok CLI or any CLI agent) in the Cutpoint folder, or
28
+ tell it where Cutpoint is.
29
+ 3. Ask it to edit your video:
30
+
31
+ > Edit D:\Videos\clip.mp4 into a 60 second highlights video with Cutpoint.
32
+
33
+ > Find the funniest moments in ~/Videos/stream.mp4 and show me the clips before you
34
+ > assemble them.
35
+
36
+ > Make a vertical montage from ~/Videos/ride.mp4.
37
+
38
+ The agent runs Cutpoint, shows you the clips and writes the result into a project folder.
39
+ Delete or rename clips to change the cut, then ask the agent to assemble again.
40
+
41
+ One-command editing (`cutpoint edit`), a first-run setup wizard and an agent skill are
42
+ planned. Today the agent runs the steps itself using [AGENTS.md](https://github.com/FerventOrange/cutpoint/blob/main/AGENTS.md).
43
+
44
+ ## Requirements
45
+
46
+ - Windows or Linux
47
+ - Python 3.12 and [uv](https://docs.astral.sh/uv/)
48
+ - ffmpeg
49
+ - An NVIDIA GPU is recommended. Without one, everything still runs but slower.
50
+ - Optional: Ollama for AI frame rating, extra downloads (about 8 GB) for sound, on-screen text
51
+ and scene-description features
52
+
53
+ ## Install
54
+
55
+ ```powershell
56
+ winget install --id Gyan.FFmpeg -e
57
+ winget install --id astral-sh.uv -e
58
+ git clone https://github.com/FerventOrange/cutpoint.git
59
+ cd cutpoint
60
+ uv sync
61
+ uv run cutpoint paths
62
+ ```
63
+
64
+ To get a global `cutpoint` command instead, run `uv tool install cutpoint` (from PyPI) after
65
+ installing ffmpeg and uv.
66
+
67
+ On Linux, install ffmpeg and uv with your package manager or their installers, then run the
68
+ last four commands. The optional extras and model downloads are explained in
69
+ [Getting started](https://github.com/FerventOrange/cutpoint/blob/main/docs/getting-started.md).
70
+
71
+ ## Documentation
72
+
73
+ - [Getting started](https://github.com/FerventOrange/cutpoint/blob/main/docs/getting-started.md): install, first run, where data is stored, models
74
+ - [Using Cutpoint from an agent](https://github.com/FerventOrange/cutpoint/blob/main/docs/agents.md): set up Claude Code, Codex, Grok or another agent
75
+ - [Workflows](https://github.com/FerventOrange/cutpoint/blob/main/docs/workflows/README.md): montages, game streams, action-cam, 360 video, vertical output
76
+ - [Command reference](https://github.com/FerventOrange/cutpoint/blob/main/docs/commands.md)
77
+ - [Configuration](https://github.com/FerventOrange/cutpoint/blob/main/docs/configuration.md)
78
+ - [Troubleshooting](https://github.com/FerventOrange/cutpoint/blob/main/docs/troubleshooting/README.md)
79
+ - [FAQ](https://github.com/FerventOrange/cutpoint/blob/main/docs/faq.md)
80
+ - [Architecture](https://github.com/FerventOrange/cutpoint/blob/main/docs/architecture.md), [Contributing](https://github.com/FerventOrange/cutpoint/blob/main/CONTRIBUTING.md), [Security](https://github.com/FerventOrange/cutpoint/blob/main/SECURITY.md)
81
+ - [Insta360 SDK](https://github.com/FerventOrange/cutpoint/blob/main/docs/insta360-sdk.md): optional, for high-quality 360 stitching
82
+
83
+ ## License
84
+
85
+ Cutpoint is released under the [MIT License](https://github.com/FerventOrange/cutpoint/blob/main/LICENSE).
@@ -0,0 +1,46 @@
1
+ {
2
+ "_doc": {
3
+ "about": "Example Cutpoint settings. Copy to <CUTPOINT_HOME>\\config.json (run `cutpoint paths` to see where that is) and keep only the keys you need; every key is optional. Keys starting with '_' are ignored.",
4
+ "projects_dir": "Folder for project folders. A bare project name (my-trip) or projects\\<name> argument is placed here. Env CUTPOINT_PROJECTS_DIR overrides it. Default: <CUTPOINT_HOME>\\projects.",
5
+ "source_remap": "{old prefix: new prefix}. Point old paths at a new location when footage moves (another drive, a backup copy): a source under an old prefix is read from the new prefix when the file exists there. Projects and cache keys keep the original path, so nothing has to be re-analysed.",
6
+ "source_remap_exclude": "File-name or full-path globs that are never remapped (e.g. a copy that is not verified yet).",
7
+ "stage_dir": "Local folder for `cutpoint stage` copies of sources on slow or network storage (NAS, USB, cloud-synced folder). Env CUTPOINT_STAGE_DIR overrides it. Default: <CUTPOINT_HOME>\\stage.",
8
+ "player_tags": "Your in-game name(s) for the optional game-HUD OCR in `cutpoint events` (who killed whom). Fuzzy match, ignores _ . - and spaces. `cutpoint events --player NAME` overrides it per run. Default: none.",
9
+ "ollama_url": "Ollama base URL for `analyze --vision` and the VLM layers of `cutpoint events`. Env OLLAMA_HOST overrides it. Default: http://localhost:11434.",
10
+ "pano": "Optional 360-camera (Insta360) module: sdk_exe = MediaSDKTest.exe of the Insta360 Media SDK, which you apply for yourself (see docs/insta360-sdk.md; env CUTPOINT_INSTA360_SDK overrides; default: auto-detected under <CUTPOINT_HOME>\\sdk\\insta360\\); stitch_timeout_s = kill one clip's stitch after this many seconds (default: no limit); stitched_dir = where `cutpoint 360 stitch` writes equirects (default <CUTPOINT_HOME>\\360-stitched; about 54 GB per hour of footage); studio_dirs = folders with Insta360 Studio equirect exports (default <CUTPOINT_HOME>\\360-studio); stitch_args = MediaSDKTest arguments; cmd_every = update the virtual camera every N frames (default 1; 2 halves the commands but leaves shake on every other frame); level_strength = horizon lock when stabilising, 1 = always level, 0 = follow the camera's own tilt (default 0.7); tilt_follow_s = smoothing (s) of the followed tilt (default 0.5); imu_offset_s = IMU-to-video time offset in seconds (default 0); equirect_yaw_offset = yaw correction in degrees for Studio exports (default 0); default_style = --style of `cutpoint 360 analyze` when none is given (default ski).",
11
+ "environment": "Not set here: CUTPOINT_HOME (data root), CUTPOINT_CONFIG (this file), CUTPOINT_CACHE_DIR, CUTPOINT_MODELS_DIR, CUTPOINT_TOOLS_DIR, CUTPOINT_STYLES_DIR, CUTPOINT_FFMPEG / CUTPOINT_FFPROBE, CUTPOINT_LLAMA_SERVER (llama-server.exe), CUTPOINT_VISION_MODEL (Ollama model for `analyze --vision`, default qwen3-vl:8b) and OLLAMA_HOST (overrides ollama_url)."
12
+ },
13
+ "projects_dir": "D:\\Footage\\cutpoint-projects",
14
+ "source_remap": {
15
+ "D:\\Footage": "E:\\Footage-copy"
16
+ },
17
+ "source_remap_exclude": [
18
+ "*unverified*"
19
+ ],
20
+ "stage_dir": "C:\\Cutpoint\\stage",
21
+ "player_tags": [
22
+ "YourGameName"
23
+ ],
24
+ "pano": {
25
+ "sdk_exe": "<CUTPOINT_HOME>\\sdk\\insta360\\MediaSDK-<version>-win64\\bin\\MediaSDKTest.exe",
26
+ "stitched_dir": "D:\\Footage\\360-stitched",
27
+ "stitch_timeout_s": 7200,
28
+ "studio_dirs": [
29
+ "D:\\Footage\\360-studio"
30
+ ],
31
+ "stitch_args": [
32
+ "-stitch_type", "optflow",
33
+ "-output_size", "5760x2880",
34
+ "-enable_h265_encoder",
35
+ "-bitrate", "100000000",
36
+ "-enable_flowstate",
37
+ "-enable_stitchfusion"
38
+ ],
39
+ "cmd_every": 1,
40
+ "level_strength": 0.7,
41
+ "tilt_follow_s": 0.5,
42
+ "imu_offset_s": 0.0,
43
+ "equirect_yaw_offset": 0.0,
44
+ "default_style": "ski"
45
+ }
46
+ }
@@ -0,0 +1,36 @@
1
+ # Troubleshooting
2
+
3
+ Start with `cutpoint -v <command> ...`: `-v` turns on debug logging and prints tracebacks. Errors
4
+ are logged as `ERROR` lines and the command exits with status 1.
5
+
6
+ | Symptom | Page |
7
+ |---|---|
8
+ | ffmpeg not found, NVENC errors, slow encoding, CUDA or cuDNN errors, out of GPU memory | [ffmpeg and GPU](ffmpeg-gpu.md) |
9
+ | Ollama not reachable, model downloads fail, missing module, `setup` problems | [Models and Ollama](models.md) |
10
+ | Disk full, slow or network drives, read errors, damaged files | [Storage](storage.md) |
11
+ | 360 clips, SDK not found, stitching fails | [360 and the Insta360 SDK](360.md) |
12
+
13
+ ## Quick checks
14
+
15
+ ```powershell
16
+ cutpoint paths # where Cutpoint looks for data
17
+ ffmpeg -version # ffmpeg is installed and on PATH
18
+ nvidia-smi # driver and GPU are visible (NVIDIA)
19
+ ```
20
+
21
+ ## Common messages
22
+
23
+ | Message or symptom | Fix |
24
+ |---|---|
25
+ | `No module named ...` followed by an install command | An optional extra is missing. Run the printed `uv sync --extra ...` command and list every extra you use, because `uv sync` removes the packages of extras you leave out |
26
+ | A command works in `uv run` but not as plain `cutpoint` | The tool is not on `PATH`. Use `uv run cutpoint`, install with `uv tool install cutpoint` (or `uv tool install .` from a clone), or use the wrappers `.\cutpoint.cmd` / `.\cutpoint.ps1` |
27
+ | PowerShell refuses to run `cutpoint.ps1` | Use `.\cutpoint.cmd`, or `uv run cutpoint` |
28
+ | `clips` refuses to write | The output folder is not empty. Use another `--out`, or `--force` to replace it |
29
+ | `assemble` joined the wrong clips or order | It uses the `.mp4` files in the folder now, in natural filename order. Rename or delete files and run it again |
30
+ | Results look stale after a code or setting change | Analysis is cached per source file in `<CUTPOINT_HOME>\cache`. The cache is safe to delete, or recompute layers with `events --force LAYER` |
31
+ | Wrong clips in `highlights.json` for silent footage | Scoring is heuristic and works best with voice or mic audio. Silent gameplay relies on loudness, scene cuts and vision only. Pick segments yourself with `clips --segments` |
32
+ | Whisper hallucinated text such as "Yeah. Yeah. Yeah." | Obvious repeats are filtered. Delete `cache\<source>\transcript-*.json` to re-transcribe with the full filter |
33
+
34
+ If none of this helps, open an issue with the command, the log lines around the error, your OS
35
+ and GPU, and the output of `cutpoint paths`. Remove private paths first. Do not paste Insta360
36
+ SDK files, documentation or output.
@@ -0,0 +1,94 @@
1
+ # Workflows
2
+
3
+ All examples use `cutpoint` for `uv run cutpoint`. Paths are examples; use your own.
4
+
5
+ | Page | Use it for |
6
+ |---|---|
7
+ | This page | Montage and highlights from any video, vertical output, importing into Resolve |
8
+ | [Game streams](game-streams.md) | Gameplay and stream recordings, HUD OCR, boxed stream layouts |
9
+ | [Action-cam](action-cam.md) | GoPro-style footage with telemetry: jumps, crashes, a varied mix |
10
+ | [360 video](360.md) | Insta360 X3: mix, director, QA, repair, clips, assemble |
11
+ | [360 director](360-director.md) | How the 360 virtual-camera director works |
12
+
13
+ ## Montage or highlights from one or more videos
14
+
15
+ ```powershell
16
+ # 1. Find and rank moments. Writes projects\my-edit\highlights.json and transcript.txt
17
+ cutpoint analyze D:\Videos\clip.mp4 --style gaming --out my-edit
18
+
19
+ # Several files and folders at once, skipping some by glob:
20
+ cutpoint analyze D:\Videos\session1 D:\Videos\extra.mp4 --exclude "*DVR*" --style gaming --out my-edit
21
+
22
+ # 2. Optional: detect what happens (sounds, HUD text, model descriptions).
23
+ # Needs the `events` extra and `cutpoint setup`. Re-ranks highlights.json.
24
+ cutpoint events my-edit
25
+
26
+ # 3. Export the best moments as 001_<label>.mp4, 002_<label>.mp4, ...
27
+ cutpoint clips my-edit --top 8
28
+
29
+ # 4. Review projects\my-edit\clips. Delete clips you do not want; rename to reorder.
30
+
31
+ # 5. Build the video from whatever is in the folder, in filename order.
32
+ cutpoint assemble projects\my-edit\clips --transition fade --loudnorm
33
+ ```
34
+
35
+ Output: `projects\my-edit\final.mp4`, `final.fcpxml` and `final.otio`.
36
+
37
+ Choose the style by content: `funny` for banter and laughter, `gaming` or `action` for fast
38
+ footage, `sport` for crowd-driven events, `commentary` for long talk (clips of 20-120 s, in
39
+ chronological order).
40
+
41
+ ### Pick moments yourself
42
+
43
+ Read `transcript.txt` (or `events.txt` after `events`), then write the ranges you want:
44
+
45
+ ```json
46
+ [
47
+ {"source": "D:/Videos/clip.mp4", "start": 312.4, "end": 330.0, "label": "intro"},
48
+ {"source": "D:/Videos/clip.mp4", "start": 1204.0, "end": 1219.5, "label": "joke"}
49
+ ]
50
+ ```
51
+
52
+ ```powershell
53
+ cutpoint clips my-edit --segments segments.json
54
+ ```
55
+
56
+ You can mix hand-picked segments with auto-scored ones by exporting both and joining the clips.
57
+ Per-segment options (tails, crop, padding) are in the [command reference](../commands.md#clips).
58
+
59
+ ### More room for trimming
60
+
61
+ If you will trim in an editor, export handles:
62
+
63
+ ```powershell
64
+ cutpoint clips my-edit --top 8 --extend 1.5 # padding at export
65
+ cutpoint extend projects\my-edit\clips --seconds 2 # or re-export an existing folder
66
+ ```
67
+
68
+ ## Vertical (9:16) output
69
+
70
+ ```powershell
71
+ cutpoint clips my-edit --vertical --max-total 60 # projects\my-edit\clips_vertical, 1080x1920
72
+ cutpoint assemble projects\my-edit\clips_vertical --captions # projects\my-edit\final_vertical.mp4
73
+ ```
74
+
75
+ `--vertical` is a fixed centre crop with no subject tracking. For 360 footage the renderer
76
+ frames the shot itself (see [360 video](360.md)).
77
+
78
+ ## Importing into DaVinci Resolve (Free)
79
+
80
+ Resolve Free has no Python API, so the hand-off is through files.
81
+
82
+ 1. Open your project and choose File > Import > Timeline (Ctrl+Shift+I).
83
+ 2. Pick `final.fcpxml`. `final.otio` also works.
84
+ 3. Leave "Automatically import source clips into media pool" checked and click OK.
85
+
86
+ The timeline places the clips back to back in filename order at their frame rate. It uses hard
87
+ cuts even if the MP4 was built with `--transition fade`, so you can add transitions in Resolve.
88
+ Audio fades are baked into the clip files. If you move the clips folder, relink the media in
89
+ Resolve or run `assemble` again.
90
+
91
+ ## Reading slow or network sources once
92
+
93
+ Copy sources to a local disk first with `cutpoint stage`; see
94
+ [slow storage](../troubleshooting/storage.md).