Devlog Video Creation Workflow
Create short-form video content for TikTok/X from gameplay captures.
Prerequisites
- OBS Studio with replay buffer configured
- Remotion installed:
cd devlog/remotion && npm install
- Session created:
./devlog/bin/new-session.sh
- (Optional) Whisper for auto-ordering:
pip install openai-whisper
SFX & Music Library
Primary: Eagle MCP (37,101 audio files!)
Library: /Volumes/AssetsEagle/Sound and Music.library
Search by text query:
mcp__eagle-mcp__item_query({ query: "whoosh transition" })
mcp__eagle-mcp__item_query({ query: "glitch error" })
mcp__eagle-mcp__item_query({ query: "pop notification" })
Browse folders:
mcp__eagle-mcp__folder_get({ getAllHierarchy: true })
Get items from specific folder:
mcp__eagle-mcp__item_get({ folders: ["FOLDER_ID"] })
Key folders for devlog:
| Folder Name | Use For |
|---|
| Motion Fx | UI sounds, transitions, typing |
| Just Whoosh 4 | Swooshes, fast movements |
| Just Impacts | Hits, emphasis |
| Just Transitions | Scene changes |
| SFX - Casual Game Sound Kit | Achievements, UI |
| Music - Cyberpunk Loops | Energetic background |
| Music - Lo-Fi | Chill background |
Search queries for devlog content:
| Moment | Query |
|---|
| Hook/tension | "riser tension suspense" |
| Reveal/ta-da | "success achievement tada" |
| Bug/glitch | "glitch error" |
| Transition | "whoosh swish" |
| UI click | "click pop bubble" |
| Comedy | "cartoon funny pop" |
| Background music | "loop energetic" or "loop chill" |
Fallback: Local Motion Fx Folder
If Eagle MCP is unavailable, use local folder:
Source Path: /Users/joshuashin/Projects/TexturePackerRepo/assets/Motion Fx
Index: See sfx-index.md in this skill folder for full categorization.
CLI: ./devlog/bin/list-sfx.sh search <term>
Quick SFX picks by use case:
| Moment | Recommended SFX |
|---|
| Hook/tension | Transitions/Whoosh/WHSH_Fade in whoosh.wav |
| Reveal/ta-da | User Interface - UI/Pop Ups/TOONPop_Cartoon pop.wav |
| Bug/glitch | User Interface - UI/Errors/UIGlitch_Error glitch.wav |
| Transition | Transitions/Swish/SWSH_Fast swish.wav |
| Success | User Interface - UI/Alerts and Notifications/UIAlert_Game success.wav |
| Comedy | User Interface - UI/Pop Ups/TOONPop_Funny pop up.wav |
The Workflow
Phase 1: Capture (Always-On)
Ensure OBS replay buffer is running during development:
- Start buffer:
Cmd+F9
- Save moment:
Cmd+F10 (saves last 5 minutes)
- Clips save to:
devlog/sessions/raw/
Phase 2: Script Voice Lines
When user describes a captured moment:
- Understand the moment - Ask what happened, why it's interesting
- Suggest 3-5 voice lines - Short bursts (5-10 seconds each)
- Hook line first ("So I found a bug...")
- Description/context
- The turn/realization
- Conclusion/payoff
- Present via review skill - Always use
/review to show voice lines
- Iterate - Adjust based on feedback until approved
Example voice line structure:
line_01: "So I found a bug in my game..." (hook)
line_02: "Look at this." (show)
line_03: "But honestly? It looks kinda cool." (turn)
line_04: "I think I'm keeping it." (payoff)
Phase 3: Record Voice Lines
Option A: Record Freely + Auto-Order (Recommended)
Just record all lines naturally, then let Claude match them to the script:
bash
1# 1. User records however they want (multiple files, any order)
2# Save to: devlog/sessions/YYYY-MM-DD/raw-voice/
3
4# 2. Claude creates script file from approved voice lines
5cat > /tmp/script.txt << 'EOF'
6So I found a bug in my game...
7Look at this glitch.
8But honestly? It looks kinda cool.
9I think I'm keeping it.
10EOF
11
12# 3. Auto-order (uses whisper if available, else Claude reviews manually)
13./devlog/bin/order-audio.sh ./raw-voice/ /tmp/script.txt ./voice/
14
15# 4. Review mapping, then apply:
16python3 devlog/bin/apply-audio-mapping.py ./raw-voice/audio_mapping.json ./raw-voice/ ./voice/
17
18# 5. Process:
19./devlog/bin/process-voice.sh --all
Option B: Single Recording + Split
Record all lines in one take with pauses:
bash
1./devlog/bin/split-audio.sh recording.wav devlog/sessions/YYYY-MM-DD/voice/
2./devlog/bin/process-voice.sh --all
Option C: Guided Prompts
bash
1./devlog/bin/record-voice-batch.sh /tmp/voice-lines.txt
2./devlog/bin/process-voice.sh --all
Option D: Individual Recording
bash
1./devlog/bin/record-voice.sh line_01
2./devlog/bin/record-voice.sh line_02
3./devlog/bin/process-voice.sh --all
Phase 4: Assemble Video
Create the manifest mapping voice lines to video clips:
- Check available clips:
ls devlog/sessions/raw/
- Get clip durations:
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 <clip>
- Suggest SFX from
devlog/sfx/ based on content
- Create manifest at
devlog/sessions/YYYY-MM-DD/meta/<name>.json
- Present manifest via review skill for approval
Manifest structure:
json
1{
2 "fps": 30,
3 "segments": [
4 {
5 "voice": "../voice/line_01_processed.wav",
6 "media": "../../raw/replay_001.mp4",
7 "mediaStartTime": 0,
8 "duration": 3.0,
9 "subtitle": "So I found a bug...",
10 "sfx": "/path/to/sfx.wav",
11 "sfxVolume": 0.5,
12 "sfxOffset": 0.3,
13 "transition": "fade",
14 "kenBurns": "zoom-in",
15 "textAnimation": "pop"
16 }
17 ],
18 "style": {
19 "subtitlePosition": "bottom",
20 "showSubtitles": true,
21 "accentColor": "#6366f1"
22 },
23 "upload": {
24 "caption": "Caption here\n\n#gamedev #indiedev",
25 "platforms": ["tiktok", "x"]
26 }
27}
Transitions & Effects Reference
Media Transitions (transition field) - how segment enters:
| Value | Description | Best For |
|---|
fade | Opacity crossfade (default) | Most segments |
cut | Hard cut, no transition | Emphasis, surprise |
slide-left | Slides in from right | Topic change |
slide-right | Slides in from left | Flashback |
slide-up | Slides up from bottom | Reveal |
slide-down | Slides down from top | Drop/fall |
zoom-in | Zooms in from small | Impact moment |
zoom-out | Starts big, shrinks | Dream/memory |
wipe-left | Horizontal wipe | Scene change |
blur | Blur in/out | Soft transition |
Ken Burns (kenBurns field) - camera motion during segment:
| Value | Description | Best For |
|---|
zoom-in | Slow zoom in (default) | Building tension |
zoom-out | Slow zoom out | Reveal context |
pan-left | Pan right to left | Following action |
pan-right | Pan left to right | Following action |
pan-up | Pan bottom to top | Ascending |
pan-down | Pan top to bottom | Descending |
none | Static, no motion | Still moments |
Text Animation (textAnimation field) - subtitle style:
| Value | Description | Best For |
|---|
pop | Word-by-word bounce (default) | TikTok style, emphasis |
typewriter | Character by character | Code, hacker vibe |
slide-up | Words slide up | Clean, professional |
wave | Wavy motion across words | Playful, quirky |
fade | Simple fade in | Subtle |
none | Static text | No animation |
Recommended combos for variety:
- Hook:
transition: "fade" + kenBurns: "zoom-in" + textAnimation: "pop"
- Reveal:
transition: "zoom-in" + kenBurns: "zoom-out" + textAnimation: "slide-up"
- Comedy:
transition: "slide-left" + kenBurns: "pan-right" + textAnimation: "wave"
- Punchline:
transition: "blur" + kenBurns: "pan-left" + textAnimation: "pop"
Phase 5: Preview in Remotion Studio
Always preview before rendering:
bash
1./devlog/bin/preview.sh devlog/sessions/YYYY-MM-DD/meta/<name>.json
This opens Remotion Studio where user can:
- Preview the full video
- Adjust segment timings
- Check subtitle sync
- Verify SFX placement
When satisfied, close Studio (Ctrl+C) and proceed to render.
Phase 6: Render
After preview approval:
bash
1./devlog/bin/render.sh devlog/sessions/YYYY-MM-DD/meta/<name>.json
Output goes to: devlog/sessions/YYYY-MM-DD/out/<name>.mp4
Phase 7: Upload
bash
1./devlog/bin/upload-helper.sh devlog/sessions/YYYY-MM-DD/meta/<name>.json
This:
- Opens TikTok and X upload pages
- Copies caption to clipboard
- Opens video in Finder
Remind user to add TikTok trending sound!
Key Commands
| Action | Command |
|---|
| New session | ./devlog/bin/new-session.sh |
| Auto-order audio | ./devlog/bin/order-audio.sh <audio_dir> <script.txt> |
| Split batch audio | ./devlog/bin/split-audio.sh <input.wav> <output_dir> |
| Record voice (guided) | ./devlog/bin/record-voice-batch.sh <lines.txt> |
| Process voice | ./devlog/bin/process-voice.sh --all |
| Preview video | ./devlog/bin/preview.sh <manifest.json> |
| Render video | ./devlog/bin/render.sh <manifest.json> |
| Upload helper | ./devlog/bin/upload-helper.sh <manifest.json> |
Audio Selection Strategy
Step 1: Use Eagle MCP (preferred - 37K+ sounds)
mcp__eagle-mcp__item_query({ query: "search terms" })
→ Returns items with filePath field
→ Use filePath directly in manifest sfx field
Step 2: Auto-Selection by Content
When assembling manifest, search Eagle and pick first good match:
| Content Type | Eagle Query | Example Result |
|---|
| Hook opening | "riser tension fade in" | WHSH_Fade in whoosh.wav |
| "Look at this" | "pop bubble click" | UIClick_Bubble click.wav |
| Bug reveal | "glitch error" | UIGlitch_Error glitch.wav |
| Feature demo | "success achievement" | UIAlert_Game success.wav |
| Code showing | "typing keyboard" | CMPTKey_Mechanical keyboard.wav |
| Transition | "whoosh swish fast" | SWSH_Fast swish.wav |
| Punchline | "positive twinkle" | UIAlert_Positive twinkle accent.wav |
| Background music | "loop energetic" | (from Music folders) |
Fallback: If Eagle MCP unavailable, use local folder:
/Users/joshuashin/Projects/TexturePackerRepo/assets/Motion Fx
Important Notes
- Always preview before render - Use
preview.sh to open Remotion Studio
- Always use review skill to present voice lines and manifests
- Video files with spaces in names need re-encoding before Remotion
- Multiple clips can be combined - each segment can reference different media
- Caption copied to clipboard after render completes
Content Tips
- Hook in first 3 seconds
- Mention it's YOUR game early
- Tell stories, not features
- Target 30-60 seconds total
- Add SFX sparingly - enhance, don't overwhelm