Introduction
Deckard is a React presentation framework for Next.js. Slides are components, the canvas is a fixed 1920x1080, and the look is a theme you can eject.
Deckard builds presentations out of React components. A slide is a body and some metadata, the deck is an array of those, and everything the audience sees is painted inside one fixed 1920x1080 canvas that scales to whatever screen it lands on.
That last part is the trade. You give up responsive layout inside a slide and you get back certainty: the deck looks the same on your laptop, the venue projector, a phone, and in the exported PDF. Only the scale changes.
Who it is for
People who already write React and would rather not leave it to make slides. If a slide needs a live chart, a running demo, a table pulled from an API, or a code sample with real syntax highlighting, it is a component like any other component, and it awaits its own data before it renders.
If your deck is bullet points and a photo, Deckard will do that too, but so will Keynote, and Keynote will not ask you to run pnpm install.
What a deck looks like
import type { SlideDefinition } from "@thebuilder/deckard-core"
import { FocusSlide, HeroSlide, StatGrid } from "@/app/slides/blocks"
const quarterly = [
{ value: "6.2s", caption: "Median build time" },
{ value: "0", unit: "%", caption: "Slides fixed after export" },
] as const
export const slides: SlideDefinition[] = [
{
slug: "intro",
title: "Deckard",
body: <HeroSlide eyebrow="A talk" />,
},
{
title: "The numbers",
notes: "Pause here. The middle figure is the one they will ask about.",
body: (
<FocusSlide>
<StatGrid items={quarterly} />
</FocusSlide>
),
},
]
import { defineDeck } from "@thebuilder/deckard-core"
import { phosphor } from "@thebuilder/deckard-themes"
import { slides } from "@/deck/slides"
export const deck = defineDeck({
description: "What we shipped and what it cost.",
footer: { mode: "visible" },
header: { brand: "Acme", href: "/", meta: "March 2026", mode: "auto" },
slides,
theme: phosphor,
title: "Q1 review",
})
The array is the deck order. defineDeck resolves it: every slide gets an id, a number, a URL, and its chrome defaults filled in. Nothing reorders your array, so moving a slide in it is the only way to move it in the deck.
The packages
@thebuilder/deckard-core
The deck contract and the runtime: defineDeck, the canvas, the slide
shell, presenter mode, and the Next.js route adapters.
@thebuilder/deckard-themes
The built-in presets. A deck imports one and hands it to defineDeck, and
can eject it into its own files later.
@thebuilder/deckard-cli
The deckard binary: scaffold a deck, check that it fits, screenshot it,
export it to PDF.
Slide blocks are the other piece, and not a package. They install into your app as source through a shadcn registry, and you edit them from then on.
Where to go next
Quickstart
Scaffold a deck, run it, change a slide.
Writing slides
Blocks, inline slides, file-per-slide modules, discovery.
Slide patterns
Choose a complete slide recipe by what the slide needs to do.
The canvas
What a fixed 1920x1080 means for the CSS inside a slide.
Theme gallery
Every built-in as a live slide canvas, painted by its own stylesheet.