Animated deck
Timed reveals, transitions and stage direction. Runs in the browser at 60fps.
Narro is a React library for narrative, built for you and your coding agent. A deck is source: your agent writes it, narro check tells it what is wrong, and the same file renders as an animated presentation, a static deck, a PDF, or a video.
npm create narro@latest my-storyWorking through an agent? Point it at getnarro.com/llms.txt — the dialect, every valid name, and the command that checks its work.
# We shipped the wrong thing. <!-- notes: Six weeks in… --> ---
Six weeks in, the roadmap was fiction. Here is what it cost us.
AI-first
A deck is source, so an agent can write one — and then, unlike a slide editor, actually check its work. Narro publishes the documentation, the closed sets of valid names and the component types as machine-readable files, and ships the loop that turns a wrong deck into an error message.
Read https://getnarro.com/llms.txt, then write
the Q3 review to deck.md and run
`npx @getnarro/cli check deck.md --fit`
until it passes.No plugin, no configuration. The docs are tested this way too: an eval hands a model llms.txt and nothing else, then puts the deck it writes through narro check and narro build.
One source. Six destinations.
Timed reveals, transitions and stage direction. Runs in the browser at 60fps.
Same story, built to files you can host anywhere or hand over.
Point it at a markdown deck. Headings become slides, frontmatter becomes props.
Slides are components. Hooks, state, effects, your own charts and canvases.
Frame-accurate capture to MP4. Ship the same story as a launch film.
One page per slide, every fragment revealed. The version that gets forwarded.
The primitives
Narro ships the beats a story is made of, so pacing is something you write down instead of something you hope for on the day.
A slide that holds keeps the room on the problem.
<MotionStep> lands the answer on your cue.
Silence you can schedule, in milliseconds.
Break your own grid on purpose, once.
The ask, and where it leaves them.
Examples
npm i @getnarro/core @getnarro/cliAdds @getnarro/core and the CLI. React 18+ and Node 20+.
import { Motion, Notes, Presentation, Slide }
from '@getnarro/core';
import { Heading, Text } from '@getnarro/shared-ui';
export default function Story() {
return (
<Presentation aspectRatio="16:9">
<Slide id="intro">
<Heading>We shipped the wrong thing.</Heading>
<Notes>Slow down here.</Notes>
</Slide>
<Slide id="fix">
<Motion effect="slide-up" delay={0.8}>
<Text>Here is what we learned.</Text>
</Motion>
</Slide>
</Presentation>
);
}narro dev story.tsx
Opens the stage with hot reload, speaker notes and a presenter clock.
narro build narro export --pdf narro export --to pptx
Same source, every artefact. Nothing to re-lay-out by hand.
The root of a story. Owns navigation, routing and the viewport scaling that keeps a deck legible from a laptop to a projector.
One frame of the story. Any React tree inside, including your own components.
Timing components. They read the slide's activation state, so a beat behaves the same on stage, in a static export and under a video render.
Read and drive the story from inside your own components.
One binary for the whole loop: author, check, present, export.
Front matter maps onto deck and slide props, so a markdown deck can grow into a React one without a rewrite.
---
title: Q4 roadmap
theme: default
aspectRatio: "16:9"
---
# We shipped the wrong thing. {.text-7xl}
- Six weeks
- Two rewrites
- One good lesson
<!-- notes: Lead with the cost, then the lesson. -->