Skip to content
Strata/Docs

Presentations

Create, edit, and present slide decks in Strata. Start with a blank deck, ask Strata Agent to draft one from your source documents, or import Markdown.

Make a presentation

Open Presentations in your workspace. Choose New deck and enter a title, or ask Strata Agent for a deck. For an AI draft, describe the topic, audience, and purpose; choose a length, theme, and source documents. Review the credit estimate and maximum credits before starting.

Switch between Deck and Document to arrange slides or edit their source and notes. In Deck, add, duplicate, reorder, or exclude slides and choose a theme. Select Present to show the deck; presenter view includes notes, the next slide, and a timer.

Start the document with YAML between --- lines. Use presentation: true for defaults, or a presentation map as below. The aspect can be "16:9", "16:10", or "4:3".

---
presentation:
  aspect: "16:9"
---
# Board review

## Results
```slide layout="bullets"
- Revenue increased
- Customer retention improved
```

Explain the figures to the audience.

The first # heading is the cover; each ## heading starts a slide. A heading alone makes a headline slide. Add one slide fence with layout="bullets" for visible bullet content, or one html fence for a custom visual. Do not combine them in one slide. Prose outside the visual is presenter notes, not slide content.

Only the first # heading is a cover. ### headings stay within the current slide. An ## heading beginning with Appendix (case-insensitive) ends the slides; later content is appendix material.

From conversation to slides

Use strata-presentation to turn the conversation into an audience, purpose, and sequence of supported claims. Read the source material and company design system before styling. Use one headline per slide, evidence in its visual, and narration in ordinary section prose. Save with edit_document and read the result back; inspect available HTML previews and report any rendering limits.

Anchor each HTML edit on a descriptive, deck-unique id. Include that id in both oldString and newString, matching one current fragment with replaceAll=false. This is a text-replacement convention, not an ID-selector API. Reread absent or ambiguous matches; do not force them with a full rewrite. Substitute the actual returned documentId in the example. Prefer small anchored edits: with replaceAll=false, a missing or ambiguous match is rejected in the serving ECS task’s in-memory Yjs replica under the API’s matching rules, which can normalize quotes, footnote markers, and whitespace. This is not an exact-byte check or a distributed compare-and-swap. Another task’s committed change may not have reached that replica; a stale anchor can match before raced WAL records are integrated during persistence. Character-level edits touch the matched region; cross-node or block edits can fall back to a Markdown round-trip and structural rewrite. No MCP body-write path accepts an expected documentVersion or guarantees safety against a concurrent editor. If the deck appears actively edited, tell the user and coordinate a pause or prepare a separate copy. Read-back confirms an observed result, not concurrency safety.

grammarVersion: 1

Document grammar

A leading YAML block with presentation: true enables defaults. A presentation map accepts only aspect (16:9, 16:10, 4:3), transition (fade, none, slide), form (slides, whole-deck), and notes (presenter, none). Defaults are 16:9, fade, slides, presenter. The YAML limit is 16 KiB. Theme is not a frontmatter setting.

In slides form, the first top-level H1 is the cover; each H2 starts a slide. H3–H6 and ordinary blocks are notes. A later H1 and its following content become preceding-section notes until the next H2, with duplicate-cover reported. Preamble attaches to the cover if present. The first H2 whose trimmed, case-insensitive text starts with appendix ends slide processing, including later headings.

The first html fence in a section is its visual; extra HTML is reported and not selected. Combining html and slide fences excludes the section. Without HTML, the first slide fence selects layout=title, statement, bullets, big-number, two-column, or image; a missing/invalid layout reports unknown-layout and defaults structurally to statement. Later slide fences are notes. With neither fence the slide is a headline-only statement. Layout belongs only to slide fences, which discard name but keep uses: a layout=image slide names the image it shows with uses, and one that declares none reports image-slide-without-source. Name declares a data source; uses on an HTML visual lists its comma-separated dependencies.

Bind drawn numbers to named json/csv/tsv/yaml blocks or tables, preferably in the appendix. HTML declares uses, reads tagged sources through strata.data.get, and redraws on strata:data. Decode by kind and format, including unavailable data; consult interactive-html. Aggregate sources to fit 128 KiB each and 256 KiB total. Give editable elements IDs and a slide comment inside the HTML fence; data-deck-headline receives the heading in an active shell. Keep readable fallback text for ordinary previews.

Create, edit, and present slide decks in Strata. Start with a blank deck, ask Strata Agent to draft one from your source documents, or import Markdown.

---
presentation:
  aspect: '16:9'
  transition: fade
  form: slides
  notes: presenter
---
# Launch

```slide layout=title
A smaller first release

Priya Raman, March
```

## Focus

```slide layout=bullets
What ships first:

- One workspace
- One integration
- Nothing else
```

