> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nineninesix.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# CLAUDE

# Nineninesix docs — Mintlify

This repo is the source for the **Nineninesix** documentation site, built with
[Mintlify](https://mintlify.com) and deployed from the connected GitHub repo.
Pushes to `main` trigger an automatic build and deploy; PRs get preview builds.

## Layout

```
docs.json                 # site config + navigation (root)
favicon.svg               # referenced by logo + favicon
index.mdx                 # Introduction (landing page)
quickstart.mdx
authentication.mdx
rate-limits.mdx
sdks.mdx
errors.mdx
changelog.mdx
api-reference/
  speech.mdx              # Create Speech (narrative)
  voices.mdx              # Voices (narrative)
  websocket.mdx           # WebSocket Streaming (narrative + AsyncAPI playground)
  openapi.json            # OpenAPI 3.1 spec — auto-generates REST endpoint playgrounds
  asyncapi.yaml           # AsyncAPI 3.0 spec — powers the WebSocket "Connect" playground
```

* Pages are **`.mdx`**. Nav `pages` values omit the extension and mirror the
  file tree (`api-reference/speech` → `api-reference/speech.mdx`).
* Every page needs frontmatter with at least `title` (required) and
  `description`.
* The Speech/Voices groups set `"openapi": "api-reference/openapi.json"`, so
  Mintlify auto-generates an interactive page per REST endpoint (listed in
  `pages` as `"POST /tts/bytes"` etc.) alongside the narrative pages.
* `api-reference/websocket.mdx` binds the AsyncAPI channel via frontmatter
  (`asyncapi: "/api-reference/asyncapi.yaml tts"`), which renders the
  interactive WebSocket **Connect** playground. This is the reason for using
  Mintlify over Documentation.ai / Apidog — it's the platform that supports an
  AsyncAPI-driven WebSocket playground on a git-backed MDX site.

## Mintlify component conventions

Use Mintlify components:

* Admonitions: `<Info>`, `<Warning>`, `<Tip>`, `<Note>`, `<Check>`.
* Card grids: `<CardGroup cols={2|3|4}>` wrapping `<Card title=… icon=… href=…>`
  (description is the child text). Icon names resolve against Font Awesome by
  default (the ones in use — rocket, key, code, box — also exist in Lucide).
* Tabbed code: `<CodeGroup>` around fenced blocks, where each block's **title
  meta string** becomes the tab label — e.g. ` ```python Python `.

Config lives in `docs.json`: `theme`, `name`, `logo`, `favicon`, `colors`,
`navbar.primary`, `navigation.tabs[].groups[].pages[]`, `seo`. REST specs are
referenced with a group-level `openapi`; AsyncAPI specs with a page-level
`asyncapi` frontmatter (or a group-level `asyncapi`).

## Source of truth / syncing

Wording originates from `content/docs/*.mdx` in the main app repo (fumadocs).
These files are the Mintlify conversion of that content. When app docs change,
re-apply the component mapping above. Current content reflects **API v0.3.0**
(see `changelog.mdx`).

fumadocs/Mintlify component mapping used during conversion:
`<Info>`↔`<Callout kind="info">`, `<Warning>`↔`<Callout kind="alert">`,
`<CardGroup>`↔`<Columns>`, ` ```lang Title `↔`<CodeGroup tabs="…">`,
`docs.json`↔`documentation.json`. (The right-hand side is the interim
Documentation.ai form this repo previously used — kept here for reference.)

## WebSocket / AsyncAPI notes

* WebSocket cannot be modelled in OpenAPI, so `/tts/websocket` lives in a
  separate `asyncapi.yaml` (AsyncAPI 3.0). Keep the send frame
  (`GenerationRequest`) and receive frames (`chunk`/`done`/`error`) in sync with
  the `/tts/bytes` request schema in `openapi.json`.
* Streaming endpoints (`/tts/sse`, `/tts/websocket`) are `raw`-only; only
  `/tts/bytes` accepts `wav`.

## Verify before pushing

* Assumed dashboard host `https://nineninesix.ai` and API base
  `https://api.nineninesix.ai`; contact email `ulan@nineninesix.ai`.
* Confirm the AsyncAPI frontmatter reference (`asyncapi: "/api-reference/asyncapi.yaml tts"`)
  renders the WebSocket playground in the Mintlify preview build; adjust the
  channel token (`tts`) if Mintlify expects an operation id instead.
