| slug | No | URL slug; defaults to a slugified title. | |
| audio | No | One entry per slide you synthesized, from the JSON `bisque-voice` prints on stdout. `words`, `durationMs`, `size` and `hash` map across verbatim. Optional: omit a slide (or the whole array) and its audio carries forward from the previous publish if the narration text is unchanged — otherwise that slide publishes silent and is listed in `staleSlides`. A FIRST publish with nothing to carry forward is rejected. | |
| title | No | Display title for the watch page and listings. Omit to use the title parsed from the document. | |
| assets | No | Files the document references relative to itself — fonts, images, SVG, Lottie, Rive, bundled audio cues. html-presentation/v1 requires these to be self-hosted, so a presentation that renders locally is broken once published unless they travel with it. Each gets an upload URL back alongside the MP3s; PUT them the same way. Paths must be under `assets/` — the server owns index.html, presentation.json and context.md, and the manifest owns audio/. Omit for a presentation that references nothing. | |
| handle | No | Publish under a specific channel handle you own. | |
| voiceId | No | Records what actually spoke, e.g. kokoro:af_heart for a locally synthesized Kokoro voice. No audio is generated server-side. | |
| designMd | No | Design frontmatter mapped to theme tokens. | |
| contextMd | No | Shared-with-viewer context.md. | |
| indexHtml | Yes | Full html-presentation/v1 document (the presentation-format meta gate applies). | |
| visibility | No | unlisted (the default) is shareable by link and plays in chat-embedded players; private requires the owner to sign in, so an inline chat player shows a sign-in wall instead of playing — choose private only when the user asked for it. | unlisted |
| speechSpeed | No | Must match the speed you synthesized at — it is part of the audio cache key, so changing it on a re-publish makes every slide stale instead of carrying forward. | |
| presentationId | No | Stable id for idempotent re-publishes; defaults to slug-<hash(userId:slug)>. | |
| voiceStability | No | Records the stability setting you synthesized at. No audio is generated server-side. | |