Say the internal negotiation out loud; this paragraph stays a presenter note.

## The room

```slide layout=image uses=launchPhoto
Launch day, Oslo
```

## Adoption

```html
<!-- slide: adoption -->
<main id="s03-adoption" style="padding:var(--deck-padding)">
  <h1 class="deck-title" data-deck-headline>Adoption</h1>
  <p id="s03-rationale">A smaller release gives us a clear learning signal.</p>
</main>
```

## Appendix

<!-- strata:name=launchPhoto -->

![The team on launch day](launch-day.png)

```css name=deckTheme extends=strata-light
:root { --deck-accent: #1d4ed8; }
```
layoutfence
titleslide layout=title
statementslide layout=statement
bulletsslide layout=bullets
big-numberslide layout=big-number
two-columnslide layout=two-column
imageslide layout=image uses="hero"

Design systems and company themes

Find and read the company design system, then copy its CSS into one css name=theme fence. Record source and sourceVersion together using the actual document ULID and decimal version when known; both are required for provenance. Preserve an existing locked=true. The copy is local content: resolution never fetches or refreshes the source. If no company theme is available, start with strata-light.

For design files from Claude Design, Figma variables, Tailwind, or a brand guide, map background, text, accent, muted text, two font stacks, padding, and radius to the eight tokens. Put deck-specific derivations in deckTheme. Embed only authorized font files as data: URLs, with system fallbacks; preserve the glyphs the deck needs and measure CSS after encoding against 256 KiB. Report approximate colors and font substitutions.

The five deck layers, from lowest to highest, are deck-base, deck-strata, deck-company, deck-deck, and deck-slide; preview-base precedes them. Use css name=deckTheme for local overrides. Its extends wins over the company theme’s extends, then defaults to strata-light. Shipped choices are strata-light, strata-dark, strata-editorial, and strata-mono. Unknown names fall back with a finding. Inline styles still follow the ordinary CSS cascade.

Define all eight company tokens shown below in a plain top-level :root rule. Tokens in html, body, mixed selectors, or nested @media/@layer rules are not read and report theme-token-outside-root. Use var(--deck-...) in slides. Keep CSS within 256 KiB, balanced, without !important or external imports/URLs; data: assets are allowed. Foreground/background contrast must be at least 4.5:1; unsupported color expressions report unknown contrast. Duplicate theme names disable that layer. A company lock reports deck token overrides but does not prevent them from winning.

```css name=theme extends=strata-light
:root {
  --deck-bg: #ffffff;
  --deck-fg: #111318;
  --deck-accent: #1d4ed8;
  --deck-muted: #586174;
  --deck-font-heading: system-ui, sans-serif;
  --deck-font-body: system-ui, sans-serif;
  --deck-padding: 6cqw;
  --deck-radius: 12px;
}
```
tokenstrata-light
--deck-bg#ffffff
--deck-fg#111318
--deck-accent#2563eb
--deck-muted#6b7280
--deck-font-headingsystem-ui, sans-serif
--deck-font-bodysystem-ui, sans-serif
--deck-padding6cqw
--deck-radius12px
extends--deck-bg--deck-fg--deck-accent--deck-muted--deck-font-heading
strata-light#ffffff#111318#2563eb#6b7280system-ui, sans-serif
strata-dark#0b1020#f4f6fb#5cc8ff#8b93a7system-ui, sans-serif
strata-editorial#faf7f2#1f1b16#b4532a#756c61Georgia, serif
strata-mono#111111#e8e8e8#c8ff00#8a8a8aui-monospace, monospace

Sharing and exporting

Owners and editors read the full document. Viewers, commenters, and suggest-only readers receive an edition containing accepted slide headings and visuals, with ordinary notes removed. Put private narration outside visual fences. notes: none describes pane visibility, not privacy. Removing or disabling presentation settings makes the document ordinary again, so readers can receive its full body.

The edition also retains theme CSS, named JSON/CSV/TSV/YAML blocks or tables declared by accepted visuals’ uses, and the presentation settings. Resources are retained even from the appendix; in slides form its heading is retained too. These blocks are copied whole: hidden HTML, comments, scripts, and unused data fields can expose private content. Ordinary appendix prose and other frontmatter keys are omitted.

For form: whole-deck, the first top-level HTML fence before the appendix is the entire deck; headings do not create slides. The shared shell can navigate it through an authored strata.deck.registerAdapter with count(), current(), and goTo(index). Notes inside that HTML cannot be stripped: notesPrivacy is notStripped, and publication requires explicit acknowledgement. Keep confidential notes outside the HTML.

Use Export for standalone HTML, or ask your connected assistant to use export_presentation for HTML or PDF. Download links last fifteen minutes. PDF uses the document owner's capture allowance; HTML is unmetered. Presenter notes are removed from slide decks. Whole-deck HTML export is rejected because private notes cannot be reliably removed. PPTX export is not supported.

