Catch deck errors before anyone presents
Write slides as JSON or in a Markdown dialect, and both land in one validated model. Every issue comes back at once, with its path and a fix, so people and agents correct the deck first.
- Deck model


Solution · Slides
Write a deck in JSON or Markdown and see every issue before you present. Run it on any screen with a presenter view, then print a PDF or export PPTX.
Status: in development

Try this
Use Reset to return to the starting example.
If the interactive demo cannot load, use the static preview above.
Write the deck as JSON or in the deck Markdown dialect. Both produce the same deck, and Markdown round-trips.
Package: @texuli/deck
One model checks every slide and reports every issue at once, with a code, a path and a fix. It never throws.
Package: @texuli/deck
A framework-free engine runs slides, steps, vertical stacks, hash routes and the presenter protocol, with no DOM.
Package: @texuli/deck
The Svelte stage scales a fixed canvas to any screen, with keyboard and touch, an overview, a presenter window and layouts.
Package: @texuli/slides
Print one page per slide to PDF from the browser, or export an editable PPTX that reports what it leaves out.
Package: @texuli/slides
Solution
Slides
Packages
@texuli/slidesPresentation stage, layouts, print and PPTX exportSubpaths: ./stage · ./layouts · ./export@texuli/deckFramework-free deck model, codecs, navigation engine and authoringSubpaths: ./model · ./engine · ./markdown · ./authoring · ./templatesBuilt on
@texuli/player (Blueprint player)@texuli/catalog (Agent catalog)@texuli/blocks (Content blocks)@texuli/media (Media)@texuli/tokens (Theme tokens)@texuli/core (Texels and the URL policy)
Build with Slides
pnpm add @texuli/deck @texuli/slidesimport { parseDeck } from '@texuli/deck/model';
const result = parseDeck({
"formatVersion": 2,
"meta": {
"title": "Quarterly update",
"locale": "en"
},
"style": {
"theme": "ocean",
"transition": "slide"
},
"slides": [
{
"id": "opening",
"layout": "title-hero",
"props": {
"title": "Quarterly update",
"subtitle": "Fictional numbers for Northwind"
}
},
{
"id": "adoption",
"layout": "big-stat",
"props": {
"number": "82%",
"label": "of releases shipped on the day they merged"
}
}
]
});
if (result.ok) {
console.log(result.deck.slides.length);
}
import { parseDeckMarkdown } from '@texuli/deck/markdown';
import { validateDeckBlock } from '@texuli/slides/stage';
const result = parseDeckMarkdown("---\ntitle: Quarterly update\nlocale: en\ntheme: ocean\n---\n\n<!-- .slide: id=opening layout=title-hero -->\n\n# Quarterly update\n\nFictional numbers for Northwind\n", {
validateBlock: validateDeckBlock,
});
if (result.ok) {
console.log(result.deck.slides.map((slide) => slide.id));
}
<script lang="ts">
import '@texuli/slides/styles.css';
import { DeckStage } from '@texuli/slides/stage';
const deck = {
"formatVersion": 2,
"meta": {
"title": "Quarterly update",
"locale": "en"
},
"style": {
"theme": "ocean",
"transition": "slide"
},
"slides": [
{
"id": "opening",
"layout": "title-hero",
"props": {
"title": "Quarterly update",
"subtitle": "Fictional numbers for Northwind"
}
},
{
"id": "adoption",
"layout": "big-stat",
"props": {
"number": "82%",
"label": "of releases shipped on the day they merged"
}
}
]
};
</script>
<DeckStage {deck} />
Verified by apps/website/tests/solutions/slides-quickstart.test.ts
Mount DeckStage with a fixture deck, step by step in the Slides docs.
Add @texuli/deck and @texuli/slides from npm (pre-1.0, in development).
Agents write a deck as JSON or Markdown, check it with the deck model, and present it with DeckStage. The packages are in development.
deck.rundeck.run: In developmentMCP operation: lint, inspect and convert a deck on the shared v2 model.
layout-decklayout-deck: In developmentCatalog layout for an agent-emitted deck (the main landmark).
deck-slidedeck-slide: In developmentCatalog layout for one slide inside a deck.
skills/texuli/build-ui/references/decks.mdskills/texuli/build-ui/references/decks.md: In developmentSkill reference for JSON and Markdown decks, DeckStage, print and PPTX.
Svelte 5 packages published on npm (pre-1.0).
Kotlin Multiplatform renderer on the JVM, built in this repository.
Native renderer target.
Native renderer target.
Write decks as JSON or Markdown and present them in the browser.

