Fumadocs vs Htmlpress
Fumadocs is a Next.js-based docs framework built
around the App Router. It splits responsibilities across separate packages:
fumadocs-core (headless logic), fumadocs-ui (default UI
components), and fumadocs-mdx (content source loader).
At a glance
| Axis | Htmlpress | Fumadocs |
|---|---|---|
| Language / runtime | Rust (single binary, no runtime) | TypeScript / Node 18+ |
| UI framework | None (plain HTML + CSS, htmlpress-* web components) |
React 18/19 (Next.js App Router) |
| Build tool | htmlpress binary | Next.js (Turbopack/Webpack) |
| Content format | HTML and Markdown pages | Markdown + MDX |
| License | MIT, self-hosted | MIT, self-hosted |
| Output model | Prerendered static | Static or SSR (Next.js modes) |
Architecture
htmlpress is one Rust binary, installed from npm (gethtmlpress), PyPI
or crates.io. It wraps each HTML page in one layout with a navigation and a theme;
there is no bundler, no UI framework and no plugin API. Every built-in file — the
layout, the styles, the scripts and each component — can be escaped: a file at the
same path under .htmlpress/ replaces it.
Fumadocs assumes you already have (or want) a Next.js application. It's not a
self-contained CLI — you scaffold a Next project, install Fumadocs packages, and
wire fumadocs-core and fumadocs-ui into your App Router.
Content is read by fumadocs-mdx from .md/.mdx
files and surfaced as typed objects.
The package split is intentional: fumadocs-core exposes hooks and
primitives without UI, so projects can swap fumadocs-ui for a custom UI
without forking.
Content layout is unconstrained on the htmlpress side: it scans by glob
(include/exclude in htmlpress.yaml, every
.html file by default), and a page's URL follows its file path below
the glob's base, so docs/**/*.html serves
docs/guide.html at /guide/. There's no required
docs/ folder. The navigation is built from the folders and each page's
<meta name="order">; a folder's index.html names its
group. Fumadocs reads from a single configured content directory (defined in
fumadocs-mdx's source plugin); routes are derived from file paths under
that root.
Content surface
Fumadocs accepts Markdown + MDX with frontmatter and embedded React components. It
uses fumadocs-mdx (a custom MDX loader) which produces TypeScript-typed
content objects with full IntelliSense for frontmatter. Custom components live
alongside your Next app code.
htmlpress pages are plain semantic HTML, styled by the theme from the elements
themselves. Richer blocks are htmlpress-* custom elements
(htmlpress-callout, htmlpress-tabs,
htmlpress-filetree, htmlpress-cards, …), whose CSS and JS
are linked only on pages that use the tag. A project adds its own tag with
.htmlpress/components/<name>/<name>.html, which replaces
the tag at build time.
htmlpress has no frontmatter: a page's metadata is its own
<head> — <title>,
<meta name="description">,
<meta name="order">, <meta name="layout"> and
<meta name="image">; other <head> tags are
kept. Fumadocs uses frontmatter: title, description,
icon, full.
Feature matrix
| Capability | Htmlpress | Fumadocs |
|---|---|---|
| Versioning | Partial (a section or a deploy per version) | Partial (via separate content sources) |
| Internationalization (i18n) | Yes (translations, language picker, 7 bundled UI languages) | Yes (built-in) |
| Search | Yes (built-in, client-side) | Yes (Orama-based, optional Algolia) |
| OpenAPI rendering | No | Yes (fumadocs-openapi) |
| Blog | No | No (use Next routes) |
| Changelog | No | No |
| Sitemap | Yes (with site set) |
Via Next.js sitemap.ts |
| RSS | No | Via Next.js routes |
| Themes | Escapes in .htmlpress/ + --htmlpress-* tokens |
Swap fumadocs-ui or override per-component |
| Custom routes |
Any .html file; extra layouts in .htmlpress/layouts/
|
Any Next App Router page |
| Standalone CLI | Yes (htmlpress build) |
No (Next.js commands) |
Output & deployment
htmlpress writes every page to static HTML in .htmlpress/build/, along
with robots.txt, a sitemap.xml when site is
set, a Markdown copy of each page, llms.txt and the agent skills under
.well-known/agent-skills/. The base key serves the site
under a sub-path. See Deployment for host guides.
Fumadocs inherits Next.js's output modes: full static export (output: 'export'), hybrid SSG/SSR, or fully dynamic. Deployment matches whatever Next.js supports —
Vercel is the default target, but any Node host or Cloudflare Workers (via OpenNext)
works.
See also
- Authoring — htmlpress' HTML surface.
- Customization — htmlpress' config keys and escapes.
- Comparison — back to the index.
Created with ❤ and Htmlpress