{"slug":"minutes-video-review-2","title":"minutes-video-review","summary":"Analyze a product walkthrough, bug report video, Loom, or ScreenPal using Minutes transcription plus visual review. Use when the user wants a recorded demo or bug clip turned into a durable brief with transcript, key frames, issues, and next steps.","platform":"opencode","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-08-27T16:57:51.427459Z","repo":{"url":"https://github.com/silverstein/minutes","stars":1501,"forks":165,"license":"MIT","updatedAt":"2026-09-25T06:14:41Z"},"bodyHtml":"<hr>\n<h2>name: minutes-video-review\ndescription: Analyze a product walkthrough, bug report video, Loom, or ScreenPal using Minutes transcription plus visual review. Use when the user wants a recorded demo or bug clip turned into a durable brief with transcript, key frames, issues, and next steps.\ncompatibility: opencode</h2>\n<h2>Skill Path</h2>\n<p>Before running helper scripts or opening bundled references, set:</p>\n<pre><code>export MINUTES_SKILLS_ROOT=\"$(git rev-parse --show-toplevel)/.opencode/skills\"\nexport MINUTES_SKILL_ROOT=\"$MINUTES_SKILLS_ROOT/minutes-video-review\"\n</code></pre>\n<h1>/minutes-video-review</h1>\n<p>Analyze a product walkthrough, bug report video, Loom, ScreenPal, or local recording into a durable artifact bundle that agents can keep working from.</p>\n<p>This skill is for <strong>meeting-adjacent product artifacts</strong>, not for generic \"understand any video\" requests. Use it when the user wants a recorded demo, bug repro, or walkthrough turned into something actionable for engineering, product, support, or follow-up agent work.</p>\n<h2>What this skill does</h2>\n<p>The bundled script handles the deterministic pipeline:</p>\n<ul>\n<li>resolve a local file or hosted video URL</li>\n<li>download hosted video when needed</li>\n<li>extract audio with <code>ffmpeg</code></li>\n<li>transcribe with Minutes first, using the user's existing Minutes transcription setup</li>\n<li>sample key frames with adaptive caps so long videos do not blow up context</li>\n<li>write a durable artifact bundle under <code>~/.minutes/video-reviews/</code></li>\n</ul>\n<p>Then <strong>you</strong> review the resulting artifacts and return the actual user-facing brief.</p>\n<h2>Primary command</h2>\n<p>Local file:</p>\n<pre><code>python3 \"$MINUTES_SKILL_ROOT/scripts/video_review.py\" \\\n  \"/absolute/path/to/video.mp4\"\n</code></pre>\n<p>Hosted video:</p>\n<pre><code>python3 \"$MINUTES_SKILL_ROOT/scripts/video_review.py\" \\\n  \"https://go.screenpal.com/watch/...\"\n</code></pre>\n<p>Useful options:</p>\n<pre><code>python3 \"$MINUTES_SKILL_ROOT/scripts/video_review.py\" \\\n  \"https://www.loom.com/share/...\" \\\n  --focus \"customer signup bug repro\" \\\n  --cookies-from-browser chrome \\\n  --env-file /absolute/path/to/.env \\\n  --frame-step 15 \\\n  --max-frames 36 \\\n  --keep-temp\n</code></pre>\n<h2>How to use it</h2>\n<h3>Phase 1: Run the pipeline</h3>\n<p>Run the script on the provided local file or hosted video URL.</p>\n<p>The script prints JSON with the output artifact paths. Important outputs include:</p>\n<ul>\n<li><code>analysis_md</code></li>\n<li><code>analysis_json</code></li>\n<li><code>transcript_md</code></li>\n<li><code>metadata_json</code></li>\n<li><code>frames_dir</code></li>\n<li><code>contact_sheet_artifact</code></li>\n</ul>\n<h3>Phase 2: Inspect the artifacts</h3>\n<p>Read the generated <code>analysis.md</code> and <code>analysis.json</code> first.</p>\n<p>Then inspect:</p>\n<ul>\n<li><code>transcript.md</code> for the actual spoken content</li>\n<li>selected images from <code>frames/</code> when visual state matters</li>\n<li><code>contact-sheet.jpg</code> for a quick visual sweep across sampled frames</li>\n<li><code>metadata.json</code> for transcript method, duration, source kind, and frame sampling details</li>\n</ul>\n<h3>Phase 3: Produce the real brief</h3>\n<p>Return a concise, useful brief to the user that includes:</p>\n<ul>\n<li>what the video is trying to show</li>\n<li>likely bug / proposal / walkthrough intent</li>\n<li>key moments or timestamps</li>\n<li>likely impacted area or flow</li>\n<li>the clearest next actions</li>\n</ul>\n<p>Do not just echo the generated markdown blindly. Use the artifacts as evidence and produce a thoughtful agent answer.</p>\n<h2>Minutes-first transcription rules</h2>\n<p>This skill should prefer transcript backends in this order:</p>\n<ol>\n<li>hosted captions / VTT when the source exposes them</li>\n<li><code>minutes process</code> with an isolated temporary config</li>\n<li>local <code>whisper</code> CLI if available</li>\n<li>OpenAI audio transcription only as a last resort when configured</li>\n</ol>\n<p>Important:</p>\n<ul>\n<li>the Minutes path should use the user's current Minutes transcription setup</li>\n<li>if Minutes is configured for Whisper, use Whisper</li>\n<li>if Minutes is configured for Parakeet, use Parakeet</li>\n<li>do not silently fork a separate transcription stack unless the Minutes path is unavailable</li>\n</ul>\n<p>When reporting the artifacts back to the user, preserve the transcript method exactly. Prefer labels like:</p>\n<ul>\n<li><code>vtt_captions</code></li>\n<li><code>minutes-whisper</code></li>\n<li><code>minutes-parakeet</code></li>\n<li><code>minutes-whisper-fallback</code></li>\n<li><code>local_whisper_cli</code></li>\n<li><code>openai_audio_transcription</code></li>\n</ul>\n<h2>Context discipline</h2>\n<p>This skill must stay disciplined about context size.</p>\n<ul>\n<li>Do not send the full video itself to the reasoning layer.</li>\n<li>Do not dump a long transcript and dozens of frames into the final answer.</li>\n<li>Treat the transcript as the backbone and frames as supporting evidence.</li>\n<li>Prefer inspecting a curated subset of frames instead of every sampled image.</li>\n</ul>\n<p>The bundled script already caps frames adaptively, but you should still exercise judgment when deciding what to read or mention.</p>\n<h2>Output contract</h2>\n<p>The script writes a durable bundle under:</p>\n<pre><code>~/.minutes/video-reviews/&lt;timestamp&gt;-&lt;slug&gt;/\n</code></pre>\n<p>Expected files:</p>\n<ul>\n<li><code>analysis.md</code></li>\n<li><code>analysis.json</code></li>\n<li><code>transcript.md</code></li>\n<li><code>metadata.json</code></li>\n<li><code>frames/</code></li>\n</ul>\n<p>These artifacts are <strong>not</strong> part of the normal <code>~/meetings/</code> corpus by default.</p>\n<h2>Dependencies</h2>\n<p>See:</p>\n<ul>\n<li><code>$MINUTES_SKILL_ROOT/references/dependencies.md</code></li>\n<li><code>$MINUTES_SKILL_ROOT/references/output-schema.md</code></li>\n</ul>\n<h2>Gotchas</h2>\n<ul>\n<li><strong>Hosted URLs need <code>yt-dlp</code>.</strong> Local file review still works without it.</li>\n<li><strong>Frame caps are intentional.</strong> The script samples enough evidence to review the video without turning this into a generic video-intelligence pipeline.</li>\n<li><strong>Minutes artifacts stay isolated.</strong> The script uses a temp config/output path for the Minutes transcription run so it does not pollute the user's normal archive.</li>\n<li><strong>Model-powered auto-analysis is optional.</strong> The generated <code>analysis.md/json</code> may be heuristic when no multimodal provider key is available. You still need to read the artifacts and produce the final answer.</li>\n<li><strong>Long videos need synthesis, not brute force.</strong> If the transcript is long, work from the generated artifacts and only open the most relevant frames and transcript sections.</li>\n</ul>\n","files":[{"path":"references/dependencies.md","sizeBytes":1640,"isText":true},{"path":"references/output-schema.md","sizeBytes":1317,"isText":true},{"path":"scripts/video_review.py","sizeBytes":58449,"isText":true},{"path":"SKILL.md","sizeBytes":5711,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"notes-only","suspicious":0,"notes":5,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-08-27T17:01:25.364779Z","sha256":"4ED0329ED9822B0234BAA126BD8DFD7086EBB6D6A98C9DE9CB417074C2D77963","sizeBytes":18417},"review":null,"source":{"repositoryUrl":"https://github.com/silverstein/minutes","path":".opencode/skills/minutes-video-review","license":"MIT","commit":"37d3440d4f132e2f3864fbe537e375fd546159ba","subtreeSha":"D885556AD41881C1D2239540C7F3474DF74C6D806B7BC58C6EB85EC3CFF1DE02","lastSyncedAt":"2026-09-25T07:37:08.19899Z"},"reviewedAt":"2026-08-27T17:10:21.852085Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/silverstein/minutes/tree/main/.opencode/skills/minutes-video-review"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install silverstein-minutes@llmmart"},{"target":"git","command":"git clone https://github.com/silverstein/minutes.git"}]}