CLAUDE.md — docs/
This is a Mintlify documentation site for GAIA, served at https://docs.heygaia.io.Key Commands
Structure
docs.json— single source of truth for navigation, theme, SEO, and site config. All new pages must be registered here undernavigation.tabs[].groups[].pagesor they won’t appear in the sidebar.introduction.mdx,quick-start.mdx, etc. — top-level pagesdevelopers/,self-hosting/,bots/,cli/,configuration/— section directoriesknowledge/— large programmatic SEO section (glossary, comparisons, use-cases, etc.). Hundreds of pages; don’t hand-edit en masse.snippets/— reusable MDX snippets (include via<Snippet file="..." />)images/,logo/— static assets
Skills
Always use thecopywriting skill when writing or editing any prose in docs pages. Invoke it via the Skill tool before drafting feature descriptions, explanations, onboarding copy, or any user-facing text. Do not write marketing or explanatory copy ad-hoc.
See the full skill reference table at the bottom of this file.
Writing Docs
Frontmatter (required on every page):<Card>,<CardGroup cols={2}>— feature grids<Steps>,<Step title="...">— numbered how-to steps<Tip>,<Note>,<Warning>— callout blocks<Snippet file="snippets/foo.mdx" />— shared content
docs.json are relative and extensionless (e.g., "developers/introduction" maps to developers/introduction.mdx).
Images
Always use<Frame> for images. Do not use markdown image syntax (). Use absolute paths from the project root.
- No relative paths (
../images/or./images/) — always use absolute (/images/...) - Every image must have a meaningful
altattribute (not generic like “image”)
Mintlify Reference
When making component changes or adding new Mintlify components, fetch the official docs: https://www.mintlify.com/docs/llms.txtAvailable Skills
Always invoke these via theSkill tool rather than doing the work ad-hoc:
Release Notes Image Convention
The in-app “What’s New” sidebar card and modal parserelease-notes.mdx to display releases. They don’t read the .mdx directly — they read Mintlify’s generated RSS feed (/release-notes/rss.xml) via apps/web/src/app/api/releases/route.ts, which regex-extracts the first <img> from each item’s content:encoded. To include a hero image, place an image as the very first element inside the <Update> block, before the H1 title:
- Use a bare markdown image — never wrap it in
<Frame>(or any JSX component). Mintlify strips custom components and their children out of the RSScontent:encoded, so a<Frame>-wrapped image renders fine on the docs page but is dropped from the feed entirely. The parser then finds no image and the card/modal fall back to the default wallpaper for that release. Only the bare markdownsurvives into the RSS as a plain<img>. (The page-level hero at the top ofrelease-notes.mdxis<Frame>-wrapped on purpose — it lives outside every<Update>block, so it’s never part of any RSS item.) - Images must go in
images/changelog/(not the rootimages/dir) - Name pattern:
release-{mon}-{dd}-{yyyy}.webp(e.g.release-mar-15-2026.webp) - Mintlify rewrites the relative
/images/...path to an absolutehttps://docs.heygaia.io/...URL in the feed, so the app loads it directly — no extra config needed. - The image is optional — omitting it is fine, the card will render without one
- The parser grabs only the first image in the block; any subsequent images are ignored for the card
- Don’t hand-edit the page-level hero
<img src>at the top ofrelease-notes.mdx.scripts/generate-changelog-pages.jsauto-syncs it to the newest release’s image on every run (pre-commit + CI), so the page banner always matches the latest release. Just give the newest<Update>block its hero image and the page banner follows. If the newest release has no image, the existing banner is left untouched. - The newest release’s in-block image is hidden on the page, not removed. Because the page banner already shows the newest release’s image, a rule in
style.css(.frame + .update-container … :first-child:has(img)) hides the in-block copy of only the topmost release so the image isn’t shown twice. The image stays in the MDX source — that’s what feeds the RSS, so the in-app card still gets it. Never delete the in-block image to fix the on-page duplicate; that would empty the RSS and break the card. The rule is scoped to the main page (.frame +), so sub-pages and year pages keep their in-block images.
Non-obvious Patterns
- Navigation is not auto-discovered. Adding an
.mdxfile does nothing until its path is added todocs.json. Always update both. - The
knowledge/section is programmatic SEO. It has 180+ pages across glossary, comparisons, use-cases, etc. Edits to tone or structure should be done consistently across the group, not one-off. - No build step for content. MDX is rendered by Mintlify’s cloud (or local CLI). There is no compile step to run after editing — just save and the dev server hot-reloads.
- Images go in
images/, referenced as/images/filename.webp. Mintlify serves them as static assets from the project root. docs.jsonuses$schemafor editor autocomplete — keep it present when editing.

