Document Player

Watch a long document instead of reading it.

For a document that has a presentation, the viewer shows a Play button. It opens a full-screen, narrated slideshow of the document's summary, on the web and in the native app.

This page has no screenshot of the Player on purpose. A presentation costs money to generate (a language model plans it, an image model draws it, and a voice narrates it), so the fleet showcase describes the Player in words rather than generating one for a capture.

How a presentation is made

Plan, make the media, assemble.

Generation runs only on the workstation, never in the production service, and only for documents in collections that are enabled for it.

  1. Plan

    A language model reads the document's Markdown and plans a short sequence of scenes, with a limit on how many get a moving clip.

  2. Make the media

    Each scene gets a still image, the hero scenes get short clips, and every scene gets narration.

  3. Assemble

    The scenes become one manifest, checked against its schema and sealed with an integrity hash, then published all or nothing.

  4. Play

    The web and native players stream the media from Lectern and verify each asset's hash before showing it.

The rules it keeps

Open format, capped cost, and no hotlinking.

An open manifest
A presentation is a manifest in a standalone PubMark profile, org.renkara.chirp.player/0.1, written as canonical JSON with whole-number milliseconds. It is not tied to Lectern, so another producer can emit the same format and any conforming player can play it.
A spend cap
Each run is estimated first, and a hard per-document cap stops it before any money is spent. Runs are idempotent: unchanged text with the same settings regenerates nothing.
Assets by reference only
The manifest names its media by identifier, and players fetch them from the Lectern host and check each hash. A conforming player cannot be pointed at media on someone else's server.
Seeking and resume
Media streams with byte-range support so the native player can seek, and the native app remembers where you stopped and supports Handoff between devices.