clip-anything 0.5.2__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 (48) hide show
  1. clip_anything-0.5.2/.gitignore +16 -0
  2. clip_anything-0.5.2/CHANGELOG.md +67 -0
  3. clip_anything-0.5.2/LICENSE +21 -0
  4. clip_anything-0.5.2/NOTICE +53 -0
  5. clip_anything-0.5.2/PKG-INFO +252 -0
  6. clip_anything-0.5.2/README.md +208 -0
  7. clip_anything-0.5.2/THIRD_PARTY_LICENSES.md +77 -0
  8. clip_anything-0.5.2/clip-anything.toml +42 -0
  9. clip_anything-0.5.2/clip_anything/__init__.py +3 -0
  10. clip_anything-0.5.2/clip_anything/ai.py +598 -0
  11. clip_anything-0.5.2/clip_anything/ai_prompts.py +88 -0
  12. clip_anything-0.5.2/clip_anything/app/__init__.py +3 -0
  13. clip_anything-0.5.2/clip_anything/app/data.py +114 -0
  14. clip_anything-0.5.2/clip_anything/app/jobs.py +369 -0
  15. clip_anything-0.5.2/clip_anything/app/launch.py +244 -0
  16. clip_anything-0.5.2/clip_anything/app/server.py +863 -0
  17. clip_anything-0.5.2/clip_anything/app/static/app.css +306 -0
  18. clip_anything-0.5.2/clip_anything/app/static/app.js +852 -0
  19. clip_anything-0.5.2/clip_anything/app/static/favicon.svg +10 -0
  20. clip_anything-0.5.2/clip_anything/app/static/fonts/Barlow-Medium.woff2 +0 -0
  21. clip_anything-0.5.2/clip_anything/app/static/fonts/Barlow-Regular.woff2 +0 -0
  22. clip_anything-0.5.2/clip_anything/app/static/fonts/BarlowCondensed-Bold.woff2 +0 -0
  23. clip_anything-0.5.2/clip_anything/app/static/fonts/BarlowCondensed-SemiBold.woff2 +0 -0
  24. clip_anything-0.5.2/clip_anything/app/static/fonts/OFL-Barlow.txt +93 -0
  25. clip_anything-0.5.2/clip_anything/app/static/index.html +312 -0
  26. clip_anything-0.5.2/clip_anything/audio_signals.py +245 -0
  27. clip_anything-0.5.2/clip_anything/cache.py +75 -0
  28. clip_anything-0.5.2/clip_anything/captions.py +159 -0
  29. clip_anything-0.5.2/clip_anything/cli.py +296 -0
  30. clip_anything-0.5.2/clip_anything/config.py +349 -0
  31. clip_anything-0.5.2/clip_anything/crashlog.py +145 -0
  32. clip_anything-0.5.2/clip_anything/cropplan.py +136 -0
  33. clip_anything-0.5.2/clip_anything/errors.py +25 -0
  34. clip_anything-0.5.2/clip_anything/events.py +25 -0
  35. clip_anything-0.5.2/clip_anything/facecam.py +195 -0
  36. clip_anything-0.5.2/clip_anything/gui.py +428 -0
  37. clip_anything-0.5.2/clip_anything/inputs.py +336 -0
  38. clip_anything-0.5.2/clip_anything/pipeline.py +1123 -0
  39. clip_anything-0.5.2/clip_anything/probe.py +533 -0
  40. clip_anything-0.5.2/clip_anything/render.py +327 -0
  41. clip_anything-0.5.2/clip_anything/report.py +110 -0
  42. clip_anything-0.5.2/clip_anything/scoring.py +810 -0
  43. clip_anything-0.5.2/clip_anything/setup_cmd.py +418 -0
  44. clip_anything-0.5.2/clip_anything/speech.py +259 -0
  45. clip_anything-0.5.2/clip_anything/ui.py +106 -0
  46. clip_anything-0.5.2/clip_anything/video_signals.py +300 -0
  47. clip_anything-0.5.2/clip_anything/vision.py +402 -0
  48. clip_anything-0.5.2/pyproject.toml +72 -0
