Deck format

Source of truth: shared/deck.ts. Every object is strict: unknown keys fail validation.

Deck

FieldTypeRules
version1Required, literal 1.
titlestringRequired, 1–200 chars. Shown in lists and the summary.
themeobjectOptional. Default { background: "#10131a", foreground: "#f4f1ea", accent: "#ff7a45", muted: "#9aa3b2" }. Prefer { "preset": "<name>" }.
slidesSlide[]Required, 1–200. Slide ids unique.

Theme

Colors are hex: # + 3–8 hex digits.

FieldTypeRules
preset"estudio" | "editorial" | "neon" | "papel" | "brutalista" | "corporativo"Optional. Brings colors, fonts (display/body/mono), slide background (gradient and/or pattern), card style, heading style and chart palette. See themes.md.
backgroundhexRequired without preset; optional override with one.
foregroundhexRequired without preset; optional override with one.
accenthexRequired without preset; optional override with one.
mutedhexOptional.
surfacehexOptional. Overrides the card/surface color (cards, card: true text, donut gaps).
  • With a preset, override colors only when the user's brand requires it: { "preset": "corporativo", "accent": "#0057b8" }.
  • Without a preset the old rules hold exactly: background, foreground, accent required, muted optional.

Slide

FieldTypeRules
idstringRequired, [A-Za-z0-9_-]{1,40}, unique in the deck.
layout"free" | "quiz"Optional, default free. "quiz" requires quiz, and quiz requires "quiz".
backgroundhex | BackgroundOptional, overrides the theme background. See below.
notesstringOptional (always set it), max 5000 chars. Presenter-only; never sent to the audience.
elementsElement[]Required (use [] on quiz slides), max 60. Element ids unique per slide.
quizQuizOnly with layout: "quiz".

Slide background object

A hex string still works ("background": "#0b0d12"). The object form (all fields optional, strict):

FieldTypeRules
colorhexSolid base color.
gradient{ "from": hex, "to": hex, "angle"?: number }Linear gradient; angle 0–360 (degrees).
imageasset srcSame rules as image src (https://… or assets/<file>, no ..). Covers the slide.
dimnumber 0–0.9Darkens the image so text stays readable. Use 0.4–0.6 under text.
pattern"dots" | "grid" | "lines" | "noise"Subtle texture over the color/gradient.
json
{ "background": { "gradient": { "from": "#1b1f3a", "to": "#0b0d12", "angle": 135 }, "pattern": "dots" } }

Omit background on most slides: the preset already supplies one. Use the object for openers, section breaks and closings.

Imported slides (live-deck import) use exactly this field: "background": { "image": "assets/slide-01.png" } with no new layout; elements such as the join qr may sit on top.

Validation messages

The CLI prints path: message, where path indexes into the JSON (slides.2.quiz.correctIndex: correctIndex must point to an option). Fix at that path and re-run.