Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Screen-Studio-style post-production for screen recordings, headless — auto speed-up of idle, auto-zoom on click clusters, keystroke overlay chips, smoothed synthetic cursor, and 9:16 vertical export that follows the action. Use when polishing a screen recording / demo video for sharing, when the user mentions Screen Studio, auto-zoom, idle speed-up, or vertical/social video from a screen capture, and for any social-facing demo (vertical output is the default for those).
.claude/skills/bilal140202-screenstudio-alt/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | -31% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -21% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 2% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 7% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -24% | 0% |
The skill's code lives in this directory (polish.py, render.py, studio.py, events-log.swift, test fixtures, etc.). Published publicly as connerkward/screen-studio-alternative via the publish-skill skill.
Two components:
events-log (Swift) — capture-side input logger (cursor 60Hz, clicks, keys;drops keys during macOS secure input). Runs ONLY while recording. Needs Accessibility/Input Monitoring for the terminal. Auto-zoom/keys/cursor need this data at capture time — it cannot be recovered from pixels later.
polish.py (Python, ffmpeg + PIL) — the post-production pass:bashpython3 src/polish.py in.mp4 --events in.events.jsonl \ --speedup # compress idle (input-gap ∩ frozen-pixels; animations stay 1x) --zoom # eased auto-zoom on click clusters (zoompan) --keys # accumulating keystroke chips (PIL overlays, no drawtext dep) --smooth-cursor # synthetic eased cursor (best with sck-record --no-cursor) --vertical # ALSO emit 1080x1920 following the action
--speedup works WITHOUT events (freezedetect only) — usable on the whole existing dailies corpus.
render.py — high-quality non-destructive renderer (preferred): single-passspring-physics camera over the original high-res frames, LANCZOS into a smaller target (crisp zoom, ~1.3× sharper than the ffmpeg upscale path), 60fps, H + 9:16 V. Tunable --freq/--zeta (spring), --fps, --target-w. Takes explicit --regions [{t0,t1,z,cx,cy}]. polish.py is the older ffmpeg-filter fallback.
studio.py [recording.mp4] — local web UI, NLE-style fixed-ruler timeline (bar =source duration, never rescales → upstream always planted): zoom regions are draggable blocks (move / retime edges / click to add / double-click delete); idle spans are speed blocks with rate-only editing — source range locked, rate set via inspector slider on select or right-edge rate-stretch drag (FCP retime / Premiere Rate Stretch); rate changes ripple downstream only. Tunable cosine-ease ramp, default zoom, aspect, frame styling. Always-smooth synthetic cursor + click ripple + real recorded click sound (CC0 #735771). Export uses render.py. Free port, local. (Keystroke overlay exists in the engine but is off by default.)
screencast.sh --demo (screencast skill) does the whole chain: starts the event logger, records, then polishes + emits the 9:16 vertical automatically. Vertical is the DEFAULT for social-facing demos.
scale=eval=frame → crop (link reinit wedges crop'sper-frame exprs). That's why zoom uses zoompan (no t var there — use on/FPS).
drawtext; all text/cursor overlays are PIL-renderedPNGs + overlay.
make-fixture.py synthesizes a fake screen recording + ground-truthevents.jsonl — validate any change against it before trusting real footage.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 23,588 | 6,318 | -73% | 1 | 1 | 0% | 4,721 | 1,275 | -73% | 0 | 0 | — |
case-02 | fail→fail | 24,667 | 8,411 | -66% | 1 | 1 | 0% | 4,710 | 1,884 | -60% | 0 | 0 | — |
case-03 | fail→fail | 8,406 | 5,927 | -29% | 1 | 1 | 0% | 1,397 | 1,040 | -26% | 0 | 0 | — |
case-04 | fail→pass | 14,648 | 5,722 | -61% | 1 | 1 | 0% | 2,484 | 1,717 | -31% | 0 | 0 | — |
case-05 | fail→pass | 19,197 | 9,962 | -48% | 1 | 1 | 0% | 2,982 | 2,349 | -21% | 0 | 0 | — |
case-06 | pass→pass | 9,803 | 2,489 | -75% | 1 | 1 | 0% | 1,476 | 1,227 | -17% | 0 | 0 | — |
case-07 | pass→pass | 13,689 | 3,724 | -73% | 1 | 1 | 0% | 1,865 | 1,424 | -24% | 0 | 0 | — |
case-08 | fail→pass | 14,375 | 8,048 | -44% | 1 | 1 | 0% | 2,104 | 2,141 | +2% | 0 | 0 | — |
case-09 | fail→pass | 13,382 | 9,078 | -32% | 1 | 1 | 0% | 2,119 | 2,268 | +7% | 0 | 0 | — |
case-10 | fail→pass | 13,436 | 5,117 | -62% | 1 | 1 | 0% | 2,117 | 1,611 | -24% | 0 | 0 | — |
case-11 | fail→pass | 6,910 | 2,352 | -66% | 1 | 1 | 0% | 1,078 | 1,235 | +15% | 0 | 0 | — |
case-12 | fail→pass | 16,105 | 10,033 | -38% | 1 | 1 | 0% | 2,577 | 2,449 | -5% | 0 | 0 | — |
case-13 | pass→pass | 17,737 | 16,371 | -8% | 1 | 1 | 0% | 2,906 | 3,668 | +26% | 0 | 0 | — |
case-14 | fail→pass | 15,255 | 2,066 | -86% | 1 | 1 | 0% | 2,948 | 1,158 | -61% | 0 | 0 | — |
case-15 | fail→pass | 22,848 | 2,100 | -91% | 1 | 1 | 0% | 2,925 | 1,199 | -59% | 0 | 0 | — |
case-16 | pass→pass | 8,729 | 1,889 | -78% | 1 | 1 | 0% | 1,245 | 1,115 | -10% | 0 | 0 | — |
case-17 | pass→pass | 6,973 | 6,894 | -1% | 1 | 1 | 0% | 1,005 | 1,391 | +38% | 0 | 0 | — |
case-18 | fail→pass | 10,065 | 1,512 | -85% | 1 | 1 | 0% | 1,607 | 1,074 | -33% | 0 | 0 | — |
case-19 | pass→pass | 8,918 | 2,169 | -76% | 1 | 1 | 0% | 1,597 | 1,117 | -30% | 0 | 0 | — |
case-20 | fail→fail | 14,768 | 12,924 | -12% | 1 | 1 | 0% | 2,619 | 3,242 | +24% | 0 | 0 | — |
case-21 | fail→fail | 9,514 | 6,376 | -33% | 1 | 1 | 0% | 1,782 | 1,905 | +7% | 0 | 0 | — |
case-22 | fail→fail | 11,531 | 11,013 | -4% | 1 | 1 | 0% | 1,887 | 2,834 | +50% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +45 percentage points is the difference between those two pass rates over the 20 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.