Maintain this manual
The source lives in the application repository so a behavior change and its
documentation can land together. Generated screenshots live in the sibling
lotti-docs repository and are never committed to the application tree.
Edit prose
- Edit or add the English MDX file under
docs-site/docs. - Update the matching file for every published locale under
docs-site/i18n/<locale>/docusaurus-plugin-content-docs/current. - Add a new page to
docs-site/sidebars.ts. - Update
docs-site/metadata/features.jsonwhen coverage changes. - Update the matching entries in
docs-site/metadata/surface-inventory.json. A surface becomes verified only when its current production UI, prose, and screenshot coverage have all been reviewed. - Run
make manual_check. - Review the production build locally with
make manual_serve, including the language selector and every localized route.
Validation requires every published translation tree to contain the same page paths as the English source tree. It also rejects translated page bodies that are identical to English, so new pages cannot quietly ship as untranslated copies. The public English URLs remain unchanged; other languages are published below their own versioned locale prefix.
Keep the coverage inventory authoritative
The inventory defines the V1 English-manual boundary: every Beamer page, every Settings V2 leaf or editor, and every major workflow that creates or materially changes data or cross-cutting configuration. Each entry records its owning source file and a source-text anchor. Validation fails if either disappears, which forces a route or UI change to update the manual audit instead of leaving an invisible stale row.
Coverage states have deliberately strict meanings:
- Planned means the surface is known but still lacks complete coverage.
- Documented means useful prose exists, but current production screenshots or an end-to-end accuracy review are still missing.
- Verified means the relevant feature page is verified and backed by registered production screenshots.
Run npm --prefix docs-site run coverage:complete for the release gate. It
fails until every inventoried surface is verified; ordinary incremental manual
builds continue to report the remaining counts without blocking topic-sized
commits.
Add a screenshot case
- Add or reuse a deterministic Flutter screenshot harness.
- Register the case and its four source images in
docs-site/metadata/screenshot-cases.json. - Put visible fixture copy behind
manualScreenshotText(...)for every supported locale when it is not already provided by the app localization files. - Capture every locale into
../lotti-docs; never into this repository. - Generate and validate the media manifest.
- Reference the case with
<ManualScreenshot caseId="…" alt="…" />on every language page.
Every app screenshot in an authored page must use ManualScreenshot. Direct
links to old lotti-docs images fail manual validation because they cannot
follow the global Mobile/Desktop choice or the manual's light/dark theme.
Every automated case must provide mobile-light, mobile-dark, desktop-light, and desktop-dark variants in every published locale. The manual component chooses the matching language and theme. Changing Mobile/Desktop on any image updates every screenshot immediately and persists across pages and open manual tabs.
Publish a release
Manual source is not copied for every app version. The app release tag already
preserves its exact source. CI checks out that tag, builds with
MANUAL_VERSION=<version>, and publishes an immutable static directory. The
release dropdown is a small manifest of those directories.