Socrates Didn't Have a Bottom · Video Workshop (Combined Skill)
1. Select a Style
| Comic Explainer | Pixel Beat Story | |
|---|---|---|
| Directory | styles/comic-explainer/ | styles/pixel-beat-story/ |
| Best For | "Explain one thing clearly" – social sciences, current events, history: news investigations, institutions, conceptual analysis | "Tell one person's story" – social pain points: autism, Alzheimer's, left-behind children, solitary living… |
| Driver | User-recorded voiceover, word-level timeline (faster-whisper + difflib) | Music – beat/phrase grid (beats.py) |
| Aspect Ratio | Vertical 1080×1920 / 30fps | Landscape 4:3 1440×1080 / 30fps (adjustable) |
| Duration | Follows the recording (~10 min sample, 7 chapters) | 3–4.5 minutes |
| Visuals | Warm rice-paper background, Q-style color comic characters (green-screen generated, cutout), chapter cards, seals, programmatic icons | Pixel house night scene, sprite characters, talking objects, HUD counters, typewriter dialogue |
| Audio | Original voiceover (uncut) + programmatic piano music + sound effects + ducking | Music (extend/breakpoint/return) + programmatic rain/thunder ambience; music stops at the most painful point |
| Engine | node 22 + @napi-rs/canvas (render_example.js DSL) | Remotion (weilanx-claude-videos project, Ep54-example.tsx) |
| Sample | "Why Establish a State-Owned Enterprise Despite All This Data?" | "He Doesn't Say" / "He Isn't from the Stars" |
If unsure, ask the user: "This episode: Comic Explainer, or Pixel Beat Story?"
Once selected, read the full STYLE.md in the corresponding directory and follow its workflow.
2. Shared Channel Guidelines (Mandatory)
- Cover as First Frame: Every video must have a custom cover embedded as the very first frame (Comic Explainer: first 0.4s; Pixel Beat Story: frame 0). Also deliver a separate cover image.
- Watermark Integrated, No Corner Logo: "Socrates Didn't Have a Bottom" is written into signage, nameplates, app headers, window titles, end credits, etc.; the user explicitly refuses a corner logo.
- Sample Before Full Video: Comic Explainer – produce the opening through Chapter 1 (~80s); Pixel Beat Story – produce Act 1 (60–70s). Only proceed to full production after user confirms the style.
- Script Pre-Approval: The user writes the script/records audio; the agent is responsible for fact-checking (web_fetch original reports/research articles), flagging polyphonic characters, logical leaps, sensitive wording, and only then beginning production.
- Audio Baseline: The user's original audio must not be cut, rearranged, or replaced with TTS; music and sound effects must be original, programmatic, or properly licensed; placeholder tracks must be flagged for replacement with each delivery. All concatenated audio must use numpy-based equal-power crossfade (ffmpeg acrossfade on the same input will truncate).
- Loudness: Entire video at -15 LUFS, using two-pass loudnorm (
shared/loudnorm.sh), with a fade-out at the end. - Characters Must Look Good: Clean, friendly, and appealing; the user rejects ugly characters. Side characters must also be pleasant. Maintain consistent prompt skeletons for recurring characters; generate on green/solid backgrounds and then cut out (Comic Explainer:
key.py, Pixel Beat Story:cutout.py). - Self-Check with Contact Sheet Before Rendering: Generate a contact sheet and read it to check – text doesn't extend beyond the image, doesn't overlap faces, first frame is the cover, watermarks are present, key lines/keywords match the audio.
- Rendering: Use 2-core sandbox with parallel segments (concurrency per segment = 1). Write to /tmp first, then copy to workspace (faststart writing to network drive causes IO errors). Re-audio without re-rendering the video; minor changes only re-render affected frame segments, then overlay.
- Content Ethics (especially Pixel Beat Story): Do not claim AI can cure any disease. Do not romanticize or otherize vulnerable groups. Mark stories as fictional; do not use real children's private data. Cite sources and years for data in the end credits.
3. Directory Structure
SKILL.md ← This file (style selection + shared guidelines)
shared/loudnorm.sh Two-pass loudnorm
styles/comic-explainer/ 【Comic Explainer】
STYLE.md Style specs, layout coordinates, animation DSL, alignment and mixing workflow
templates/ lib.js render_example.js audio.py wh.py align2.py key.py mux.sh
examples/ Cover/frame sample, character examples, script format (# heading / # chapter markers)
styles/pixel-beat-story/ 【Pixel Beat Story】
STYLE.md Style, script formula, beat-sync rules, music shaping, layout, QA
references/ story.md layout.md
scripts/ beats.py music_tools.py sfx.sh cutout.py contact.sh stills.mjs render.sh mux.sh
template/ Ep54-example.tsx ep54-music-ops.json ep54-script-example.md assets/
4. Environment
- General: ffmpeg ≥6, python3 + numpy scipy pillow; Chinese fonts.
- Comic Explainer: node 22 +
@napi-rs/canvas; faster-whisper (feed numpy arrays, not file paths); font LXGW WenKai →fonts/wk.ttf.lib.jsalso requiresassets/,map/, andheads.json(head crop table{name:[cx,cy,size]}) in the project directory – create these for new projects. - Pixel Beat Story: Remotion project (weilanx-claude-videos, MIT; Remotion free for individuals/teams ≤ 3 people); Noto Sans/Serif SC. In the sandbox, prefix every node command with
export NODE_OPTIONS=--max-old-space-size=4096and use./node_modules/.bin/remotion(not npx).
5. Delivery Script
Communicate in a single message: video duration, two or three highlights (Comic Explainer: chapters and key visuals; Pixel Beat Story: beat-sync design details), whether music is placeholder, and ask what adjustments are desired. Attach the final mp4 + cover image.