From verndale-agentics
Remove near-duplicate frames from a video extraction directory using perceptual hashing (dhash). Runs after frame extraction and before frame analysis to reduce context window usage by eliminating visually identical frames. Typically removes 50-80% of frames from meeting recordings where the same screen is visible for extended periods.
How this skill is triggered — by the user, by Claude, or both
Slash command
/verndale-agentics:dedupe-framesThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are the Frame Deduplication agent. Your job is to eliminate near-duplicate frames from a video extraction before the frame analysis agents process them. This is a critical optimization step — meeting recordings typically contain 50-80% redundant frames (same screen, slight mouse movement, no meaningful change), and removing them prevents frame analysis agents from exhausting their context w...
You are the Frame Deduplication agent. Your job is to eliminate near-duplicate frames from a video extraction before the frame analysis agents process them. This is a critical optimization step — meeting recordings typically contain 50-80% redundant frames (same screen, slight mouse movement, no meaningful change), and removing them prevents frame analysis agents from exhausting their context window on repetitive content.
Take a directory of extracted video frames (produced by the extract-video-frames skill) and remove frames that are visually identical or near-identical to their predecessor. Preserve the first frame of every distinct screen or view change. Update the manifest so downstream agents only process unique frames.
The script uses dhash (difference hash) — a perceptual hashing algorithm that:
If two consecutive frames have a Hamming distance ≤ threshold, they look essentially the same and the later frame is dropped. When the distance exceeds the threshold, a meaningful visual change occurred (screen transition, new panel, scroll) and the frame is kept.
pip install imagehash Pillow --break-system-packages
python skills/dedupe-frames/scripts/dedupe-frames.py screencast/{meeting-name}-frames/
This uses the default threshold of 6, which works well for typical meeting recordings where you want to catch same-screen frames but preserve any meaningful screen change.
python skills/dedupe-frames/scripts/dedupe-frames.py screencast/{meeting-name}-frames/ --dry-run
python skills/dedupe-frames/scripts/dedupe-frames.py screencast/{meeting-name}-frames/ --threshold 2
python skills/dedupe-frames/scripts/dedupe-frames.py screencast/{meeting-name}-frames/ --threshold 10
python skills/dedupe-frames/scripts/dedupe-frames.py screencast/{meeting-name}-frames/ --keep-originals
The threshold controls how aggressively duplicates are detected. Hamming distance is the number of differing bits between two frame hashes.
| Threshold | Behavior | Best For |
|---|---|---|
| 2 | Near-exact only. Catches identical frames with minor compression differences. | When you want maximum frame retention |
| 4 | Conservative. Catches same-screen with cursor movement. | Demos with lots of small UI changes |
| 6 | Recommended default. Catches same-screen, minor scrolls, tooltip appearances. | Meeting recordings, platform walkthroughs |
| 8 | Moderate. Catches same page with different scroll positions. | Long meetings with extended discussions on one screen |
| 10+ | Aggressive. May drop frames with meaningful but subtle differences. | Very long recordings where context budget is tight |
How to calibrate:
--dry-run firstdedup-report.json — look at the distance values for removed framesmanifest.json — Updated with only the unique frames. Adds metadata fields: dedup_applied, dedup_threshold, dedup_original_count.dupes/)manifest.original.json — Backup of the pre-dedup manifest (created only on first run)dedup-report.json — Full report with per-frame decisions:
{
"total_frames": 209,
"kept_frames": 52,
"removed_frames": 157,
"reduction_percent": 75.1,
"threshold": 6,
"decisions": [
{"frame": "frame_001.png", "action": "kept", "reason": "first frame", "distance": 0},
{"frame": "frame_002.png", "action": "removed", "reason": "duplicate of frame 0 (distance=1)", "distance": 1},
{"frame": "frame_003.png", "action": "kept", "reason": "visually distinct (distance=47 from frame 0)", "distance": 47}
]
}
Phase 0: extract-video-frames → dedupe-frames → elevenlabs-transcribe
↓
Phase 1: frame-analyst chunks now process only unique frames
Deduplication runs after frame extraction and before transcription and frame analysis. The full audio track (full_audio.aac) is not affected — only the frame PNGs and per-frame audio segments are pruned.
With deduplication, a typical 17-minute meeting recording drops from ~209 frames to ~40-60 unique frames. This means:
When working as part of an agent team:
extract-video-frames skill completing first (needs manifest.json and frame files)frame-analyst chunks read the updated manifestelevenlabs-transcribe — the full audio track is preserved regardlessFollow the dedupe-frames skill in skills/dedupe-frames/SKILL.md.
Frames dir: screencast/platform-overview-frames/
Run with default threshold first as a dry run, then apply.
"frame-deduplicator" — Follow the dedupe-frames skill in skills/dedupe-frames/SKILL.md.
Run: python skills/dedupe-frames/scripts/dedupe-frames.py screencast/{meeting-name}-frames/ --keep-originals
Wait for video-extractor to complete first. Report the reduction percentage to the team lead
so frame-analyst chunk sizes can be adjusted based on remaining frame count.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Applies a firm's KYC/AML rules grid to parsed onboarding records: assigns risk rating, checks required documents, outputs rule outcomes with citations, and routes for escalation.
Generates daily or weekly digests of activity from connected sources (chat, email, docs, tasks, CRM), highlighting action items, decisions, mentions, and project updates.
npx claudepluginhub qdhenry/verndale-agentics-cc-plugin