Local-first · agent-native · spec-driven
Brief in. On-brand everything out. Slides are one projection of a SceneGraph; the same source also targets video, GIF, and a landing page.
design-system.md: color, type, layout + taglines, messaging, voicedeck.md + design-system.md
│ parse (remark-style: frontmatter + ::: directives)
▼
SceneGraph ← canonical, target-agnostic IR
│ project: slides (narration → notes, {.step} → fragments)
▼
index.html ← self-contained: theme + runtime inlined, deep-linkable, Cmd-P → PDF
autopresenter render deck.md --target slides -o dist/
::: show → shown, never spoken::: say → spoken, never shown{.step} → click-to-reveal fragments::: scene { id=growth, layout=stat }
# 30s
Render a 60-second deck in under thirty seconds.
::: show {.step}
- One source
- Three targets
:::
:::
::: html for anything else"color": {
"brand": "#7c6cff",
"accent": "#3ee6c0",
"bg": "#080a14"
}
Generated fully offline. One HTML file, zero runtime dependencies, no server to present. The local store stays the source of truth; the cloud tier is opt-in.
# author or patch the brief, generate the system, render the deck
autopresenter design-system generate brief.md # → design-system.md
autopresenter render deck.md --target slides -o dist/
# render emits a JSON report for the agent to self-check
{ "target": "slides", "scenes": 12, "fragments": 18, "output": "dist/.../index.html" }
Brief in. On-brand everything out.
Reproduce this deck: node src/cli.ts render examples/autopresenter/deck.md --target slides Press S for speaker notes, O for the overview, P to export a PDF.