Skip to main content

Changelog

5 min readStableBeginner

A version history of OwnDocs. Entries follow Keep a Changelog conventions and Semantic Versioning: MAJOR for breaking changes, MINOR for new backward-compatible features, PATCH for fixes.

v1.0.0 below is the initial-deployment entry: it covers everything shipped up to this release in one place, rather than splitting early development across several version numbers. Every release after it gets its own dated entry.

2026-08-191.0.0

Content authoring and rendering

File-based MDX and Markdown authoring

GitHub Flavored Markdown (tables, strikethrough, task lists)

6 GitHub-style alert types25 documentation components

Syntax highlighting for 71 languages

Mermaid diagrams, sanitized with DOMPurify

LaTeX-style math typesetting

Responsive 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 lightbox

Versioned 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 key

Multi-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 deeplinks

Open 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 navigation

Auto-generated category index pages

Breadcrumb navigationPrevious / next page navigation

Full-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 page

Accessibility: skip-links, focus management, keyboard navigation

Access control and security

Public/private access-mode toggle

Signed 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 importer

Resolves 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 widget

Backed by a Notion database or a local JSONL file, so a read-only host like Vercel still works.

Health check endpoint

Sitemap 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 CI

GitHub Actions pinned to commit hashes, a CycloneDX SBOM on release

Automated, leak-scanned commercial release packaging

Environment setup script for local secrets

Proprietary source license

Configuration

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
Was this page helpful?

© 2026 DevOps. All rights reserved.