Type a prompt during a live interview, watch the slideshow appear. The generation IS the presentation.
Links: Tools Roadmap, Career Strategy, Level 6 — Direct Execution
Marp slides must be presented via the CLI preview window (marp -p) or HTML export opened in a browser — never through the Obsidian Marp Slides plugin. The Obsidian plugin renders inline in a note pane, which looks cramped and fights with Obsidian’s own CSS. This was originally why Marp was rejected as “not clean enough.” The browser/CLI output is dramatically better — full-screen, proper theme rendering, clean presentation mode.
During an interview, you have a Marp preview window open (watch mode). You type a prompt into Claude Code. Claude reads vault pages, writes the markdown, and slides materialize in real-time in the preview window. The interviewer watches it happen. Then you present the slides it just made. The process proves the thesis before a word is spoken.
marp -w -p ./interview-slides.md — opens preview window, watches for changes| Tool | Format | Time (10 slides) | Quality |
|---|---|---|---|
| python-pptx | .pptx | 59ms | Template-dependent — needs designed template |
| Marp CLI | .html | 1,216ms | Professional with custom theme |
| Marp CLI | .pptx | 4,866ms | Acceptable but not native PowerPoint quality |
| RevealJS | static HTML | 5,863ms | Beautiful but 68-file directory, needs server |
| Slidev | dev server | 3-5s boot | Highest quality but requires Vite, overkill for generation |
| Google Slides API | cloud | 3-8s | Requires internet + auth — too many failure modes |
The Marp concern: previous experience showed Marp slides weren’t as clean as expected in export. The issue was likely the default theme, not the tool. A custom CSS theme with professional fonts, dark background, and branded colors transforms the output. The watch mode — slides appearing as Claude writes — is a feature no other tool offers.
The python-pptx complement: for the PPTX copy the interviewer takes home, python-pptx with a pre-designed PowerPoint template produces native quality. No Marp rendering artifacts, no font substitution issues. Same content, professional delivery format.
Rejected alternatives:
| Resource | What It Is |
|---|---|
| marp-ai-slide-generator | JSON-based Marp generation with AI agents |
| freeCodeCamp: Claude Code + Marp | Workflow article — documents exactly this pattern |
| MCP Marp skill | Claude Code skill with interview phase + generation phase |
| Marp community themes | Gradient, dark, business, tech themes |
| robonuggets/marp-slides | Another Claude Code Marp skill |
Tested 2026-04-15. The full chain runs locally, no GPU required:
Marp markdown → PNG export (--images png --image-scale 2) → ffmpeg composite → MP4
What works now:
marp --images png --image-scale 2 slides.md → one PNG per slide at 2560x1440What’s left is coloring, not engineering:
Three tiers for video production:
| Tier | What | Tools | Where It Runs |
|---|---|---|---|
| 1. Narrated slideshow | Slide PNGs + timed transitions + TTS/recorded narration + background music | Marp CLI, ffmpeg | Local, seconds |
| 2. Slides + character | Tier 1 + character overlay in corner doing lip-sync | + Rhubarb, Fish Speech, composite_lipsync.py | RunPod, minutes |
| 3. Full generative | AI-generated visuals, animated transitions, dynamic scenes | + ComfyUI, AnimateDiff | RunPod GPU, minutes per clip |
Tier 2 is the sweet spot for career demos — uses the existing animation-studio pipeline and produces a format familiar from YouTube explainer channels.
Tier 1 ffmpeg command (tested):
ffmpeg -y \
-loop 1 -t <seconds> -i slide.001.png \
-loop 1 -t <seconds> -i slide.002.png \
...
-filter_complex "[0:v]fade=t=out:st=<T-1>:d=1[v0]; \
[1:v]fade=t=in:st=0:d=1,fade=t=out:st=<T-1>:d=1[v1]; \
... \
[v0][v1]...concat=n=N:v=1:a=0[out]" \
-map "[out]" -c:v libx264 -pix_fmt yuv420p -r 24 output.mp4
Per-slide timing is controlled by the -t parameter on each input. The skill should accept a timing array alongside the content.