Bringing an existing deck

Preserve existing files and inspect their format. For UTF-8 Markdown, measure bytes, call edit_document with action=presignUpload and contentLength plus documentId or title/folderId, PUT the exact bytes with all returned requiredHeaders, then finalizeUpload with uploadId. Read back after finalization. Adapt HTML decks into a whole-deck Markdown copy and check sandbox dependencies and internal notes. Office-file upload converts PPTX/PDF/DOCX into ordinary documents; it does not promise original slide fidelity. Do not send those binary files to the Markdown upload flow. Using an existing documentId requests full replacement at finalizeUpload; the PUT only stages bytes. Neither finalizeUpload nor action=write accepts an expected version, so replacement can overwrite collaborator changes without a version-conflict error. Prefer small, uniquely anchored edit calls with replaceAll=false; they check only the serving task’s replica, and block edits can fall back to a structural rewrite. No MCP body-write path guarantees safety against a concurrent editor. If the deck appears actively edited, tell the user and coordinate a pause or prepare a separate copy. If replacement is unavoidable, reread immediately before finalization, compare documentVersion with the version used to prepare the file, and abort if it changed. An unchanged version narrows the race window but does not close it.

Splitting an HTML deck is an agent-authored transformation, not an import tool. Require five checks: one section per slide; local styles without linked stylesheets; scripts whose DOM access is confined to that section, apart from identified navigation; self-contained assets; and a headline per section. If script isolation cannot be established, retain whole-deck and name the script. For an eligible requested split, create a separate document, map the first section to the H1 cover, preserve IDs and sections, and report unverified rendering fidelity.

Validation and repair

Run validation before presenting or exporting. validate_presentation checks layout, contrast, data bindings, structure, and themes, and stores captures. Each call checks at most two slides at one viewport; continue with next while status is more, keeping the selection unchanged. Validation uses one capture per slide per viewport, with no repeat charge for the same render key in the billing cycle. Review findings, repair the source, and check again.

{
  "action": "edit",
  "documentId": "<documentId>",
  "oldString": "<strong id=\"s02-target\">84%</strong>",
  "newString": "<strong id=\"s02-target\">87%</strong>",
  "replaceAll": false
}
codeTrigger and repairstrataDocumentation
duplicate-coverA later H1 starts notes instead of another cover. Keep one H1; use H2 for another slide.presentation-grammar
extra-visualAn extra HTML visual is omitted. Move it into its own slide or combine the intended visual.presentation-grammar
slide-and-visualHTML and slide fences share a section, so that section is excluded. Choose one visual type.presentation-grammar
unknown-layoutThe first slide fence has no valid layout. Set one of the five listed layout names.presentation-grammar
image-slide-without-sourceA slide fence with layout=image declares no source. Add uses with the name of an image in this document, or choose one in the deck editor.presentation-grammar
unknown-themeThe selected extends name is unknown. Choose a shipped theme; the current fallback is strata-light.presentation-themes
duplicate-themeMultiple theme or deckTheme blocks disable that named layer. Consolidate to one of each.presentation-themes
theme-missing-tokenA company theme omits a required token. Define all eight in plain top-level :root.presentation-themes
theme-contrastResolved foreground/background contrast is below 4.5:1. Adjust the pair to meet that ratio.presentation-themes
theme-contrast-unknownA foreground/background color cannot be evaluated. Use literal three- or six-digit hex or integer rgb().presentation-themes
theme-importantTheme CSS contains !important, which is stripped. Remove it and use the documented cascade.presentation-themes
theme-oversizeTheme CSS exceeds 256 KiB and is omitted. Reduce its UTF-8 byte size, including embedded assets.presentation-themes
theme-external-urlAn @import or non-data: URL was found. Remove it or embed an authorized asset as data:.presentation-themes
theme-unbalancedTheme delimiters do not balance before or after normalization; the layer is omitted. Repair the CSS syntax.presentation-themes
theme-token-outside-rootA deck token is declared outside plain top-level :root. Move that declaration into :root.presentation-themes
locked-overrideA deck token overrides a locked company theme. Remove the override or agree a source-theme change; the lock only reports it.presentation-themes

Keeping a deck current

Use list_company_themes and get_company_theme to copy a verified company theme revision. One agent routine per deck watches updated document events for both the theme source and the deck, with target naming the deck and no output. It proposes anchored suggestions with baseVersion and sourceRef; it never accepts, edits, or publishes. Newer source generations supersede older pending proposals. On suggestionBaseMoved or suggestionSourceMoved, wait for the next run or rerun instead of overwriting. Other documents’ copied data remains a snapshot. An administrator provisions the Themes folder when setupRequired is true.