Documentation framework built on Cross-Inertia. Build beautiful documentation sites with Python backends and React frontends.
- Markdown-based content with frontmatter support
- Auto-generated navigation from file structure
- Server-side rendering for SEO and performance
- Syntax highlighting with Shiki
- Raw markdown responses for AI tools (Claude Code, etc.)
- Fully customizable components and theming
This monorepo contains two packages:
| Package | Description | Registry |
|---|---|---|
cross-docs |
Python backend utilities | PyPI |
@usecross/docs |
React components and utilities | npm |
# Python
uv add cross-docs
# JavaScript
npm install @usecross/docsfrom pathlib import Path
from fastapi import FastAPI
from cross_docs import create_docs_router, strip_trailing_slash_middleware
from inertia.fastapi import InertiaMiddleware
app = FastAPI()
app.add_middleware(InertiaMiddleware)
app.middleware("http")(strip_trailing_slash_middleware)
# Add docs routes - that's it!
app.include_router(create_docs_router(Path("content")))// app.tsx
import { createDocsApp, DocsPage } from '@usecross/docs'
import './globals.css'
createDocsApp({
pages: {
'docs/DocsPage': DocsPage,
},
title: (title) => `${title} - My Docs`,
})// tailwind.config.js
const docsPreset = require('@usecross/docs/tailwind.preset')
module.exports = {
presets: [docsPreset],
content: [
'./frontend/**/*.{ts,tsx}',
'./node_modules/@usecross/docs/**/*.{js,tsx}',
],
theme: {
extend: {
colors: {
primary: {
// Your brand colors
500: '#648C57',
600: '#4d7043',
},
},
},
},
}Create markdown files in content/docs/:
---
title: Getting Started
description: Learn how to use our product
section: Getting Started
order: 1
---
# Getting Started
Welcome to our documentation!import { DocsLayout, Markdown } from '@usecross/docs'
function MyDocsPage({ content }) {
return (
<DocsLayout
title={content.title}
logo={<MyLogo />}
githubUrl="https://github.com/myorg/myproject"
navLinks={[{ label: 'Docs', href: '/docs' }]}
>
<Markdown content={content.body} />
</DocsLayout>
)
}import { Sidebar, Markdown, CodeBlock } from '@usecross/docs'
function FullyCustomPage({ content }) {
return (
<div className="flex">
<Sidebar nav={nav} currentPath={currentPath} />
<main>
<Markdown
content={content.body}
components={{
code: (props) => <CodeBlock {...props} theme="github-light" />
}}
/>
</main>
</div>
)
}create_docs_router(content_dir, ...)- Create a FastAPI router with docs routescreate_docs_handler(...)- Create a docs route handler (for more control)parse_frontmatter(content)- Parse YAML frontmatter from markdownload_markdown(content_dir, path)- Load and parse a markdown fileload_raw_markdown(content_dir, path)- Load raw markdown contentgenerate_nav(docs_dir, ...)- Generate navigation from file structurestrip_trailing_slash_middleware- Redirect trailing slasheswants_markdown(request)- Check if request wants markdown (for AI tools)
Components:
DocsLayout- Full documentation layout with sidebarDocsPage- Default docs page (layout + markdown)Sidebar- Navigation sidebarMarkdown- Markdown rendererCodeBlock- Syntax-highlighted code block
Utilities:
createDocsApp(config)- Create Inertia appcreateDocsServer(config)- Create SSR servercn(...classes)- Tailwind class mergergetHighlighter()- Get Shiki highlighter
MIT