Skip to content
Back to skills

Pr To Video

ASecurity

Animate a pull request or a code change as a short video: the old code morphs into the new one token by token, with the changed lines in focus. Use for PR summaries, code review videos, or 'show what changed' requests.

  • 2 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 24, 2026
designrustnodegitapi

Works with

  • api

Security analysis

A100/100

Scanned October 24, 2026

npx -y skills add oxygenframe/oxframe-sdk --skill pr-to-video --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Pr To Video?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Pr To Video
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/oxygenframe-pr-to-video/badge)](https://www.skillsdirectory.com/skills/oxygenframe-pr-to-video)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: pr-to-video
description: "Animate a pull request or a code change as a short video: the old code morphs into the new one token by token, with the changed lines in focus. Use for PR summaries, code review videos, or 'show what changed' requests."
---
# A code change as a video

Uses the `oxframe` skill (workflow, full API cheat sheet); install both with `npx skills add oxygenframe/oxframe-sdk`.

Get the change with `git diff` or `gh pr diff <n>`. Show each changed file
(or the one that matters) as a `Code` node, then animate it to the new
version: `.code().to(..)` diffs tokens, so kept code stays and changed code
moves, appears or fades.

```rust
const BEFORE: &str = "fn total(items: &[Item]) -> u32 {\n    items.iter().map(|i| i.price).sum()\n}";
const AFTER: &str = "fn total(items: &[Item]) -> u32 {\n    items.iter().filter(|i| i.in_stock).map(|i| i.price).sum()\n}";

#[oxframe::scene]
async fn change(view: View) {
    view.add(Txt::new().text("Skip items out of stock").h2().to_edge(Edge::Top));
    let code = view.add(Code::new().code(BEFORE).language("rust"));
    wait_for(1.0).await;
    code.focus_lines(2, 2, 0.4).await;
    code.code().to(AFTER, 1.2).flash().await;
    wait_for(1.5).await;
}
```

- `.insert(line, col, text, secs)`, `.remove(((l, c), (l, c)), secs)` and
  `.replace(range, text, secs)` edit in place; lines are 1-based, columns 0-based.
- One file per scene, about 20 lines on screen; cut the rest from the
  snippet. Long files: `.focus(first, last)` and `.dim(0.3)`.
- Use `CodeExplainer::new(src).step(first, last, "what it does")` when the
  video should walk through the new code instead of the change.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.