From a1e7c4128bb1d8651e93b90a97ffec0ac7f5315d Mon Sep 17 00:00:00 2001 From: bradautomates Date: Mon, 29 Jun 2026 23:43:11 +1000 Subject: [PATCH] Document 0.2.0 and tighten README Add the 0.2.0 changelog entry (--detail dial, frame dedup, Whisper auto-chunking, --timestamps/--no-whisper, self-contained skill restructure). README: drop the "Why this exists" section, trim two speculative use cases, and condense the frame-dedup and detail-modes sections to state the facts. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 24 +++++++++++++++++++++++ README.md | 55 ++++++++++++++-------------------------------------- 2 files changed, 39 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ad03c4..41691c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,30 @@ All notable changes to `/watch` are documented here. +## [0.2.0] — 2026-06-29 + +### Added +- **`--detail` dial** with four modes — `transcript` (captions only, no frames), `efficient` (fast keyframe pass, cap 50), `balanced` (scene-aware, cap 100, default), and `token-burner` (scene-aware, uncapped). Set the default with `WATCH_DETAIL` in `~/.config/watch/.env`. +- **Frame deduplication** (default on; `--no-dedup` to disable). Before the budget cap, a pass downscales each frame to a 16×16 grayscale thumbnail and drops frames whose mean per-pixel difference from the last *kept* frame is within threshold — so the budget goes to distinct content instead of held slides and static recordings. The **Frames** report line shows how many near-duplicates were dropped. +- **Whisper auto-chunking.** Audio over the 25 MB upload cap is split into evenly sized chunks, transcribed per chunk, with segment timestamps shifted back into source time. Partial failures are tolerated — transcription only fails if *every* chunk fails, so length alone no longer breaks it. +- **`--timestamps T1,T2,…`** — grab a frame at each absolute timestamp; reserved against the cap, and the only frames produced under `--detail transcript`. +- **`--no-whisper`** — disable transcription entirely (frames only). +- pytest suite covering config, dedup, download, fixtures, frames, setup, timestamps, watch, and whisper (no network; ffmpeg-synthesized clips). + +### Changed +- **Restructured into a self-contained `skills/watch/` package** so `SKILL.md` and its `scripts/` runtime are siblings in one folder. This fixes installs on Codex, Cursor, Copilot, and other Agent Skills hosts: `npx skills add` now copies the skill as a working unit instead of grabbing the root `SKILL.md` without its scripts. +- **Harness-agnostic path resolution** — `SKILL.md` resolves `$SKILL_DIR` from where it was Read instead of the Claude-Code-only `${CLAUDE_SKILL_DIR}`, so script calls work on every host. +- `/watch` is now derived from `SKILL.md` frontmatter; the separate `commands/watch.md` wrapper was dropped to avoid a duplicate slash command. +- `balanced` now full-decodes to detect every scene cut across the whole video. The previous early-exit was faster but kept only the first cuts and dropped the tail of long videos. +- `token-burner` is exempt from the long-video "sparse scan" warning, since it keeps every scene-change frame. +- `--max-frames` is now an override on top of each mode's default cap, rather than a fixed default of 80. + +### Fixed +- Non-Claude installs (`npx skills add`) were dead on arrival — the installer copied `SKILL.md` without the `scripts/` it shells out to. The self-contained package layout resolves this. + +### Removed +- `V2_PLAN.md` and `V2_CONCERNS.md` planning docs. + ## [0.1.3] — 2026-05-09 ### Fixed diff --git a/README.md b/README.md index 3211137..8c44cf2 100644 --- a/README.md +++ b/README.md @@ -28,14 +28,6 @@ With Claude Video `/watch` you can paste a URL or a local path, ask a question, /watch https://youtu.be/dQw4w9WgXcQ what happens at the 30 second mark? ``` -## Why this exists - -I run a [YouTube channel](https://www.youtube.com/@bradbonanno) and a business, [Solaris Automation](https://www.solarisautomation.io/), so I'm constantly using video to keep up with content. If I see a YouTube video that's blowing up, I want to know how the creator structured the hook — what's on screen in the first 3 seconds, what they said, why it worked. That used to mean watching it myself with a notepad. Now I just paste the URL and ask. - -The other half is summarization. Most YouTube videos don't deserve 20 minutes of my attention. I hand the URL to Claude, it pulls the transcript, and tells me what actually happened. If the visual matters, frames come along too. If it's a podcast or a talking head, transcript is enough. - -Claude is great at reading and synthesizing — but until now, video was the one input I couldn't hand it. Pasting a YouTube link got you nothing useful. `/watch` closes that gap. - ## What people actually use it for **Analyze someone else's content.** `/watch https://youtu.be/ what hook did they open with?` Claude looks at the first frames, reads the opening transcript, breaks down the structure. Same for ad creative, competitor launches, podcast intros, anything where the *how* matters as much as the *what*. @@ -46,10 +38,6 @@ Claude is great at reading and synthesizing — but until now, video was the one **Cut the hype out of an update video.** `/watch https://youtu.be/ what's actually new — skip the hype` Strip a "game-changer" feature drop down to the few things that matter, so you get the substance without ten minutes of intro and overselling. -**Jump to the one answer in a long tutorial.** `/watch https://youtu.be/<2hr-tutorial> how do they set up the webhook?` Instead of scrubbing an hour of video for a 30-second answer — or matching a vague transcript and watching anyway — Claude finds the moment and tells you what's on screen there. - -**Read a screen-share recording the transcript can't.** `/watch standup.mp4 what was on the shared screen when they decided?` When a meeting transcript collapses into "if you look here" and "make it look like this," the words stop carrying the meaning — the frames recover what was actually being shown. - **Turn a playlist into notes.** `/watch https://youtu.be/