# Fumadocs vs Htmlpress

> A standalone plain-HTML site builder vs Next.js App Router for docs.

[Fumadocs](https://fumadocs.dev) 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](/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](/authoring/) — htmlpress' HTML surface.
- [Customization](/customization/) — htmlpress' config keys and escapes.
- [Comparison](/comparison/) — back to the index.
