When to Use
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).
Source: connerkward/screenstudio-alternative-skill (MIT).
screenstudio-alt
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:
python3 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-pass
spring-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.)
Easy path
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.
Gotchas (learned the hard way, kept here so they're not relearned)
- ffmpeg CANNOT do animated
scale=eval=frame → crop (link reinit wedges crop's
per-frame exprs). That's why zoom uses zoompan (no t var there — use on/FPS).
- This machine's ffmpeg lacks
drawtext; all text/cursor overlays are PIL-rendered
PNGs + overlay.
- Test rig:
make-fixture.py synthesizes a fake screen recording + ground-truth
events.jsonl — validate any change against it before trusting real footage.
Limitations
- The workflow assumes FFmpeg plus the companion scripts are available locally; it is not a hosted video editor.
- Polished cursor, click, and keystroke effects depend on event logs captured during recording; missing logs limit what can be reconstructed.
- Auto-zoom and idle speed-up still need human review for pacing, framing, and platform-specific taste.
Source: sickn33/agentic-awesome-skills → skills/screenstudio-alt/SKILL.md
1---2name: screenstudio-alt3description: Open-source headless Screen Studio alternative: 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 — post-production for screen recordings from the CLI.4---5
6## When to Use
7
8Use 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).
9
10_Source: [connerkward/screenstudio-alternative-skill](https://github.com/connerkward/screenstudio-alternative-skill) (MIT)._
11
12# screenstudio-alt
13
14The skill's code lives in this directory (`polish.py`, `render.py`, `studio.py`,
15`events-log.swift`, test fixtures, etc.). Published publicly as
16`connerkward/screen-studio-alternative` via the publish-skill skill.
17
18Two components:
19
20- `events-log` (Swift) — capture-side input logger (cursor 60Hz, clicks, keys;
21 drops keys during macOS secure input). Runs ONLY while recording. Needs
22 Accessibility/Input Monitoring for the terminal. **Auto-zoom/keys/cursor need
23 this data at capture time — it cannot be recovered from pixels later.**
24- `polish.py` (Python, ffmpeg + PIL) — the post-production pass:
25
26```bash
27python3 src/polish.py in.mp4 --events in.events.jsonl \
28 --speedup # compress idle (input-gap ∩ frozen-pixels; animations stay 1x)
29 --zoom # eased auto-zoom on click clusters (zoompan)
30 --keys # accumulating keystroke chips (PIL overlays, no drawtext dep)
31 --smooth-cursor # synthetic eased cursor (best with sck-record --no-cursor)
32 --vertical # ALSO emit 1080x1920 following the action
33```
34
35`--speedup` works WITHOUT events (freezedetect only) — usable on the whole
36existing dailies corpus.
37
38- `render.py` — **high-quality non-destructive renderer** (preferred): single-pass
39 spring-physics camera over the original high-res frames, LANCZOS into a smaller
40 target (crisp zoom, ~1.3× sharper than the ffmpeg upscale path), 60fps, H + 9:16 V.
41 Tunable `--freq`/`--zeta` (spring), `--fps`, `--target-w`. Takes explicit
42 `--regions [{t0,t1,z,cx,cy}]`. `polish.py` is the older ffmpeg-filter fallback.
43- `studio.py [recording.mp4]` — local web UI, **NLE-style fixed-ruler timeline** (bar =
44 source duration, never rescales → upstream always planted): zoom regions are draggable
45 blocks (move / retime edges / click to add / double-click delete); idle spans are
46 **speed blocks with rate-only editing** — source range locked, rate set via inspector
47 slider on select or right-edge **rate-stretch** drag (FCP retime / Premiere Rate
48 Stretch); rate changes ripple downstream only. Tunable cosine-ease ramp, default zoom,
49 aspect, frame styling. Always-smooth synthetic cursor + click ripple + real recorded
50 click sound (CC0 #735771). Export uses render.py. Free port, local. (Keystroke overlay
51 exists in the engine but is off by default.)
52
53## Easy path
54
55`screencast.sh --demo` (screencast skill) does the whole chain: starts the event
56logger, records, then polishes + emits the 9:16 vertical automatically. Vertical
57is the DEFAULT for social-facing demos.
58
59## Gotchas (learned the hard way, kept here so they're not relearned)
60
61- ffmpeg CANNOT do animated `scale=eval=frame` → `crop` (link reinit wedges crop's
62 per-frame exprs). That's why zoom uses `zoompan` (no `t` var there — use `on/FPS`).
63- This machine's ffmpeg lacks `drawtext`; all text/cursor overlays are PIL-rendered
64 PNGs + `overlay`.
65- Test rig: `make-fixture.py` synthesizes a fake screen recording + ground-truth
66 events.jsonl — validate any change against it before trusting real footage.
67
68## Limitations
69
70- The workflow assumes FFmpeg plus the companion scripts are available locally; it is not a hosted video editor.
71- Polished cursor, click, and keystroke effects depend on event logs captured during recording; missing logs limit what can be reconstructed.
72- Auto-zoom and idle speed-up still need human review for pacing, framing, and platform-specific taste.
73
74---
75
76**Source:** [`sickn33/agentic-awesome-skills`](https://github.com/sickn33/agentic-awesome-skills) → `skills/screenstudio-alt/SKILL.md`