Loading...
Loading...
Make explainer reels and deterministic motion graphics with Psychopomp: walkthrough videos of pull requests, code changes, protocols, or lifecycles, with GPU Stage choreography, callouts, rolling numbers, sequence diagrams, animated diffs, and optional ElevenLabs or Fish Audio narration.
npx skill4agent add kitlangton/psychopomp psychopompscenes/pr-walkthroughsrc/flagship.rssrc/stop_stage.rssrc/lib.rsSCENE_PLANS.mdCONTEXT.mdAGENTS.mdgh pr diffgh pr viewscenes/<name>/narration/script.json<slug>-before<slug>-after<slug>-code--draftsayengine: "elevenlabs"eleven_v4engine: "fish"{
"engine": "elevenlabs",
"model": "eleven_v4",
"voice": "<elevenlabs-voice-id>",
"settings": { "stability": 0.5, "similarity": 0.7 },
"clips": [
{ "id": "change-before", "text": "[warm, conversational voice] ..." }
]
}# Draft (no API key required)
bun scripts/narrate.ts scenes/<name>/narration/script.json --draft
# ElevenLabs (requires ELEVENLABS_API_KEY and script.voice)
ELEVENLABS_API_KEY=... bun scripts/narrate.ts scenes/<name>/narration/script.json
# Fish Audio (requires FISH_AUDIO_API_KEY)
FISH_AUDIO_API_KEY=... bun scripts/narrate.ts scenes/<name>/narration/script.jsonscripts/narrate.ts<id>.mp3<id>.words.jsonnarration.jsonpsychopomp-mediamedia.say(id, &voice, text)media.dialoguemedia.sfxaudio.derive(Effect::pitch(..))media.finish()?media.lock.jsonPSYCHOPOMP_MEDIA=plan cargo run -p <crate>PSYCHOPOMP_MEDIA=draftPSYCHOPOMP_MEDIA=prunecargo run -p psychopomp-media -- adopt scenes/<name>/narration=scenes/<name>verify.jsonpsychopomp::scoreSCENE_PLANS.mdPlanBuildermutStageCameraCaptionCalloutRollingNumberChecklistMeterBarsSubtitlesConfettiTerminalChatChangedFilesLowerThirdLensBeat.then.also.with.on_end.after.earlystaggereachat!(scene, time => ...)Narration::readingStageElement::card|orb|beam|packet|label|ringpsychopomp::layout::PlacementStagePost::RESTRAINEDCaption::header|chip|footersfx::*.beat(id, gain_db)audio.beat(gain_db)psychopomp-mediaexplainer-motionsettle_inconnectsend.reply()hitorb_inrewindCalloutRollingNumberstage.camera()establishframefollowreleaseorbitwhipdolly_zoomChecklistMeterMeterPlan::countdownBarsConfettiSubtitlesSubtitlesPlan::from_spokenDiffkeepadd(step)remove(step)cargo run -p <crate>cargo run --release -- plan validate <reel>plan inspect <reel>bun scripts/sheet.ts <reel> t1,t2,... --theme neutral --shutter --out output/sheet.jpgPSYCHOPOMP_SHADER_DIR=crates/psychopomp-render/src/renderstage.wgslstage_post.wgslplan render <reel> out.mp4 --cue <scene-id>--range a..bcargo run --release -- plan render <reel> output/<name>.mp4 --theme neutralffprobeplan inspectcrates/psychopompplan_runtimerender#[ignore]AGENTS.mdcargo run --release -- verify baselineverify compare --expect <scenes you changed>psychopomp::mathmathlerpremapsmoothstepeasingcurveshapesrandomrender/stage.rscargo fmt --checkcargo clippy --workspace --all-targets --all-features -- -D warningscargo test --workspace