Migrating to Ovellum#
Whether your docs are generated from source, hand-written Markdown, or living on a hosted platform, this is the map for moving them to Ovellum — and what you gain by doing it.
The core idea#
Ovellum has three modes, and the right one depends on where your docs come from:
| Mode | What it does | Replaces |
|---|---|---|
auto | Generates Markdown from your TS/JS source every build. | A source-driven API-doc generator. |
hybrid | Generates, then merges your hand-written prose back in — protected zones survive every rebuild. | The gap between generated and hand-written docs. |
manual | You write Markdown by hand; Ovellum builds a static site. | A plain Markdown static-site generator. |
The one Ovellum is built around is hybrid: generated reference and hand-written narrative in the same file, where your prose is never overwritten and never silently lost. That's the capability the others don't have.
From a source-driven API generator (e.g. TypeDoc)#
If you generate API docs from TypeScript today, Ovellum's auto mode is the
direct equivalent — it parses your source with
ts-morph and reads the JSDoc/TSDoc tags you already
write (@param, @returns, @throws, @example, @deprecated, @since,
@see, @remarks, @internal, …), emitting one Markdown file per source file.
The reason to switch is hybrid mode. A pure generator forces a choice: hand
edits get blown away on the next run, so all your prose lives in separate files
that drift out of sync. Ovellum lets you write narrative inside the generated
file, in a @manual zone:
<!-- @manual:start id="src/client.ts::Client" -->
The `Client` is long-lived — create one per process and share it. See the
[connection guide](/guides/connections/) for pooling.
<!-- @manual:end -->
The generator updates the reference around that zone, never over it. And if
you rename or delete the symbol, the prose isn't dropped — it's
quarantined
to .ovellum/orphans/ so you can reattach it. That "docs that never fall out of
sync" guarantee is the whole point.
Bringing it across: point input at your source, set mode: 'hybrid', run
ovellum build. Your first build produces the generated reference; add @manual
zones where you want narrative. (Use mode: 'auto' if you only want generated
output with no hand edits.)
From a hand-written Markdown site#
If your docs are already Markdown built by a static-site generator, Ovellum's
manual mode is a full static-site builder — drop your .md files in and you
get, out of the box:
- Navigation from the file tree (folders → sections), with
_meta.jsonfor ordering, titles, and collapse behavior; pretty URLs; an auto right-side table of contents. - Theming — light/dark with no flash, five palettes plus a
host-inheriting
baremode, configurable accent, system or bundled fonts. - Authoring — GitHub-style callouts, footnotes, component directives (tabs/steps/cards), Mermaid diagrams, and Shiki syntax highlighting with copy buttons.
- Search (Pagefind, ⌘K), i18n
(per-locale subtrees + language picker), versioned docs,
drafts, a landing page, a themed 404,
sitemap.xml- RSS, and per-page reading-time / "Edited" dates.
- AI-friendly output —
llms.txt,llms-full.txt, and per-page.mdmirrors, emitted alongside the HTML.
See Manual mode for the full tour.
Bringing it across (see the steps below):
copy your Markdown into the content directory, translate your old nav config to
per-folder _meta.json, keep or add frontmatter (title, description,
tags, permalink), and run ovellum check to catch broken links.
From a hosted docs platform#
If your docs live on a hosted platform, the migration is as much about ownership as features. Ovellum builds a portable static folder — plain HTML/CSS and a little JS — that you deploy anywhere: GitHub Pages, Netlify, Vercel, Cloudflare, an S3 bucket, or a host tool's own pipeline. There's no server-side runtime to keep alive and nothing proprietary in the output.
What you keep — or gain:
- Your content stays plain Markdown in your repo. No export step, no proprietary format to escape later.
- AI-native by default — a built-in
MCP server (
ovellum mcp, listed on the MCP Registry) lets agents search, read, diff, and even write into protected zones that survive regeneration — not just read. Plus machine-readable--jsonand stable exit codes for CI. - No lock-in — the build is the product; the host is your choice. (Ovellum builds; the host deploys.)
Bringing it across: export your pages to Markdown, drop them into content/,
and follow the steps below. Most hosted platforms export close-enough Markdown
that the main work is nav (_meta.json) and fixing asset paths to be
root-absolute.
Bringing your content across#
The same handful of steps regardless of where you're coming from:
- Scaffold —
ovellum initwrites a commentedovellum.config.ts, a startercontent/index.md, anAGENTS.md, and.gitignoreentries.--yesaccepts the defaults. - Drop in your Markdown — put your
.mdfiles under the configuredinput(defaultcontent/). Subfolders become sidebar sections; each file becomes a page at<slug>/index.html. An existingREADME.mdat the root becomes the home page automatically. - Order the nav — add a
_meta.jsonper directory where you want a specific order or titles:{ "title": "Guides", "order": ["install", "configure"] }. Unlisted pages sort alphabetically after. It's optional everywhere. - Frontmatter (all optional) —
title,description,tags,permalink(a custom URL like/faq/),draft: true(visible indev, excluded frombuild),updated(pins the "Edited" date). Title falls back to the first# H1, then the filename. - Fix asset paths — make image/download links root-absolute
(
/img/x.png, notimg/x.png) so they survive pretty URLs; put root-served files (favicon,robots.txt) inpublic/. - Validate —
ovellum checkreports broken internal links (exit1on issues;--strictadds more;--jsonfor CI). Thenovellum buildand deploydist/.
For anything that goes wrong along the way, the Troubleshooting guide covers the common snags.