SuperDoc Documentation
Mintlify-powered docs atdocs.superdoc.dev.
File structure
File paths must mirror the navigation structure indocs.json. If a page appears under “Guides > Collaboration” in the nav, the file lives in guides/collaboration/, not somewhere else.
When moving or renaming a page, always add a redirect in docs.json:
Document API generation boundary
Document API docs have mixed manual/generated ownership. Treat these paths as authoritative:apps/docs/document-api/reference/*: generated, committed to git (Mintlify deploys from git), do not hand-edit.packages/document-api/generated/*: generated, not in git, do not hand-edit. Runpnpm run generate:allto produce.apps/docs/document-api/available-operations.mdx: manual except for the block between:{/* DOC_API_OPERATIONS_START */}{/* DOC_API_OPERATIONS_END */}
Brand voice
One personality, two registers. SuperDoc is the same person in every conversation — warm, clear, technically confident. It adjusts what it emphasizes based on who’s listening. Developers hear about the how. Leaders hear about the why. Documentation uses the developer register: clear, direct, code-forward. Respect the reader’s time.Headings
Sentence case, always. “What we built” not “What We Built.”Universal voice rules
- Say what it does, not what it is — “Renders DOCX files in the browser” not “an enterprise document management solution.” Nouns are vague. Verbs are clear.
- Short sentences win — If a sentence has a comma, try splitting it in two. If it has a semicolon, definitely split it. Scannable beats comprehensive.
- No buzzwords — “Next-generation,” “cutting-edge,” “revolutionary,” “best-in-class” are banned. If it sounds like a press release, rewrite it.
- Show, then tell — A code snippet or demo is always better than a paragraph of description. When words are needed, be specific: “5 lines” not “easy.”
- “You” not “we” — “Your documents stay on your servers” hits harder than “We ensure data privacy.” The reader is the hero, not SuperDoc.
- Acknowledge trade-offs — If something has a limitation, say so. “SuperDoc runs client-side, so very large documents (1000+ pages) need good hardware.” Honesty builds trust.
- Be specific with numbers — “60+ extensions” not “many extensions.” “5 lines of code” not “minimal integration.” Specificity is credibility.
- Conversational, not chummy — Write like you’re talking to a smart colleague. Not a pitch deck (“leverage synergies”) and not a chat message (“lol it just works fr fr”).
Developer register pattern
Structure: What it does → How to use it → What it saves you Lead with the developer’s problem or goal. Follow with what SuperDoc does (concretely). End with how fast they can start. Always include code or an install command near the top. Example:“Add document signing to your app with the esign package. Drop in the component, define your fields, and get back a signed document with a full audit trail. No need to integrate DocuSign or build signing from scratch.”
Same concept, two registers
Quick reference
Page depth
- Getting Started pages are high-level overviews. Link to detailed pages, don’t duplicate content.
- Core pages (SuperDoc, SuperEditor) are the detailed API reference.
- Module pages document configuration, API, and events for each module.
- Guide pages are step-by-step walkthroughs for specific integrations.
Layer model
When documenting a customer-facing operation, name the right layer:- Document API (
editor.doc.*) — request/response document operations: comments, tracked changes, format apply, insert/replace/delete, mark up. Same shape on server, client, and AI agents. Use this for any document mutation. superdoc/uiandsuperdoc/ui/react— browser UI controller for custom toolbar, comments sidebar, review panel, selection capture, viewport, document controls (export / mode toggle / dirty indicator). Use this for new custom React UI.- Modules (
modules/*) — built-in SuperDoc-rendered UI. Use this when the customer is happy with the built-in look and just wants config. - Core (
core/*) — low-level instance/reference surface. Lifecycle, refs, host events. Reach for it when the higher layers don’t cover the case (rare).
superdoc/ui/react. Reach superdoc.activeEditor.* only when documenting legacy compat or a known escape hatch (and call it out as such).
API naming
superdoc.export()for SuperDoc-level methodseditor.doc.*for document operations (the recommended path)superdoc.activeEditor.commands.X()for editor chain commands. Legacy/compat only — prefereditor.doc.*for mutations andui.commands.*for UI dispatch.superdoc.activeEditor.getHTML()for editor-level methodssuperdoc.getHTML()returnsArray<string>(one per document section)
Mintlify components
Common components:ParamField, Note, Warning, Tip, CardGroup, Card, Tabs, Tab, Info.
Code examples pattern
Every code snippet in API/reference pages must be copy-pasteable. Use<CodeGroup> with two tabs when a snippet is a fragment (assumes prior setup):
- Usage tab — the focused snippet (what the method does)
- Full Example tab — complete, runnable code with imports and initialization
When NOT to use CodeGroup: Snippets that are already complete (have imports + initialization), config-only blocks, bash commands, XML/HTML examples.
Icons
docs.json sets "icons": { "library": "lucide" }. Mintlify resolves every icon="..." value (in <Card>, <CardGroup>, <Icon>, etc.) against Lucide only — there is no per-icon library override. Names from Font Awesome, Material Design, Tabler, or brand icon sets silently render as a blank box.
Rule of thumb: before adding an icon, check the name exists at https://lucide.dev/icons/. If it doesn’t, pick a Lucide alternative or use a custom SVG path.
Common name traps when migrating from Font Awesome:
For brand/language icons (React, Vue.js, Microsoft, etc.), Lucide doesn’t ship them. Either use a generic Lucide icon that fits the context, or supply an SVG via
icon="/path/to/icon.svg" or an external URL.
A pnpm run check:icons validator runs in pre-commit and walks every <Card icon="...">, <Icon icon="...">, and docs.json icon reference against the locally installed Lucide set. Catches drift before deploy. Add new icons through this validator — if it complains, the name isn’t in the Lucide library.
Testing
Code examples are tested automatically via pre-commit hooks and CI. Two checks run when.mdx files change:
pnpm run check:imports— validates import paths in all code blocks against an allowlistpnpm run test:examples— extracts “Full Example” blocks, executes them headlessly against a real Editor instance, and fails if any documented API doesn’t exist
__tests__/ and uses remark to parse MDX. When adding or modifying a Full Example, run pnpm run test:examples to verify it works.
Commands
npx mintlify dev— Start local dev servernpx mintlify broken-links— Check for broken linkspnpm run check:imports— Validate code block import pathspnpm run test:examples— Run doctest suite (277 examples)

