---
name: showcase-video
description: Record and cut a short showcase video of a game mod, or a compilation of clips, ready to post on X/YouTube. Records the game window with only the game's own audio, picks moments from contact sheets, and edits with one-line animated titles, creator credits, transitions, music, watermark and fade-out via an EDL JSON. Use when the user wants a demo video, trailer, clip or montage of a mod, or wants to combine existing clips into a styled video.
title: showcase-video
canonical_url: https://skilld.dev/gh/rehan-remade/universal-modder/showcase-video
last_updated: 2026-10-06T15:23:19.000Z
---

> Index of every page on this site: [llms.txt](https://skilld.dev/llms.txt)

> **Skill from skilld.dev.** Follow the user's requested action.
> If the user asked to fork this Skill, follow the fork workflow below. Do not execute the Skill instructions while copying it.
> Otherwise, follow the instructions below for this session. You do not need to install anything.
>
> If the user asked to install this Skill, run `npx skilld install rehan-remade/universal-modder/showcase-video`. Install writes the Skill files into the project, so every session loads them.
>
> ## Fork workflow
>
> A fork creates an editable local Skill with its original author and licence. The request authorizes copying and local installation.
> 1. Check `./skills/showcase-video`, the project lockfile, and selected Agent targets together. If the local directory or installed Skill exists, stop. Never overwrite an existing directory or Agent target.
> 2. Read [source metadata](https://skilld.dev/api/v1/skills/rehan-remade/universal-modder/showcase-video) once. Use sourceUrl, sourceCommit, skillPath, sourceGone, and license. If the source is gone or its path is missing, stop. If license is null, read licence files at the source commit.
> 3. Fetch only the source commit into a temporary Git repository. Do not clone full history. Derive repository_url from sourceUrl, including repository renames. If sourceCommit is absent, resolve the sourceUrl ref once. Set source_commit to that actual commit. Run these commands in one shell call:
>
> ```sh
> git init --quiet "$temporary_dir"
> git -C "$temporary_dir" fetch --quiet --depth=1 "$repository_url" "$source_commit"
> git -C "$temporary_dir" checkout --quiet --detach FETCH_HEAD
> ```
>
> Read applicable licence declarations and notices at that commit. If copying is not permitted, report the restriction and stop.
> 4. Inspect source entries together, then copy the directory containing skillPath into `./skills/showcase-video`. Use the user's path if selected. Keep the original SKILL.md, relative links, scripts, binary assets, and executable modes. Exclude .git metadata. Reject symlinks and paths outside the Skill directory. After checking entries, use cp -a where available. A regular source directory needs no custom copy script. Do not save this page wrapper as SKILL.md.
> Preserve author credit, notices, and applicable licence files from repository or parent directories. Add PROVENANCE.md with the Skill page, source URL, actual commit, original path, and licence. Retain any existing PROVENANCE.md and record new provenance separately. Batch source inspection, copying, and provenance work where practical.
> 5. In the project root, run `skilld install ./skills/showcase-video --mode copy --plain`. If skilld is unavailable, use `npx skilld install ./skills/showcase-video --mode copy --plain`. This known command needs no help lookup. Install does not support --json. Use detected Agent targets, or add --agent for the targets the user selected. Install the local path, never the upstream selector. If installation fails, preserve the local copy and report the exact failure.
> 6. Confirm the local lockfile source and installed Agent copies once. Report the local path, actual commit, and Agent targets. After edits, reinstall the same local path. Upstream updates must not replace it. Do not publish or push unless the user asks.

# Showcase video

A mod isn't finished until you can show it in 30 seconds. The toolchain is `um win record` (capture),
`um video contact` (look), `um video compile` (edit), all ffmpeg + Pillow.

## 1. Make the take repeatable
- **Script the action.** Use a mod-side timeline or command sequence (spawn enemies, fire the weapon, cue
  the boss), a scenario with triggers and camera moves, or a WinDrive command list. The first clean take
  should be reproducible exactly, so you can reshoot after a fix.
- **Restore the world before each take.** Explosions crater worlds; units die. Keep a pristine copy with
  `um backup` and restore it every take.
- **Clean frame.** Hide debug text, fix the camera zoom (the Terraria showcase used 1.5x so 1080p frames
  read like a 720p cut), run at full speed when unfocused, and hide the cursor (capture uses
  `capture_cursor=0`).

## 2. Record the window + the game's own audio
```bash
um win record --exe Game.exe --out C:\caps\take1 --seconds 40      # -> take1.mkv, take1.audio.raw, take1.json
um video first-frame C:/caps/take1.mkv                              # where gameplay starts (skips loading screens)
um video mux C:/caps/take1.mkv C:/caps/take1.audio.raw C:/caps/take1.json take1.mp4 [--offset 0.25]
```
- **Video:** ffmpeg gfxcapture of that window only (GPU frames, no desktop). It encodes with NVENC, AMF or
  QSV when available. NVENC H.264 maxes out at **4096 px wide**, so the recorder scales above that; for
  32:9 screens, crop to the centre 16:9 with `--crop`.
- **Audio:** WASAPI **process loopback** of the game's PID (`um/ps1/ProcLoopback.ps1`). Only the game is
  recorded; no Spotify, no notifications. It's timestamped so the file position is wall time. Muxing uses
  the recorded offset. Fine-tune with a visual/audio sync event (a flash vs its boom) and pass `--offset`.
- **Inside a mod (optional):** start and stop recording from the mod for frame-exact takes. Never block the
  game's main thread while stopping ffmpeg: send `q`, then wait off-thread. Write `.mkv` so a killed
  recorder still leaves a playable file (see `examples/terraria-tmodloader/reference/InModRecorder.cs`).

## 3. Look before you cut
```bash
um video probe clip.mp4
um video contact clip.mp4 sheet.png --every 1.5 --cols 6     # a timestamped grid; read it, pick in/out points
um video contact clip.mp4 zoom.png --start 20 --end 30 --every 0.5
```
Pick the peak moments: the explosion, the boss reveal, the unit in formation. Write in/out times into the
EDL.

## 4. Edit with an EDL
`um video compile edl.json out.mp4` (`--preview` renders half size and fast). The full format is in
`um video --help`.
```json
{
  "size": [1920, 1080], "fps": 30,
  "theme": {"accent": "#B6FF3B"},
  "transition": {"type": "fade", "duration": 0.3},
  "clip_volume": 0.8,
  "music": {"path": "music.mp3", "volume": 0.5},
  "watermark": {"path": "logo.png", "height": 54, "corner": "br"},
  "segments": [
    {"clip": "take1.mp4", "in": 9.0, "dur": 3.0, "hook": "Terraria, but with a tactical nuke."},
    {"clip": "take1.mp4", "in": 24.2, "dur": 4.5, "title": "Tactical Nuke", "transition": {"type": "pixelize"}},
    {"clip": "take2.mp4", "in": 3.0, "dur": 5.0, "title": "Drone Mothership boss"},
    {"card": {"title": "Fal Arsenal", "sub": "a Terraria mod"}, "dur": 2.5}
  ]
}
```
- **Transitions:** any ffmpeg xfade type (fade, pixelize, slideleft, smoothleft, circleopen, zoomin,
  radial...) or `cut`.
- **Fills:** for non-16:9 clips, `fill: blur` (blurred backdrop), `crop` or `pad`.
- **Per clip:** `speed` and `volume`, `zoom` to punch in past UI, `crop` [x, y, w, h] to reframe.
- **Music:** `um fal music "..." --seconds 60` makes a bed. Set `bpm` and use `beats` instead of `dur` to
  cut on the beat; `um video beats music.mp3` estimates tempo and first beat.

## Style that works (from real feedback)
- **Titles:** one line naming what's on screen ("Wonder: the Transamerica Pyramid", "Robotaxis and Delivery
  Drones"). No small explanatory captions about how it was made; that goes in the post text.
- **Pace:** get into gameplay within 2-3 s; menus and setup stay under 3 s. Clips run 3-5 s each. End on the
  mod name or URL and fade out.
- **Sound:** keep the game's audio. It sells impacts. Music under a compilation, clip audio around 0.5-0.8.
- **Compilations of other people's clips:** credit every creator on screen (`credit: "@handle"`) and in the
  post, and ask permission when it's promotional. Don't imply their clips were made with your tool. Download
  only public posts, and only what you'll use.
- **Last step:** look at a contact sheet of the finished video before sharing it.
