User documentation site for Open Chat Studio.
Built with Zensical (MkDocs-compatible), Python 3.13+, managed with uv.
uv sync --locked # Install / sync deps; fails if uv.lock is stale
uv run zensical serve # Local dev server (auto-reload)
uv run zensical build --clean # Same build CI runs — fails on broken refs
uv run pytest scripts/tests # Run the (small) test suite for scripts/
uv run prek run markdownlint-cli2 --all-files # Run the pre-commit checks for markdownDo not invoke mkdocs directly — the project uses Zensical, which reads mkdocs.yml
for compatibility but ships its own CLI.
docs/— All site content (markdown). Navigation declared inmkdocs.yml.mkdocs.yml— Site config (theme, plugins, nav). Zensical-compatible MkDocs format.overrides/— Theme template overrides (Material for MkDocs).src/ocs_docs/openapi_to_docs.py— Converts the OCS OpenAPI schema into markdown underdocs/api/. Run by theupdate-api-docsworkflow;docs/api/is generated — do not hand-edit.src/python_node/— Source for Python-node API reference (rendered viamkdocstrings).scripts/update_confluence_release.py— Publishes release rows to a Confluence page (used by theupdate-confluenceworkflow)..github/workflows/update-changelog.yml— Listens forrepository_dispatchfrom the OCS repo and opens a PR updatingdocs/changelog.md(ordocs/chat_widget/changelog.mdfor widget PRs) using.github/templates/changelog-instructions.md.
Each top-level docs folder has a strict content contract — keep content in the right place:
| Folder | Audience | Contains | Must not contain |
|---|---|---|---|
tutorials/ |
First-time users | Guided, end-to-end walkthroughs | Advanced config, code, references |
how-to/ |
All users | Task-focused step-by-steps | Deep code snippets, architecture |
concepts/ |
All users | "What" and "why" explanations | API/code, jargon |
tech-hub/ |
Developers / advanced | API refs, code, advanced config | Concept recap (link instead) |
chat_widget/ |
Widget integrators | Widget-only reference and integration | General OCS user content |
Full guidelines: .claude/agents/zensical-technical-writer.md. Prefer the
zensical-technical-writer agent (via /write-docs) for non-trivial doc work.
- Default base =
main. Most doc changes targetmain. - Widget docs base =
widget-develop. Anything underdocs/chat_widget/(and its assets) ships on the widget release cadence. Branch from and PR intowidget-develop; release managers merge it back tomainduring the widget release. - Don't mix widget and non-widget changes in one PR — they go to different bases.
docs/changelog.md (main) and docs/chat_widget/changelog.md (widget) use date-grouped
entries with category prefixes: **NEW**, **CHANGE**, **BUG**, **MIGRATION**.
Changelog updates are largely automated — the update-changelog workflow opens a PR
when an upstream OCS PR is merged. Manual edits are fine but should match the existing
style.
Use /create-release <tag> <title> to draft a GitHub release from the diff of
docs/changelog.md since the last release. The command groups entries by category
and produces a markdown summary. Releases are created as drafts.
strict: trueinmkdocs.ymlmakeszensical buildfail on broken internal links without needing--strict, so a plain local build matches CI.servestill only warns (it keeps serving so the dev loop isn't broken) — watch its console output, or run a build before pushing if you've added cross-references.docs/api/is regenerated from OpenAPI by theupdate-api-docsworkflow. Don't hand-edit.uvself-ignores.venv/and.cache/by dropping.gitignorefiles inside them, so the repo.gitignoredoesn't need entries for those.- Markdown linting runs on
markdownlint-cli2, not classicmarkdownlint-cli. Rules live
in.markdownlint.yaml, cli2 settings (includingignores) in.markdownlint-cli2.yaml.
cli2 does not read.markdownlintignore. - cli2 auto-discovers a
.markdownlint.yamlper directory and applies it to that directory's
files. A subdirectory config replaces rather than merges, so alwaysextendsthe parent to
keep the root rules.
/write-docs— Launcheszensical-technical-writeragent with proper context./create-release <tag> <title>— Drafts a GitHub release from changelog diff./review-pr— Project's PR review workflow.documentation-pr-revieweragent — Specialised reviewer for docs PRs.