Weekly Changelog Video
heygen-com/hyperframes
Turns a weekly changelog markdown file into a branded HyperFrames video with voiceover, animated mock-UI scenes and captions, using fonts, background and scripts bundled in the skill.
Records a sharp product demo video by driving the real app with a browser agent, from storyboard to Xvfb capture and a narration script synced to the frames.
$ npx skills add ooiyeefei/ccc --skill demo-video -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ooiyeefei/ccc demo-video --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ooiyeefei/ccc.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/demo-video .claude/skills/demo-video && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "demo-video" agent skill from https://github.com/ooiyeefei/ccc/tree/main/skills/demo-video into .claude/skills/demo-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-video", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ooiyeefei/ccc/tree/main/skills/demo-videoType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ooiyeefei/ccc --skill demo-video -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ooiyeefei/ccc demo-video --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ooiyeefei/ccc.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/demo-video .agents/skills/demo-video && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "demo-video" agent skill from https://github.com/ooiyeefei/ccc/tree/main/skills/demo-video into .agents/skills/demo-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-video", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ooiyeefei/ccc --skill demo-video -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ooiyeefei/ccc demo-video --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ooiyeefei/ccc.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/demo-video .cursor/skills/demo-video && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "demo-video" agent skill from https://github.com/ooiyeefei/ccc/tree/main/skills/demo-video into .cursor/skills/demo-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-video", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ooiyeefei/ccc.git --path skills/demo-video--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ooiyeefei/ccc --skill demo-video -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ooiyeefei/ccc demo-video --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ooiyeefei/ccc.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/demo-video .gemini/skills/demo-video && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "demo-video" agent skill from https://github.com/ooiyeefei/ccc/tree/main/skills/demo-video into .gemini/skills/demo-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-video", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ooiyeefei/ccc demo-videoInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ooiyeefei/ccc --skill demo-video -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ooiyeefei/ccc.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/demo-video .github/skills/demo-video && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "demo-video" agent skill from https://github.com/ooiyeefei/ccc/tree/main/skills/demo-video into .github/skills/demo-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-video", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ooiyeefei/ccc --skill demo-video -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ooiyeefei/ccc demo-video --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ooiyeefei/ccc.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/demo-video .opencode/skills/demo-video && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "demo-video" agent skill from https://github.com/ooiyeefei/ccc/tree/main/skills/demo-video into .opencode/skills/demo-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-video", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
demo-videoRecords a sharp product demo video by driving the real app with a browser agent, from storyboard to Xvfb capture and a narration script synced to the frames.
A demo is treated as an argument in which every beat proves a claim, and narration is written to what is on screen at that second. The recording contract bans posters: every frame must be real browser state from the running app, though callouts, a drawn cursor and spotlights over live state are fine. It also requires the whole journey, from entry and setup through the core loop to the payoff, rather than opening on the final feature.
The pipeline runs from storyboard approval to a staged app, a smoke take and the full recording in an Xvfb framebuffer, then derives timestamps from the resulting MP4 so the narration script lands on the right frames. Reference notes cover storyboarding, driving the app, recording and motion, and scripts include cinema.js and record_template.py. It is not for live pitching, deck building, one-off screenshots or editing footage that already exists.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit c0fd926. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 2 files in scripts/ (JavaScript and Python), which the agent can run.
Shell commands in SKILL.md call:
ffmpegapt-getFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Product Demo Video Recorder loads about 2.8k tokens when it runs, and up to ~10k if it reads all its reference files. Until then it costs about 224 tokens; SKILL.md has 1,562 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from ooiyeefei/ccc at commit c0fd926, republished under its MIT licence (© ooiyeefei). 1,562 words, ~2,782 tokens.
.claude/skills/demo-video/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.A demo is an argument: every beat on camera proves a claim, and the narration is written to the frame - describing what is actually on screen at that second.
Boundary - this recording has no substitute. The
video-shotcraftmotion library captures STILL screenshots and glides a fake camera over them; it CANNOT record interaction. Never let it stand in for a tutorial, walkthrough, or any real-product film. It decorates RENDERED scenes inmotion-video; the live recording, the DOM motion, and the timestamp-synced script stay here, always. (Standing owner rule, 2026-07-23; seemotion-video/references/shotcraft-bridge.md.)
This fires automatically on every demo film, whether or not the user asks for it. These are the rules an agent under time pressure skips first, which is exactly why they are not optional. Rules 1-4: references/storyboard.md. Rules 5-6: references/recording.md.
Film the product, not a poster - annotate, never substitute. Every frame is real browser state from the running app, changing because the driver acted on it.
Annotation drawn over live state is standard practice: callouts, the drawn cursor, spotlight, the terminal panel. A film that explains itself on mute is doing its job. The test is whether the overlay is load-bearing: remove it, and does the frame still show the product doing the thing? If yes it is annotation, use it freely. If no it is a poster - a title card, slide interstitial, mocked screen, static hero image - and it stays banned.
If a beat can't be staged, cut the beat or fix the app. Never substitute a picture of the claim for the claim. (Slides are legitimate in pitch-deck's deck take, stitched around the demo film, never inside it.) Motion and annotation: references/motion.md.
Show the whole journey, not just the money shot. The film covers entry -> setup -> the core loop -> the payoff. A viewer who has never seen the product must be able to follow how a real user gets from opening it to the result. Opening on the final feature reads as a mockup and answers none of "what is this, who uses it, how do you get there".
Every claim gets a frame. The storyboard runs both directions: each beat names what it proves, and each claim the narration will make names the beat that shows it. This binds hardest on agent actions - "the agent searched", "it updated memory", "it chose the cheaper route" all need visible on-screen evidence (the tool log, the memory panel, the route badge). A claim with no frame is cut from the narration or earns a beat that shows it. Invisible work is not proof.
Storyboard approved before capture - Gate 1 below. Blocking.
Smoke take inspected before the full capture - Gate 2 below. Blocking: any failed check means fix the staging and re-smoke, never start the full capture on a known-bad frame.
Timestamps derived from the delivered MP4 - Gate 3 below. Never from planned waits, never from the storyboard's estimated holds.
Check the machine can do this before promising it: ffmpeg and Xvfb installed (apt-get install -y xvfb on Linux; this recipe is Linux-first - on macOS capture the retina display with ffmpeg -f avfoundation or the built-in screen recorder, same principles: physical pixels, controlled bitrate). Confirm the app runs with demo data and demo credentials, and that credentials stay OUT of the repo (scratchpad only).
Write the visual storyboard before recording anything. One row per beat:
phase | screen | action | proof | narration | duration
Read references/storyboard.md for the format, the journey-coverage checklist, and the claim-to-frame audit. Then show it to the user and stop. Do not stage, do not smoke-test, do not record until they approve or amend it.
A blanket "just make it, I trust you" issued before the storyboard existed is not approval of it - the user has not seen the plan yet. Show the table and wait.
The harness enforces this too: a full take requires --storyboard <path>, and stamps its hash into the sidecar.
This gate is not politeness - it is the cheapest point to change the film. After capture, every edit re-shoots footage and re-syncs narration against new timestamps.
Deterministic demo data, seeded to make the beats true. Log in OFF camera. Kill anything that can interrupt the frame: notifications, password-manager bubbles (pre-write Chrome preferences - see recording.md), first-run dialogs. Never trigger JS alerts mid-take; they freeze the driver.
Run record_template.py <name> --smoke. It records through the first beat that actually drives something - rendering beat 1 alone cannot catch a dead selector, which is half of what this gate is for - then extracts frames and prints a contact sheet. Read it as an image.
Checking: right app, right screen, right framing, text crisp at full scale, no cursor, no dialog or bubble in frame, chrome hidden, seeded data actually present. Full checklist in references/recording.md.
Any unchecked box means the take is not ready: fix the staging and re-smoke. Never start the full capture on a known-bad frame - that is the whole point of the gate.
A smoke take costs ~30 seconds and catches the failures that otherwise surface after a full take plus a written narration: wrong scale factor, unstaged data, a dead selector, a login bubble covering the money shot.
The harness enforces this: a full take refuses to run until a smoke take exists for that name. --no-smoke overrides it and is stamped into the sidecar - use it only when this app was already captured at this config.
Xvfb at physical 2560x1600, Chrome in app mode with --force-device-scale-factor=2 over a 1280x800 CSS viewport, ffmpeg x11grab with -draw_mouse 0 at CRF 16-18, driven over CDP.
Read references/recording.md before changing ANY parameter - every flag in that recipe exists because the obvious capture paths produce macroblocked or soft footage at high resolution.
Camera move, not a cut. Genuine footage still reads as a slideshow when the driver teleports: scrollIntoView() jumps and setting .value inserts a whole string in one frame. Beats therefore carry a motion field (an awaited camera move or annotation) and use click / type, which drive a drawn cursor to the target and then dispatch real CDP input events, so the app receives genuine events while the frame shows the movement. Motion costs real seconds, so budget it in the storyboard's dur column. Primitives, their costs, the annotate-never-substitute test, and proof-frame timing: references/motion.md.
The harness records wall-clock marks during the drive. Those are a hypothesis; the delivered file is the fact. (Why they drift, and the reconciliation arithmetic, are in references/recording.md.)
A full take already reconciles and extracts on the way out - read the contact sheet it printed. Use record_template.py <name> --verify to re-check, or after a re-encode. (After a trim, prefer re-cutting from the original: the reconcile assumes missing time is at the front, so a tail cut shifts every mark early - the harness flags it, but flagged is not fixed.) (Manual ffprobe/ffmpeg -ss procedure in references/recording.md, including what to do for footage with no sidecar.)
Extract a frame per milestone and look at every one. Each frame must show the screen its beat claims.
Each beat gets two timestamps, and using the wrong one breaks the gate: t_video is the narration cue (beat start), t_proof is where the claim is actually visible (after the async result renders). Verify against t_proof; sync narration to t_video. On a live-backend beat these are seconds apart, and checking at the cue fails a correct take.
Ship nothing whose frames you have not seen. If a proof frame shows the wrong screen, the timestamp is wrong - fix it before narration, not after voicing.
Hand the verified milestone JSON and the storyboard to the pitch-craft skill. The narration describes what IS on screen at each timestamp, in the recorded register, chunked to the milestone windows. Every claim traces to a beat per contract rule 3.
A new take shifts every milestone (live backends vary by seconds). Re-verify against the new MP4, then re-align the narration per pitch-craft's timing.md re-sync procedure. Treat take + script as one versioned pair.
If the beat list changed, Gate 1 reopens. Dropping beats that wouldn't stage, merging two, or reordering the journey all change the film the user approved - re-show the storyboard and get sign-off before re-shooting. Silently shipping four of six approved beats is the most likely way this pipeline fails in practice, because unstageable beats only reveal themselves once you try.
references/motion.md - the motion and annotation layer: primitives, the substitution test, beat wiring, what motion costs. Read before writing beats that move.references/storyboard.md - the storyboard format, journey coverage, the claim-to-frame audit, and how to run the approval gate. Read before writing the storyboard.references/recording.md - the framebuffer recipe and why each flag exists; the smoke-take and timestamp-verification checklists; process gotchas. Read before recording or debugging quality.references/driving.md - CDP driving patterns: clicks, variable-latency waits, milestone marking, staying dialog-safe.scripts/record_template.py - the harness. Edit the CONFIG and BEATS sections; the plumbing is done. Supports --smoke and --verify.scripts/cinema.js - the in-page motion layer, injected automatically. Read it before changing a primitive's defaults; they were arrived at by fixing real defects.© ooiyeefei, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 7 other files (scripts, references) in skills/demo-video of ooiyeefei/ccc.
Open the folder on GitHubat commit c0fd926
Product Demo Video Recorder next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Product Demo Video Recorder this skillooiyeefei/ccc | 495 | — | ~2.8k | Automated safety check: Pass | MIT | |
| Weekly Changelog Videoheygen-com/hyperframes | 60k | — | ~3.3k | Automated safety check: Pass | Apache-2.0 | |
| Faceless Explainer Videoheygen-com/hyperframes | 60k | 3 repos | ~7.7k | Automated safety check: Notes | Apache-2.0 | |
| ShortsAgriciDaniel/claude-shorts | 219 | — | ~3.2k | Automated safety check: Notes | MIT | |
| Taisly Social Media Postingtaisly/agent | 217 | 1 repos | ~1.5k | Automated safety check: Pass | MIT | |
| Viral Captions And Ctasvyralcontent/content-skills | 134 | 1 repos | ~2.8k | Automated safety check: Pass | MIT |
heygen-com/hyperframes
Turns a weekly changelog markdown file into a branded HyperFrames video with voiceover, animated mock-UI scenes and captions, using fonts, background and scripts bundled in the skill.
heygen-com/hyperframes
Turns an article, notes or a topic brief into an explainer video whose visuals are invented per scene, built frame by frame in HyperFrames with no footage.
AgriciDaniel/claude-shorts
Interactive longform-to-shortform video creator. An agent skill from AgriciDaniel/claude-shorts.
taisly/agent
Free AI-first short-form video publishing to TikTok, Instagram Reels, YouTube Shorts, X, and Facebook from AI agents through Taisly.
vyralcontent/content-skills
Write captions, on-screen text, hashtags, and CTAs for short-form video that earn saves and sends without tripping engagement-bait penalties.
FavioVazquez/showtime
A skill your agent uses when the user wants a video made, edited or finished: a launch or promo, product demo, explainer, trailer or teaser, tutorial or walkthrough, a screen recording turned into a…
ooiyeefei/ccc
Turns meeting recordings into notes with a chain of custody from audio to claim, auditing transcripts for gaps and low-confidence numbers and names.
ooiyeefei/ccc
Builds marketing and explainer videos in Remotion from rendered scenes, with one real product capture as proof, and cuts them for each platform's formats.
ooiyeefei/ccc
Generates architecture diagrams as .excalidraw files by analyzing a codebase, with optional PNG or SVG export through Playwright.
ooiyeefei/ccc
Sets up GA4 on a website and wires one real conversion event end to end, verified in DebugView before any money goes into ads.
ooiyeefei/ccc
Builds or rewrites SaaS landing pages by researching the real product, positioning it against alternatives and writing buyer-focused copy, then implementing it in the codebase.
ooiyeefei/ccc
Walks a site owner through installing the Meta Pixel, firing one conversion event and verifying it with the Pixel Helper before any ads run.
Categories
Records a sharp product demo video by driving the real app with a browser agent, from storyboard to Xvfb capture and a narration script synced to the frames. A demo is treated as an argument in which every beat proves a claim, and narration is written to what is on screen at that second. The recording contract bans posters: every frame must be real browser state from the running app, though callouts, a drawn cursor and spotlights over live state are fine.
Product Demo Video Recorder fits situations like: recording a product walkthrough for a launch or hackathon submission; redoing a demo recording that came out blurry, pixelated or soft; syncing narration to what is actually on screen.
Run `npx skills add ooiyeefei/ccc --skill demo-video -a claude-code`. Or copy the skill folder (skills/demo-video in ooiyeefei/ccc) into .claude/skills/demo-video in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ooiyeefei/ccc --skill demo-video -a codex`. Or copy the skill folder (skills/demo-video in ooiyeefei/ccc) into .agents/skills/demo-video in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ooiyeefei/ccc --skill demo-video -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/demo-video, .gemini/skills/demo-video, .github/skills/demo-video and .opencode/skills/demo-video in your project.
Going by SKILL.md and its folder, Product Demo Video Recorder needs JavaScript and Python for the scripts in its folder and the command-line tools its instructions call (ffmpeg and apt-get). Our summary lists: A runnable app and a browser agent to drive it; Xvfb for framebuffer recording.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Product Demo Video Recorder is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 7.3k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Product Demo Video Recorder: Weekly Changelog Video (heygen-com/hyperframes, 60k stars), Faceless Explainer Video (heygen-com/hyperframes, 60k stars), Shorts (AgriciDaniel/claude-shorts, 219 stars) and Taisly Social Media Posting (taisly/agent, 217 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ooiyeefei (a GitHub user) maintains it in ooiyeefei/ccc, which has 495 GitHub stars. The repository holds 22 skills in this directory. The repository was last updated on July 29, 2026.
Source: ooiyeefei/ccc on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.