Docs
Documentation for Zapnito, a B2B SaaS platform that helps organisations run expert knowledge communities. Built with Mintlify and deployed frommain.
Audience
Our customers are organisations, not individuals. They run their own branded communities on Zapnito. Write for:- Community admins and managers (Docs tab): setting up and running a community.
- Developers (API and Webhooks tabs): integrating through the API and webhooks.
Commands
Tool versions are pinned inmise.toml (Node and pnpm). The Mintlify CLI (mint) is a dev dependency, so there is no global install. Use pnpm only; don’t use npm or yarn.
mise install: install the pinned Node and pnpm.pnpm install: install dependencies, includingmint.pnpm dev: preview locally atlocalhost:3000(mint dev).pnpm validate: validatedocs.jsonand build the docs (mint validate). Run before every commit.pnpm broken-links: find broken internal links (mint broken-links). Run before every commit.- Other CLI commands:
pnpm exec mint <command>.
allowBuilds in pnpm-workspace.yaml; only sharp is allowed. Don’t approve others without a reason.
Project structure
docs.json: all site config: theme, branding, navigation, navbar, footer. Single source of truth for navigation.mise.toml,package.json,pnpm-lock.yaml,pnpm-workspace.yaml: tooling. Commit the lockfile.*.mdxpages: content. Each page must be listed indocs.jsonnavigation or it won’t appear in the sidebar.images/: static assets, referenced with root-relative paths (/images/...).api/v1/: API pages (the API tab), starting withapi/v1/overview.mdx. One page per resource.webhooks/: webhook pages (the Webhooks tab), starting withwebhooks/overview.mdx. One page per event.
Configuration (docs.json)
- Keep it valid against the schema:
"$schema": "https://mintlify.com/docs.json"should be the first key. - Page entries in
navigationare paths without the.mdxextension and without a leading slash ("guides/setup"). - Group related pages under
groupand keep nesting shallow (tabs > groups > pages; avoid deeper unless needed). - Every tab, group and menu item gets a short, sentence-case label.
- Whenever you add, move, rename or delete a page, update
docs.jsonin the same change. - When renaming or moving a page, add a
redirectsentry ({ "source": "/old", "destination": "/new" }) so existing links and bookmarks keep working. - Keep branding values (colours, logos, fonts) in
docs.json. Don’t override them with inline styles in pages.
Writing pages
Frontmatter
Every page needs frontmatter:titleis required. Make it specific and unique; avoid generic titles like “Introduction” except for the first page of a section, and never duplicate a title across pages.descriptionis required: one sentence, under ~160 characters. It is used for SEO and link previews.- Optional:
sidebarTitle(shorter sidebar label),icon,tag(e.g."New"). Use them sparingly. - Don’t add an
# H1in the body. Mintlify renderstitleas the H1. Start body headings at##.
Style
- Task-oriented: lead with what the reader can do, then how.
- Second person (“you”), active voice, present tense, sentence-case headings.
- Short paragraphs; prefer numbered steps for procedures and bullets for lists of options.
- Use descriptive heading text. Headings generate anchors, so don’t rename them casually: that breaks inbound links.
- Name UI elements exactly as they appear in the product, in bold.
- Don’t use “click here” link text. Link text should describe the destination.
- Don’t document unreleased or unconfirmed features.
Links
- Internal links are root-relative with no extension:
[Webhooks](/developers/webhooks). No.mdx, no relative../paths, no absolute URLs to our own docs domain. - External links use full
https://URLs. - Run
pnpm broken-linksafter any link or file change.
Images and media
- Store files in
images/; reference as/images/<name>.png. - Always write meaningful
alttext. Decorative images are the only exception. - Use kebab-case, descriptive filenames (
community-branding-settings.png). Existing logo files are the exception. - Prefer
.png/.svg/.webp; keep files reasonably small. Provide light and dark variants for images with a background that clashes with the theme (the site defaults to dark mode). - Wrap images in
<Frame>when they are screenshots. - Never include real customer data, member names, emails or API keys in screenshots or examples.
Components
Use built-in Mintlify components instead of raw HTML or custom markup:
Guidelines:
- Don’t overuse callouts. More than one or two per page loses their weight.
- Don’t nest components deeply.
- Reuse repeated content with snippets (put in a
snippets/directory and import) rather than copy-pasting.
Code samples
- Always set a language on fenced code blocks (
```bash,```json,```javascript). - Add a
titleto code blocks where the filename or purpose matters. - Use
<CodeGroup>for the same example in multiple languages, withcurlfirst. - Use obvious placeholders (
YOUR_API_KEY,https://your-community.zapnito.com), never real credentials. - Examples must be complete and runnable as written.
MDX gotchas
- Curly braces
{}and<in prose are parsed as JSX. Wrap literals in backticks or escape them. - Blank line required between a component tag and Markdown content inside it.
- Self-close void components (
<Card ... />), and always close everything else. - HTML comments (
<!-- -->) break MDX. Use{/* comment */}.
API reference (API tab)
- If we add an OpenAPI spec, reference it from
docs.jsonand let Mintlify generate endpoint pages instead of hand-writing them. Keep the spec in the repo and validate withmint openapi-check. - Document authentication, rate limits, pagination and error formats once, and link to them from endpoint pages.
- Webhook pages should list each event and its payload.
Before you commit
pnpm validatepasses.pnpm broken-linksreports nothing.- Every new or moved page is in
docs.jsonnavigation (and has a redirect if moved). - Every page has
titleanddescription, and every image hasalttext. - Previewed the page in both light and dark mode with
pnpm dev.

