Roblox promo shorts
You produce the whole video yourself: script, footage, edit, audio, cover. The user's job is approving the plan, keeping hands off the PC while you record, and recording a voiceover if they want their own voice. Output is 1080x1920 @60fps H.264, -14 LUFS, plus covers.
Everything here was learned the hard way on a real game (Archer Heroes). The scripts in
scripts/ are the working pipeline; copy them into the user's project and edit the clearly
marked data blocks rather than rewriting from scratch.
Workflow
- Analyze references (if the user shares links) →
references/research.md. Download with yt-dlp, make frame sheets, transcribe, and pull view counts. The view counts matter more than the vibes: in testing, a story format got 28M views while a re-post of an already-used stream moment got 34K. Tell the user what actually performs. - Pick the format and write the script with real facts. Read numbers from the place (line counts, enemy counts, drop rates) via Studio MCP; never invent stats. Flag any claim the user must confirm (e.g. "I didn't write a single line").
- Record footage from Studio →
references/studio-recording.md. Edit-mode camera fly-throughs (Luau-animated camera + ffmpeg screen grab) and real playtest gameplay (admin remotes, wave warps, god mode). Ask the user to bring Studio to the front and not touch input; tell them when they can use the PC again. - Edit with one of the two templates:
- Motion-graphics explainer →
references/explainer.md(scripts/render_explainer.py) - Streamer-reaction meme →
references/reaction.md(scripts/render_reaction.py)
- Motion-graphics explainer →
- Audio →
references/audio.md. Real samples only (Pixabay / the user's library), music drop on the reveal, ducking under voice, loudnorm -14 LUFS. - Covers:
scripts/thumbnail_explainer.py(vertical + 16:9),scripts/thumbnail_reaction.py. - Verify, then deliver: look at stills and a contact sheet, transcribe the final to
check caption sync, check loudness, then send the MP4 + covers with
SendUserFile.
Toolbox (scripts/driver.py)
python <skill>/scripts/driver.py check # ffmpeg, yt-dlp, whisper, demucs, fonts
python <skill>/scripts/driver.py stills <proj> render.py 0.5,6,12 # preview stills -> .promo_out/stills.jpg
python <skill>/scripts/driver.py sheet video.mp4 2 # contact sheet -> look at it
python <skill>/scripts/driver.py cuts recording.mp4 # hard-cut times (real PTS)
python <skill>/scripts/driver.py words final.mp4 # Whisper word stamps (sync check)
python <skill>/scripts/driver.py mux video.mp4 mix.wav out.mp4 # -14 LUFS upload encode
python <skill>/scripts/driver.py viewport # find Studio viewport band on screen
python <skill>/scripts/driver.py grab take.mp4 40 168 1146 # record that band at 60fps
python <skill>/scripts/music_drops.py track.mp3 # bpm, loudness curve, drop times
Always open the images these produce. A render that "succeeded" can still be all RUN OVER screens, under-the-floor camera, or a name tag you must not publish.
Rules that protect the user
- No AI voice clones of real people. Don't make a streamer say lines they never said, with ElevenLabs or anything else. Use their real clips (find the original VOD, not another creator's edit) and isolate the voice with Demucs. Suggest labelling meme edits as edits.
- No synthesized SFX. The user found numpy-synth whooshes/ticks painful ("nails on a blackboard"). Use real samples; warm/low ones (spectral centroid < ~2 kHz) for hits.
- Downloads need a yes. Before downloading SFX/music, list files, source and rough size, and wait for approval. yt-dlp for reference/source videos is fine when the user asked for it.
- Don't publish other people's info. Team Create collaborators show up as name tags in edit-mode captures; cut around or blur them.
- Playtests write to the real save. Admin gear grants/equips persist. Say so and offer to restore the loadout. Restore any place edits (ShowDevelopmentGui, temp stage folders).
- Don't record the user's desktop while they're using it. Grab the screen only after
they say Studio is in front; otherwise use
screen_capturestills.
Delivering
Send the upload MP4 and covers with SendUserFile (display: render). In the message: what's
in it beat by beat, what's real vs placeholder (e.g. TTS voice), loudness, and the honest
caveats (claims to verify, Content ID risk of Pixabay music, profile changes).
Offer a one-command rebuild when the user records their own voice
(references/explainer.md → "Swapping in the user's voice").