@@ -0,0 +1,16 @@
1
+ .venv/
2
+ __pycache__/
3
+ dist/
4
+ tests/fixtures/*.mp4
5
+ clips/
6
+ .planning/**/shots/
7
+ tests/fixtures/*.json
8
+ .clipanything/
9
+ *.egg-info/
10
+ .pytest_cache/
11
+ .ruff_cache/
12
+ tests/fixtures/inputs/
13
+ .DS_Store
14
+ build/
15
+ packaging/ffmpeg/
16
+ launch-video/out/
@@ -0,0 +1,67 @@
1
+ # Changelog
2
+
3
+ All notable changes to Clip Anything. Dates are the day the change landed.
4
+
5
+ ## Unreleased
6
+
7
+ - Racing and other constant-motion recordings no longer come back empty: a recording that moves and sounds the same all the way through is detected (`report.json` → `scoring.profile: continuous`) and scored for sudden changes inside the moving stretches (motion drops and jumps, a high-pitched impact over the drone) against the previous 12 seconds; `--preset racing` / the Racing & sports chip force it. Reason lines say "A sudden jolt", "An impact sound"
8
+ - Never "Nothing stood out" when there are moments: if fewer than three clear the action bar, the recording's strongest moments are returned by its own scale with the note "No moment cleared the usual bar for this recording, so these are its strongest moments" (`below_bar_fallback`); static cards are still never picked, and Lower the bar stays available
9
+ - Privacy and terms written down: `docs/privacy.md`, `docs/terms.md`, an About screen in the app (version, licences, privacy summary), a first-run line, GPL/LGPL texts for the bundled ffmpeg in the desktop app, and the same notices on the npm launcher, the agent skill and the release notes
10
+ - The desktop app is a real product UI: drop zone with recent runs, one visible settings strip, a run screen with a live action-score curve and time estimate, a results grid of playable vertical clips with per-clip actions, a setup checklist with consent per install. Same page in a native window (`[app]` extra, pywebview) or the default browser; served from 127.0.0.1 with a per-launch token
11
+ - `clip-anything app` opens it from the CLI; `clip-anything-gui` still works
12
+ - Pipeline progress events carry a live audio level and the final score curve with the picked spans
13
+
14
+ ## 0.5.2 — 2026-11-15
15
+
16
+ - Racing, sports and other constant-motion recordings: the tool notices when sound and motion are steady throughout and looks for sudden changes instead (crashes, spins, impacts, replay cuts); a "Racing & sports" chip forces it
17
+ - Never an empty result: when no moment clears the usual bar, the recording's strongest moments come back, labelled as such
18
+ - Measured across genres (open-world, shooter, RPG, racing, sports, fighting, horror, platformer); see docs/benchmark.md
19
+
20
+ ## 0.5.1 — 2026-11-14
21
+
22
+ - Windows: the app opens in your default browser (the native window needed a .NET bridge that failed on first launch); any window failure on any system now falls back to the browser instead of closing
23
+
24
+ ## 0.5.0 — 2026-11-14
25
+
26
+ - Tell it what you're looking for: quick chips (Fights, Funny, Big plays, Crashes, Calm but tense) that work without AI, and a free-text brief in AI mode that scores every moment on how well it matches and says what matched
27
+ - Several bursts close together become one longer clip; fades to black end clips cleanly
28
+ - A failure in an optional part (captions, AI, facecam) no longer stops a run; it is switched off with a note in the report
29
+ - Problems are written to a log file (Application Support / AppData) and the app says where
30
+ - Corrupt cache or preference files are ignored and rebuilt
31
+ - A reminder to move the app to Applications when it is launched from the disk image
32
+
33
+ ## 0.4.0 — 2026-11-13
34
+
35
+ - The app, made intuitive: a drop-zone hero that names your file, a "Make N clips" button, plain-word settings with one-line helpers, first-run hints, human empty and error states, a Best moment badge, keyboard control of clips, smoother motion, system dark mode, remembered window size and output folder
36
+
37
+ ## 0.3.0 — 2026-11-13
38
+
39
+ - New app for Windows and Mac: drop a recording or a folder, see the action curve draw live, play and scrub the clips, copy post text, re-run with different settings in seconds; a Setup screen with one-click installs
40
+ - `clip-anything app` opens it; `clip-anything-gui` still works
41
+
42
+ ## 0.2.0 — 2026-11-13
43
+
44
+ - Desktop app for Windows and Mac (download, open, drop a recording in); Windows supported and tested in CI
45
+ - `clip-anything setup`: installs ffmpeg, captions and an optional local AI model if missing, skips what is there
46
+ - `--ai` mode: better picks, titles and a hook line from a local Ollama model, or your own OpenAI/Anthropic key
47
+ - Plain-language README with step-by-step scenarios; Claude Code and Cursor skills; `npx clip-anything` launcher
48
+ - Logo and images; feedback issue template
49
+
50
+ ## 0.1.0 — 2026-11-12
51
+
52
+ First release, built in the open for the Ship at Midnight launch.
53
+
54
+ - One command: `uvx clip-anything gameplay.mp4` turns a long recording into the top N vertical 9:16 clips plus `report.json`
55
+ - Action-first scoring with no speech required: audio onsets, loudness over a rolling baseline, visual motion, scene cuts, and an audio-and-motion agreement term; static cards (menus, lobbies, loading screens) penalised
56
+ - Build-up windows (60 % before the peak, 40 % after) snapped to quiet points and cuts, de-duplicated; `--count` is a maximum, never padded
57
+ - Streamed analysis on 16 kHz mono audio and a 320 px / 5 fps proxy; signal cache in `.clipanything/` for second-run tweaks in seconds
58
+ - Action-following 9:16 crop (smoothed, dead-band, pan cap) with centre fallback; HDR tone-mapped on ffmpeg 8+
59
+ - Robust inputs: VFR (OBS), HEVC, HDR, rotated sources; ffmpeg preflight with install help and clear exit codes
60
+ - Optional captions via faster-whisper (word-synced, burned in when libass is available, sidecar `.ass` otherwise) and excitement-word bonus; `--speech-rank` re-rank
61
+ - Optional facecam detection, stacked above the gameplay
62
+ - Optional `--vision` re-rank and titles with a local Ollama vision model; degrades silently when Ollama is absent
63
+ - Advanced `--ai` mode: re-rank of the top 3N candidates, titles, post hooks and a featured spoken line via a local Ollama or your own OpenAI/Anthropic key (`--ai-provider`, `--ai-model`, `--ai-vision-model`, `--ai-key`); AI text marked `ai_generated`; degrades to the action-only order with one warning (`docs/ai-mode.md`)
64
+ - One-shot `clip-anything setup`: checks ffmpeg, Python, the captions extra, the Whisper model and optional Ollama; installs only after `--yes` or confirmation; idempotent
65
+ - Library-first design: `clip_anything.pipeline.run()` with progress events, thin typer CLI, TOML config with every weight exposed
66
+ - No telemetry, no accounts, no uploads
67
+ - Repository: CI (ruff and pytest on macOS and Ubuntu, Python 3.11 and 3.13), Dependabot, security policy, third-party licence list, `uv.lock`
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ship at Midnight
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,53 @@
1
+ Clip Anything
2
+ Copyright (c) 2026 Ship at Midnight
3
+ Licensed under the MIT License (see LICENSE).
4
+
5
+ This software depends on the following third-party components. They are not
6
+ bundled in the source tree; they are installed from PyPI or provided by the
7
+ user's system. Each keeps its own licence.
8
+
9
+ Python packages (installed by pip/uv/pipx):
10
+ numpy BSD-3-Clause https://numpy.org
11
+ scipy BSD-3-Clause https://scipy.org
12
+ opencv-python-headless Apache-2.0 https://github.com/opencv/opencv-python
13
+ (wheels bundle OpenCV, Apache-2.0, and an FFmpeg build, LGPL-2.1+)
14
+ rich MIT https://github.com/Textualize/rich
15
+ typer MIT https://github.com/fastapi/typer
16
+ click BSD-3-Clause https://github.com/pallets/click
17
+
18
+ Optional extra `captions`:
19
+ faster-whisper MIT https://github.com/SYSTRAN/faster-whisper
20
+ CTranslate2 MIT https://github.com/OpenNMT/CTranslate2
21
+ onnxruntime MIT https://onnxruntime.ai
22
+ av (PyAV) BSD-3-Clause https://pyav.basswood.io
23
+ (wheels bundle an FFmpeg build, LGPL-2.1+)
24
+ huggingface_hub Apache-2.0 https://github.com/huggingface/huggingface_hub
25
+ tqdm MPL-2.0 and MIT https://tqdm.github.io
26
+ Whisper model weights MIT (OpenAI) downloaded once, only after the user agrees
27
+
28
+ External programs (never bundled, found on PATH):
29
+ FFmpeg / ffprobe LGPL-2.1+ or GPL-2.0+ depending on the build https://ffmpeg.org
30
+ Ollama (optional) MIT https://ollama.com
31
+ Vision models pulled into Ollama carry their own licences
32
+ (for example Qwen: Apache-2.0; Gemma: Gemma Terms of Use).
33
+
34
+ The full transitive list with versions is in THIRD_PARTY_LICENSES.md.
35
+
36
+ Desktop app builds (GitHub Releases) additionally ship ffmpeg/ffprobe as separate
37
+ programs in the "ffmpeg" folder: Windows from BtbN FFmpeg-Builds
38
+ (autobuild-2026-11-12-15-40, ffmpeg n9.0.2 win64-gpl-shared), macOS from
39
+ eugeneware/ffmpeg-static b6.1.1 (ffmpeg 6.0; arm64 build by osxexperts.net,
40
+ x86_64 build by evermeet.cx). Both are GPL builds (--enable-gpl
41
+ --enable-version3, libx264/libx265). Their licence texts travel in the bundle
42
+ (ffmpeg/LICENSE.txt, ffmpeg/COPYING.GPLv3.txt and the LGPL texts) and are
43
+ listed in THIRD_PARTY_NOTICE.txt next to this file; sources at
44
+ https://ffmpeg.org/download.html. Run `ffmpeg -version` / `ffmpeg -L` in that
45
+ folder for the build's own configuration and licence statement.
46
+
47
+ Clip Anything makes no network connection except the ones you turn on: the
48
+ optional Whisper model download (asked first), the local Ollama server at
49
+ 127.0.0.1 (--ai, --vision; `ollama pull` downloads a model), and, only when
50
+ you set your own key, the OpenAI or Anthropic API (--ai-provider), which then
51
+ receives small frames and caption text for the candidate moments.
52
+ Details: docs/privacy.md.
53
+ Game titles are mentioned only to describe recordings; no affiliation is implied.
@@ -0,0 +1,252 @@
1
+ Metadata-Version: 2.5
2
+ Name: clip-anything
3
+ Version: 0.5.2
4
+ Summary: Free, local CLI: long gameplay recording in, top N vertical highlight clips out.
5
+ Project-URL: Homepage, https://shipatmidnight.dev/clip-anything
6
+ Project-URL: Source, https://github.com/shreyassaw5394/clip-anything
7
+ Project-URL: Changelog, https://github.com/shreyassaw5394/clip-anything/blob/main/CHANGELOG.md
8
+ Project-URL: Issues, https://github.com/shreyassaw5394/clip-anything/issues
9
+ Author: Ship at Midnight
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ License-File: NOTICE
13
+ License-File: THIRD_PARTY_LICENSES.md
14
+ Keywords: cli,clips,ffmpeg,gameplay,highlights,shorts,video
15
+ Classifier: Development Status :: 4 - Beta
16
+ Classifier: Environment :: Console
17
+ Classifier: Intended Audience :: End Users/Desktop
18
+ Classifier: License :: OSI Approved :: MIT License
19
+ Classifier: Operating System :: MacOS
20
+ Classifier: Operating System :: Microsoft :: Windows
21
+ Classifier: Operating System :: POSIX :: Linux
22
+ Classifier: Programming Language :: Python :: 3
23
+ Classifier: Programming Language :: Python :: 3.11
24
+ Classifier: Programming Language :: Python :: 3.12
25
+ Classifier: Programming Language :: Python :: 3.13
26
+ Classifier: Topic :: Multimedia :: Video
27
+ Classifier: Topic :: Multimedia :: Video :: Conversion
28
+ Requires-Python: >=3.11
29
+ Requires-Dist: numpy<3,>=2.0
30
+ Requires-Dist: opencv-python-headless<5,>=4.10
31
+ Requires-Dist: rich<16,>=13
32
+ Requires-Dist: scipy<2,>=1.13
33
+ Requires-Dist: typer<1,>=0.12
34
+ Provides-Extra: app
35
+ Requires-Dist: pywebview<7,>=5; extra == 'app'
36
+ Provides-Extra: captions
37
+ Requires-Dist: faster-whisper<2,>=1.1; extra == 'captions'
38
+ Provides-Extra: desktop
39
+ Requires-Dist: pyinstaller<7,>=6.10; extra == 'desktop'
40
+ Provides-Extra: dev
41
+ Requires-Dist: pytest<10,>=8; extra == 'dev'
42
+ Requires-Dist: ruff<1,>=0.8; extra == 'dev'
43
+ Description-Content-Type: text/markdown
44
+
45
+ <p align="center"><img src="assets/logo.svg" alt="Clip Anything" width="360"></p>
46
+
47
+ **Give it a long gameplay recording. It finds the best moments and cuts them into vertical clips for TikTok, Shorts and Reels. Free, open source, runs on your own computer.**
48
+
49
+ ![Clip Anything: long recording in, highlight clips out](assets/intro.png)
50
+
51
+ ![demo: one command on a 40-minute Call of Duty 2 match, three clips in 50 seconds](https://raw.githubusercontent.com/shreyassaw5394/clip-anything/main/assets/demo.gif)
52
+
53
+ No account, no upload, no watermark. You type one line, wait a minute or two, and a folder called `clips` appears with the clips and a `report.json` that says why each one was picked. You do not need Claude, ChatGPT or any AI assistant to use it.
54
+
55
+ ## Get it
56
+
57
+ ### Windows
58
+
59
+ 1. Open PowerShell (press Start, type `PowerShell`, press Enter).
60
+ 2. Paste these two lines, one at a time, and press Enter after each:
61
+ ```powershell
62
+ winget install astral-sh.uv
63
+ winget install Gyan.FFmpeg
64
+ ```
65
+ 3. Close PowerShell and open it again so it finds the new programs. Then paste:
66
+ ```powershell
67
+ uvx clip-anything "C:\Users\you\Videos\my-session.mp4"
68
+ ```
69
+
70
+ ### Mac
71
+
72
+ 1. Open Terminal (press Cmd+Space, type `Terminal`, press Enter).
73
+ 2. Paste this and press Enter (if it says `brew` is not found, install [Homebrew](https://brew.sh) first):
74
+ ```bash
75
+ brew install uv ffmpeg
76
+ ```
77
+ 3. Then paste:
78
+ ```bash
79
+ uvx clip-anything ~/Videos/my-session.mp4
80
+ ```
81
+
82
+ ### No terminal?
83
+
84
+ A desktop app for Windows and Mac is coming on the [Releases page](https://github.com/shreyassaw5394/clip-anything/releases). Download, open, drop a recording on it: one strip of settings, a live action curve while it works, then the clips themselves to preview, copy a post line from, or delete. Already installed the command line? `clip-anything app` opens the same thing ([docs/desktop.md](docs/desktop.md)).
85
+
86
+ **See it in 30 seconds**
87
+
88
+ ![The app in use: a recording dropped in, Make 10 clips pressed, the action curve drawing with markers, then the grid of vertical clips](https://raw.githubusercontent.com/shreyassaw5394/clip-anything/main/assets/howto.gif)
89
+
90
+ Drop, Make clips, play, pick, post. The same walk-through as a video: [16:9](https://shipatmidnight.dev/clip-anything/media/howto-16x9.mp4) or the [vertical version](https://shipatmidnight.dev/clip-anything/media/howto-reel.mp4).
91
+
92
+ <details>
93
+ <summary>Before Nov 15 (package not on PyPI yet)</summary>
94
+
95
+ Until the package is published, run it straight from GitHub. Same thing, longer line:
96
+
97
+ ```
98
+ uvx --from git+https://github.com/shreyassaw5394/clip-anything clip-anything my-session.mp4
99
+ ```
100
+
101
+ Everywhere this page says `uvx clip-anything`, use that longer form instead.
102
+ </details>
103
+
104
+ Linux, pipx, captions, and other ways to install are in [docs/reference.md](docs/reference.md#install).
105
+
106
+ ## Use it
107
+
108
+ Every scenario below is the same idea: get the recording onto your computer, run one line on it, open the `clips` folder. No AI assistant is involved.
109
+
110
+ The first run downloads the tool (about a minute). After that it starts right away. While it works you see a progress bar for each step, then a table like this, then the folder path:
111
+
112
+ ```
113
+ # time len score signals file
114
+ 1 12:33-12:51 18s 0.57 onset=1.00 motion=0.26 match_01_12-33.mp4
115
+ 2 40:03-40:20 16s 0.56 agree=0.84 motion=0.88 match_02_40-03.mp4
116
+ 2/2 clips -> /Users/you/Videos/clips (analysis 41s, render 7s)
117
+ ```
118
+
119
+ ### PS5 or Xbox
120
+
121
+ 1. Get your clips off the console. PS5: plug in a USB drive, go to Media Gallery, select the clips, Copy to USB Drive; or share them to the PS App and save to your phone. Xbox: in the Xbox app on PC, go to Captures and download them, or turn on OneDrive upload in the console's Capture settings.
122
+ 2. Put all the files in one folder on your computer, for example `C:\Users\you\Videos\ps5` or `~/Videos/ps5`.
123
+ 3. Run it on the folder:
124
+ ```
125
+ uvx clip-anything ~/Videos/ps5
126
+ ```
127
+ 4. Console clips are short, so each file is treated as one candidate and the tool ranks them. If a file is a long full-session recording, it searches inside it.
128
+ 5. Open the `clips` folder that appears where you ran the command.
129
+
130
+ ### PC recording (OBS, ShadowPlay, Game Bar, Steam)
131
+
132
+ 1. Find the recording. OBS: the folder set under Settings, Output, Recording Path (often `Videos`). ShadowPlay: `Videos\<game name>`. Game Bar: `Videos\Captures`. Steam: open Recordings & Screenshots, make a clip and Export it as MP4 (the raw Steam folder is not a video file).
133
+ 2. Run it on the file:
134
+ ```
135
+ uvx clip-anything "C:\Users\you\Videos\Valorant\2026-11-12 21-04-33.mkv"
136
+ ```
137
+ Tip: type `uvx clip-anything ` and drag the file into the window to fill in the path.
138
+ 3. Wait. A one-hour 1080p30 recording takes about a minute to analyse, plus a few seconds per clip to render.
139
+ 4. Open `clips` in the folder you ran the command from.
140
+
141
+ ### A stream VOD you downloaded (Twitch, YouTube, Kick)
142
+
143
+ 1. Download the VOD with the tool you already use (Twitch's own Download button on your own VODs, or any downloader you trust). You end up with an `.mp4` or `.mkv`.
144
+ 2. Run it:
145
+ ```
146
+ uvx clip-anything ~/Downloads/stream-2026-11-11.mp4
147
+ ```
148
+ 3. If your webcam is in a corner of the stream, the tool spots it and stacks it above the gameplay in the clip. If you talk on stream, see "captions" below.
149
+ 4. Open `clips`.
150
+
151
+ ### Phone screen recordings
152
+
153
+ 1. Send the recordings to your computer (AirDrop, cable, Google Photos download).
154
+ 2. Put them in one folder and run it on the folder:
155
+ ```
156
+ uvx clip-anything ~/Downloads/phone-recordings
157
+ ```
158
+ 3. Portrait recordings are already vertical, so the crop does little; landscape ones get cropped to follow the action.
159
+ 4. Open `clips`.
160
+
161
+ ### Change what it makes
162
+
163
+ One flag each. Add it to the end of the command.
164
+
165
+ - Only 5 clips: `--count 5`
166
+ - Clips too short or too long: `--min 20 --max 60` (seconds)
167
+ - It picked a menu or loading screen: `--min-score 0.6` (a higher bar; the default is 0.5)
168
+ - It found nothing, or you want more: `--min-score 0.3`, or `--min-score 0` to rank the file against itself
169
+ - No captions: `--no-captions`
170
+ - Captions when someone talks: install the bigger version once, `uvx --from "clip-anything[captions]" clip-anything my-session.mp4`. The first run asks before downloading a 145 MB speech model; answer `y`.
171
+ - Keep the picture still instead of following the action: `--crop center`
172
+ - Run it again with different flags: analysis is saved next to the video, so a second run takes seconds. Add `--force` to overwrite clips from the last run.
173
+
174
+ ### A folder of many sessions
175
+
176
+ A folder is treated as one session. If you have several nights of footage, keep one folder per night and run once per folder with its own output name:
177
+
178
+ ```
179
+ uvx clip-anything ~/Videos/monday --out clips-monday
180
+ uvx clip-anything ~/Videos/tuesday --out clips-tuesday
181
+ ```
182
+
183
+ The full list of flags is in [docs/reference.md](docs/reference.md#all-options).
184
+
185
+ ## What it works on
186
+
187
+ - `.mp4 .mkv .mov .m4v .ts .m2ts .mts .webm .avi .flv .wmv`
188
+ - One file, several files, or a folder of files
189
+ - Any game. There is no list of supported titles and nothing to set up per game.
190
+ - Recordings with no commentary at all
191
+ - Variable frame rate, HEVC, HDR and rotated sources
192
+ - Mac, Linux and Windows (Windows is less tested; see [docs/reference.md](docs/reference.md#known-limits))
193
+
194
+ ## What's on by default
195
+
196
+ - Captions, word by word, when someone talks (needs the captions install above; recordings with no speech skip this)
197
+ - Facecam stack: a webcam in a corner is detected and placed above the gameplay
198
+ - The 9:16 crop follows the action instead of staying centred
199
+ - A `report.json` next to the clips with the time, score and reason for each one
200
+ - Tell it what you're looking for: `--preset shooter|racing|sports|horror|story|funny` (or the chips in the app) leans the picks without AI; with `--ai`, `--ai-brief "funny fails"` scores every moment on how well it matches and says what matched
201
+ - Racing, sports and other recordings that move and sound the same all the way through are detected and scored for sudden changes instead (a jolt, an impact, a stop); `--preset racing` forces it. When too few moments clear the action bar, the recording's strongest moments come back anyway, with a note saying so
202
+
203
+ Want AI titles and smarter picks? Run `clip-anything setup`, then add `--ai`. Local Ollama by default, or your own OpenAI/Anthropic key; see [docs/ai-mode.md](docs/ai-mode.md).
204
+
205
+ ## How it picks moments
206
+
207
+ It listens for sudden loud sounds (shots, explosions, hits, shouting) and loudness jumps over what the recording sounded like a minute earlier. It watches for motion across the whole frame, scene cuts and flashes. A moment needs both the sound and the picture to spike; a loud menu sound on a still screen does not count. A recording that moves and sounds the same all the way through (racing, sports) is scored differently: inside the moving stretches it looks for sudden motion drops or jumps and a high-pitched impact over the engine drone, against the previous 12 seconds. Each clip starts a bit before the peak so you see the build-up, and ends at a quiet point. A 30-second [explainer video](https://shipatmidnight.dev/clip-anything/media/explainer-16x9.mp4) draws this from the saved signals of a real match. Details and measured numbers are in [docs/benchmark.md](docs/benchmark.md).
208
+
209
+ ## Compared with other clippers
210
+
211
+ - Many clippers find moments in the transcript (a sentence, a joke, a keyword). That works for talking streams and misses silent plays. Clip Anything scores the action and treats speech as a bonus.
212
+ - Tools that detect game action usually do it per game (kill feeds, HUD templates, trained models for a list of titles). Clip Anything has no per-game profile, so a game released this week works the same as an old one.
213
+ - It runs on your machine with no account, credit meter or expiry. If a quiet session only has four real moments you get four clips, and the report says why.
214
+
215
+ ## Use it with an AI editor
216
+
217
+ You do not need one. If you already use one, it can run the tool for you and explain the picks.
218
+
219
+ **Claude Code**
220
+ ```
221
+ /plugin marketplace add shreyassaw5394/clip-anything
222
+ /plugin install clip-anything@clip-anything
223
+ ```
224
+ Then say "make 5 shorts from ~/Videos/last-night.mkv". The skill previews the picks before rendering and explains each one from `report.json`.
225
+
226
+ **Cursor**
227
+ Copy [`.cursor/skills/clip-anything/`](.cursor/skills/clip-anything/) into your project (or into `~/.cursor/skills/` for every project). Cursor finds `SKILL.md` on its own; type `/clip-anything` in Agent chat to call it directly. The short rule in [`.cursor/rules/clip-anything.mdc`](.cursor/rules/clip-anything.mdc) points the agent at it when you ask for clips.
228
+
229
+ **ChatGPT, Copilot, or anything else**
230
+ Paste the "Change what it makes" list above and the one-line command into the chat and ask it to write the command for your file. Then run that line yourself in PowerShell or Terminal.
231
+
232
+ ## Privacy and safety
233
+
234
+ - Nothing leaves your computer by default: no account, no upload, no telemetry. The recording, clips, `report.json` and the `.clipanything` analysis cache all stay on your disk.
235
+ - The only network use is what you turn on: the one-time captions model download from Hugging Face (asks first), a local Ollama model on `127.0.0.1`, or a cloud AI provider (OpenAI/Anthropic) that receives small frames and caption text only when you set your own key. The Setup screen installs ffmpeg and friends only after you say yes to each command.
236
+ - The desktop app runs on `127.0.0.1` with a per-launch token; it is not signed yet, so macOS and Windows warn once. Check the download against `SHA256SUMS.txt` on the release page ([docs/desktop.md](docs/desktop.md)).
237
+ - Clip choices, captions, titles and hooks are automated (and AI text is labelled `ai_generated`); they can be wrong. You are responsible for the rights to what you process and post: game video policies, music in the stream, other people's voice or likeness.
238
+ - Free, non-commercial, MIT, provided as is. Details: [docs/privacy.md](docs/privacy.md) and [docs/terms.md](docs/terms.md).
239
+ ## Problems?
240
+
241
+ - Ask on [Discord](https://discord.gg/s8wj7tBAM).
242
+ - Ran it on a real recording? Fill in the three-question [Tried it](https://github.com/shreyassaw5394/clip-anything/issues/new?template=tried-it.md) issue. It is the most useful thing you can send.
243
+ - Something broke: open a [bug](https://github.com/shreyassaw5394/clip-anything/issues/new?template=bug.md). Security problems go to [SECURITY.md](SECURITY.md).
244
+ - Need help or have an idea? [Discord](https://discord.gg/s8wj7tBAM), [email](mailto:shreyassaw@gmail.com), or [upvote the hosted version](https://github.com/shreyassaw5394/shipatmidnight-ideas/issues/7).
245
+
246
+ ## About
247
+
248
+ Clip Anything is a free, non-commercial passion project by an independent developer, shipped under [Ship at Midnight](https://shipatmidnight.dev). MIT licence, see [LICENSE](LICENSE); third-party components are in [NOTICE](NOTICE). Provided as is, without warranty.
249
+
250
+ Clip choices are automated and can be wrong. Captions come from speech recognition and `--vision` titles from a local model; both can mishear or misdescribe, so check them before you post. Game names appear only to describe what a recording contains; they belong to their owners, and Clip Anything is not affiliated with any game publisher.
251
+
252
+ More: [docs/reference.md](docs/reference.md) (every option, config file, library use, limits, roadmap) and [docs/benchmark.md](docs/benchmark.md) (how the defaults were tuned and what was measured). Changes: [CHANGELOG.md](CHANGELOG.md).
@@ -0,0 +1,208 @@
1
+ <p align="center"><img src="assets/logo.svg" alt="Clip Anything" width="360"></p>
2
+
3
+ **Give it a long gameplay recording. It finds the best moments and cuts them into vertical clips for TikTok, Shorts and Reels. Free, open source, runs on your own computer.**
4
+
5
+ ![Clip Anything: long recording in, highlight clips out](assets/intro.png)
6
+
7
+ ![demo: one command on a 40-minute Call of Duty 2 match, three clips in 50 seconds](https://raw.githubusercontent.com/shreyassaw5394/clip-anything/main/assets/demo.gif)
8
+
9
+ No account, no upload, no watermark. You type one line, wait a minute or two, and a folder called `clips` appears with the clips and a `report.json` that says why each one was picked. You do not need Claude, ChatGPT or any AI assistant to use it.
10
+
11
+ ## Get it
12
+
13
+ ### Windows
14
+
15
+ 1. Open PowerShell (press Start, type `PowerShell`, press Enter).
16
+ 2. Paste these two lines, one at a time, and press Enter after each:
17
+ ```powershell
18
+ winget install astral-sh.uv
19
+ winget install Gyan.FFmpeg
20
+ ```
21
+ 3. Close PowerShell and open it again so it finds the new programs. Then paste:
22
+ ```powershell
23
+ uvx clip-anything "C:\Users\you\Videos\my-session.mp4"
24
+ ```
25
+
26
+ ### Mac
27
+
28
+ 1. Open Terminal (press Cmd+Space, type `Terminal`, press Enter).
29
+ 2. Paste this and press Enter (if it says `brew` is not found, install [Homebrew](https://brew.sh) first):
30
+ ```bash
31
+ brew install uv ffmpeg
32
+ ```
33
+ 3. Then paste:
34
+ ```bash
35
+ uvx clip-anything ~/Videos/my-session.mp4
36
+ ```
37
+
38
+ ### No terminal?
39
+
40
+ A desktop app for Windows and Mac is coming on the [Releases page](https://github.com/shreyassaw5394/clip-anything/releases). Download, open, drop a recording on it: one strip of settings, a live action curve while it works, then the clips themselves to preview, copy a post line from, or delete. Already installed the command line? `clip-anything app` opens the same thing ([docs/desktop.md](docs/desktop.md)).
41
+
42
+ **See it in 30 seconds**
43
+
44
+ ![The app in use: a recording dropped in, Make 10 clips pressed, the action curve drawing with markers, then the grid of vertical clips](https://raw.githubusercontent.com/shreyassaw5394/clip-anything/main/assets/howto.gif)
45
+
46
+ Drop, Make clips, play, pick, post. The same walk-through as a video: [16:9](https://shipatmidnight.dev/clip-anything/media/howto-16x9.mp4) or the [vertical version](https://shipatmidnight.dev/clip-anything/media/howto-reel.mp4).
47
+
48
+ <details>
49
+ <summary>Before Nov 15 (package not on PyPI yet)</summary>
50
+
51
+ Until the package is published, run it straight from GitHub. Same thing, longer line:
52
+
53
+ ```
54
+ uvx --from git+https://github.com/shreyassaw5394/clip-anything clip-anything my-session.mp4
55
+ ```
56
+
57
+ Everywhere this page says `uvx clip-anything`, use that longer form instead.
58
+ </details>
59
+
60
+ Linux, pipx, captions, and other ways to install are in [docs/reference.md](docs/reference.md#install).
61
+
62
+ ## Use it
63
+
64
+ Every scenario below is the same idea: get the recording onto your computer, run one line on it, open the `clips` folder. No AI assistant is involved.
65
+
66
+ The first run downloads the tool (about a minute). After that it starts right away. While it works you see a progress bar for each step, then a table like this, then the folder path:
67
+
68
+ ```
69
+ # time len score signals file
70
+ 1 12:33-12:51 18s 0.57 onset=1.00 motion=0.26 match_01_12-33.mp4
71
+ 2 40:03-40:20 16s 0.56 agree=0.84 motion=0.88 match_02_40-03.mp4
72
+ 2/2 clips -> /Users/you/Videos/clips (analysis 41s, render 7s)
73
+ ```
74
+
75
+ ### PS5 or Xbox
76
+
77
+ 1. Get your clips off the console. PS5: plug in a USB drive, go to Media Gallery, select the clips, Copy to USB Drive; or share them to the PS App and save to your phone. Xbox: in the Xbox app on PC, go to Captures and download them, or turn on OneDrive upload in the console's Capture settings.
78
+ 2. Put all the files in one folder on your computer, for example `C:\Users\you\Videos\ps5` or `~/Videos/ps5`.
79
+ 3. Run it on the folder:
80
+ ```
81
+ uvx clip-anything ~/Videos/ps5
82
+ ```
83
+ 4. Console clips are short, so each file is treated as one candidate and the tool ranks them. If a file is a long full-session recording, it searches inside it.
84
+ 5. Open the `clips` folder that appears where you ran the command.
85
+
86
+ ### PC recording (OBS, ShadowPlay, Game Bar, Steam)
87
+
88
+ 1. Find the recording. OBS: the folder set under Settings, Output, Recording Path (often `Videos`). ShadowPlay: `Videos\<game name>`. Game Bar: `Videos\Captures`. Steam: open Recordings & Screenshots, make a clip and Export it as MP4 (the raw Steam folder is not a video file).
89
+ 2. Run it on the file:
90
+ ```
91
+ uvx clip-anything "C:\Users\you\Videos\Valorant\2026-11-12 21-04-33.mkv"
92
+ ```
93
+ Tip: type `uvx clip-anything ` and drag the file into the window to fill in the path.
94
+ 3. Wait. A one-hour 1080p30 recording takes about a minute to analyse, plus a few seconds per clip to render.
95
+ 4. Open `clips` in the folder you ran the command from.
96
+
97
+ ### A stream VOD you downloaded (Twitch, YouTube, Kick)
98
+
99
+ 1. Download the VOD with the tool you already use (Twitch's own Download button on your own VODs, or any downloader you trust). You end up with an `.mp4` or `.mkv`.
100
+ 2. Run it:
101
+ ```
102
+ uvx clip-anything ~/Downloads/stream-2026-11-11.mp4
103
+ ```
104
+ 3. If your webcam is in a corner of the stream, the tool spots it and stacks it above the gameplay in the clip. If you talk on stream, see "captions" below.
105
+ 4. Open `clips`.
106
+
107
+ ### Phone screen recordings
108
+
109
+ 1. Send the recordings to your computer (AirDrop, cable, Google Photos download).
110
+ 2. Put them in one folder and run it on the folder:
111
+ ```
112
+ uvx clip-anything ~/Downloads/phone-recordings
113
+ ```
114
+ 3. Portrait recordings are already vertical, so the crop does little; landscape ones get cropped to follow the action.
115
+ 4. Open `clips`.
116
+
117
+ ### Change what it makes
118
+
119
+ One flag each. Add it to the end of the command.
120
+
121
+ - Only 5 clips: `--count 5`
122
+ - Clips too short or too long: `--min 20 --max 60` (seconds)
123
+ - It picked a menu or loading screen: `--min-score 0.6` (a higher bar; the default is 0.5)
124
+ - It found nothing, or you want more: `--min-score 0.3`, or `--min-score 0` to rank the file against itself
125
+ - No captions: `--no-captions`
126
+ - Captions when someone talks: install the bigger version once, `uvx --from "clip-anything[captions]" clip-anything my-session.mp4`. The first run asks before downloading a 145 MB speech model; answer `y`.
127
+ - Keep the picture still instead of following the action: `--crop center`
128
+ - Run it again with different flags: analysis is saved next to the video, so a second run takes seconds. Add `--force` to overwrite clips from the last run.
129
+
130
+ ### A folder of many sessions
131
+
132
+ A folder is treated as one session. If you have several nights of footage, keep one folder per night and run once per folder with its own output name:
133
+
134
+ ```
135
+ uvx clip-anything ~/Videos/monday --out clips-monday
136
+ uvx clip-anything ~/Videos/tuesday --out clips-tuesday
137
+ ```
138
+
139
+ The full list of flags is in [docs/reference.md](docs/reference.md#all-options).
140
+
141
+ ## What it works on
142
+
143
+ - `.mp4 .mkv .mov .m4v .ts .m2ts .mts .webm .avi .flv .wmv`
144
+ - One file, several files, or a folder of files
145
+ - Any game. There is no list of supported titles and nothing to set up per game.
146
+ - Recordings with no commentary at all
147
+ - Variable frame rate, HEVC, HDR and rotated sources
148
+ - Mac, Linux and Windows (Windows is less tested; see [docs/reference.md](docs/reference.md#known-limits))
149
+
150
+ ## What's on by default
151
+
152
+ - Captions, word by word, when someone talks (needs the captions install above; recordings with no speech skip this)
153
+ - Facecam stack: a webcam in a corner is detected and placed above the gameplay
154
+ - The 9:16 crop follows the action instead of staying centred
155
+ - A `report.json` next to the clips with the time, score and reason for each one
156
+ - Tell it what you're looking for: `--preset shooter|racing|sports|horror|story|funny` (or the chips in the app) leans the picks without AI; with `--ai`, `--ai-brief "funny fails"` scores every moment on how well it matches and says what matched
157
+ - Racing, sports and other recordings that move and sound the same all the way through are detected and scored for sudden changes instead (a jolt, an impact, a stop); `--preset racing` forces it. When too few moments clear the action bar, the recording's strongest moments come back anyway, with a note saying so
158
+
159
+ Want AI titles and smarter picks? Run `clip-anything setup`, then add `--ai`. Local Ollama by default, or your own OpenAI/Anthropic key; see [docs/ai-mode.md](docs/ai-mode.md).
160
+
161
+ ## How it picks moments
162
+
163
+ It listens for sudden loud sounds (shots, explosions, hits, shouting) and loudness jumps over what the recording sounded like a minute earlier. It watches for motion across the whole frame, scene cuts and flashes. A moment needs both the sound and the picture to spike; a loud menu sound on a still screen does not count. A recording that moves and sounds the same all the way through (racing, sports) is scored differently: inside the moving stretches it looks for sudden motion drops or jumps and a high-pitched impact over the engine drone, against the previous 12 seconds. Each clip starts a bit before the peak so you see the build-up, and ends at a quiet point. A 30-second [explainer video](https://shipatmidnight.dev/clip-anything/media/explainer-16x9.mp4) draws this from the saved signals of a real match. Details and measured numbers are in [docs/benchmark.md](docs/benchmark.md).
164
+
165
+ ## Compared with other clippers
166
+
167
+ - Many clippers find moments in the transcript (a sentence, a joke, a keyword). That works for talking streams and misses silent plays. Clip Anything scores the action and treats speech as a bonus.
168
+ - Tools that detect game action usually do it per game (kill feeds, HUD templates, trained models for a list of titles). Clip Anything has no per-game profile, so a game released this week works the same as an old one.
169
+ - It runs on your machine with no account, credit meter or expiry. If a quiet session only has four real moments you get four clips, and the report says why.
170
+
171
+ ## Use it with an AI editor
172
+
173
+ You do not need one. If you already use one, it can run the tool for you and explain the picks.
174
+
175
+ **Claude Code**
176
+ ```
177
+ /plugin marketplace add shreyassaw5394/clip-anything
178
+ /plugin install clip-anything@clip-anything
179
+ ```
180
+ Then say "make 5 shorts from ~/Videos/last-night.mkv". The skill previews the picks before rendering and explains each one from `report.json`.
181
+
182
+ **Cursor**
183
+ Copy [`.cursor/skills/clip-anything/`](.cursor/skills/clip-anything/) into your project (or into `~/.cursor/skills/` for every project). Cursor finds `SKILL.md` on its own; type `/clip-anything` in Agent chat to call it directly. The short rule in [`.cursor/rules/clip-anything.mdc`](.cursor/rules/clip-anything.mdc) points the agent at it when you ask for clips.
184
+
185
+ **ChatGPT, Copilot, or anything else**
186
+ Paste the "Change what it makes" list above and the one-line command into the chat and ask it to write the command for your file. Then run that line yourself in PowerShell or Terminal.
187
+
188
+ ## Privacy and safety
189
+
190
+ - Nothing leaves your computer by default: no account, no upload, no telemetry. The recording, clips, `report.json` and the `.clipanything` analysis cache all stay on your disk.
191
+ - The only network use is what you turn on: the one-time captions model download from Hugging Face (asks first), a local Ollama model on `127.0.0.1`, or a cloud AI provider (OpenAI/Anthropic) that receives small frames and caption text only when you set your own key. The Setup screen installs ffmpeg and friends only after you say yes to each command.
192
+ - The desktop app runs on `127.0.0.1` with a per-launch token; it is not signed yet, so macOS and Windows warn once. Check the download against `SHA256SUMS.txt` on the release page ([docs/desktop.md](docs/desktop.md)).
193
+ - Clip choices, captions, titles and hooks are automated (and AI text is labelled `ai_generated`); they can be wrong. You are responsible for the rights to what you process and post: game video policies, music in the stream, other people's voice or likeness.
194
+ - Free, non-commercial, MIT, provided as is. Details: [docs/privacy.md](docs/privacy.md) and [docs/terms.md](docs/terms.md).
195
+ ## Problems?
196
+
197
+ - Ask on [Discord](https://discord.gg/s8wj7tBAM).
198
+ - Ran it on a real recording? Fill in the three-question [Tried it](https://github.com/shreyassaw5394/clip-anything/issues/new?template=tried-it.md) issue. It is the most useful thing you can send.
199
+ - Something broke: open a [bug](https://github.com/shreyassaw5394/clip-anything/issues/new?template=bug.md). Security problems go to [SECURITY.md](SECURITY.md).
200
+ - Need help or have an idea? [Discord](https://discord.gg/s8wj7tBAM), [email](mailto:shreyassaw@gmail.com), or [upvote the hosted version](https://github.com/shreyassaw5394/shipatmidnight-ideas/issues/7).
201
+
202
+ ## About
203
+
204
+ Clip Anything is a free, non-commercial passion project by an independent developer, shipped under [Ship at Midnight](https://shipatmidnight.dev). MIT licence, see [LICENSE](LICENSE); third-party components are in [NOTICE](NOTICE). Provided as is, without warranty.
205
+
206
+ Clip choices are automated and can be wrong. Captions come from speech recognition and `--vision` titles from a local model; both can mishear or misdescribe, so check them before you post. Game names appear only to describe what a recording contains; they belong to their owners, and Clip Anything is not affiliated with any game publisher.
207
+
208
+ More: [docs/reference.md](docs/reference.md) (every option, config file, library use, limits, roadmap) and [docs/benchmark.md](docs/benchmark.md) (how the defaults were tuned and what was measured). Changes: [CHANGELOG.md](CHANGELOG.md).