Content authoring and rendering
File-based MDX and Markdown authoring
GitHub Flavored Markdown (tables, strikethrough, task lists)
6 GitHub-style alert types25 documentation componentsSyntax highlighting for 71 languages
Mermaid diagrams, sanitized with DOMPurify
LaTeX-style math typesettingResponsive iframe embeds, sandboxed without same-origin access
Allowed embed hosts are restricted by the Content-Security-Policy, not by a list inside the component.
Click-to-zoom image lightboxVersioned documentation with a version picker
API documentation
API documentation blocks with cURL examples
OpenAPI and Swagger import with Postman export
AI integration
Built-in Model Context Protocol (MCP) server
AI chat panel, bring your own keyMulti-thread session persistence and accurate citations, connecting to Anthropic, an OpenAI-compatible endpoint, or a local or cloud Ollama model.
llms.txt and llms-full.txt endpoints
Per-page AI reading deeplinksOpen the current page in ChatGPT, Claude, or Cursor with a ready-made prompt.
Copy page as Markdown or plain text
Navigation and search
Auto-generated sidebar navigationAuto-generated category index pages
Breadcrumb navigationPrevious / next page navigationFull-text search with Cmd+K / Ctrl+K
On-page table of contents with scroll-spy
Design and accessibility
26 built-in theme variants, verified OKLCH color system
Every theme variant is generated from the same OKLCH palette and the same build path, with Violet as the default.
Fully responsive, container-query-based layout
Error boundary and custom 404 pageAccessibility: skip-links, focus management, keyboard navigation
Access control and security
Public/private access-mode toggleSigned JWT sessions, 24-hour lifetime
Browser fingerprinting, a timing-safe password comparison, same-host origin validation, and per-client account lockout after repeated failures.
8 HTTP security headers in public mode, 9 in private
4-layer crawler blocking in private mode
MCP server dual-mode auth and path validation
SSRF-resistant OpenAPI importerResolves and validates every remote address before connecting, and pins the connection to the address it validated.
Rate limiting across login, AI chat, MCP, and feedback
Feedback and operations
Reader feedback widgetBacked by a Notion database or a local JSONL file, so a read-only host like Vercel still works.
Health check endpointSitemap and dynamic Open Graph images
Configurable login-page footer branding
Engineering and delivery
Vitest unit tests and Playwright end-to-end tests in CI
An npm audit gate in CIGitHub Actions pinned to commit hashes, a CycloneDX SBOM on release
Automated, leak-scanned commercial release packaging
Environment setup script for local secrets
Proprietary source licenseConfiguration
NEXT_PUBLIC_SITE_URL renamed to DOCS_SITE_URL
Rename it before upgrading. Nothing warns you if you do not: a deployment still
setting the old name starts cleanly and then publishes http://localhost:3000
as its canonical URL, in the sitemap, the RSS feed, llms.txt, llms-full.txt,
every page canonical, every Open Graph image URL, and the private-mode login
redirect. On Vercel the VERCEL_PROJECT_PRODUCTION_URL fallback hides it; a
self-hosted deployment gets silent SEO breakage.
Every Tailwind color family resolves through shared brand variables
No stock Tailwind palette value reaches the browser any more, so anything that relied on one shifts hue.
Accessibility repairs
Dark mode headings rendered at 1.14:1 contrast
prose-gray and dark:prose-invert shared one @apply list, so the light
tokens always won. Dark mode now meets WCAG AA.
Every route scrolled sideways at 320px
The closed mobile drawer left 15 controls in the tab order
It is now inert when closed, Escape closes it and returns focus to its toggle, and the body scroll lock is reference-counted.
An axe WCAG 2.2 AA gate in CI at 320, 768, and 1280 pixels
The target-size rule is enabled explicitly, and a second suite fails the build
on any horizontal scroll at 320px.
A site-wide footer supplying the contentinfo landmark
A root error boundary for when the layout itself fails
Diagrams
C4 diagram labels were squeezed into a fixed 54px box
Mermaid's own textLength attribute did it, and no stylesheet can override
that. Labels now render at natural width and centered, the view box is trimmed
to measured content, relationship labels sit on readable chips, and each shape
carries an icon.
Wide diagrams scroll in a focusable container instead of shrinking
Tooling and polish
Notion helper commands: notion:verify, notion:fix, notion:create
They check the feedback database has every field OwnDocs writes, add any that are missing, and create a new one.
An RSS feed at /feed.xml, public mode onlyFuzzy did-you-mean suggestions on the 404 pageStylelint and a Tailwind class-correctness lint rule in CIThe sidebar brand initial showed the wrong letterThe search bar now stays in place while scrolling