Developer-first documentation stack with diagrams-as-code
A two-service monorepo combining Fumadocs v15 (Next.js) for beautiful MDX documentation with Kroki for rendering diagrams from code. Built for developer experience with one-command setup and hot reload in Docker.
- π¨ Dark/Light Theme Support - All diagrams adapt automatically
- π Zoomable Diagrams - Click any diagram to open in fullscreen with pan/zoom
- π Hot Reload - Edit MDX or components, see changes instantly
- π Secure by Default - Path traversal protection, size limits, language allowlist
- π¦ One Command -
./scripts/dev.shstarts everything or if you have Node.js installed you can runpnpm dev - π― Type-Safe - TypeScript strict mode throughout
- Node.js 22 with pnpm
- Next.js 15 App Router
- Fumadocs v15 for documentation UI
- Kroki for diagram rendering
- Mermaid for inline diagrams
- React Flow for zoomable viewer
- TailwindCSS 3 for styling
- Docker & Docker Compose for containerization
- Node.js 22+
- pnpm 9+
- Docker & Docker Compose v2
# Clone the repository
git clone https://github.com/wallwhite/hyperion-docs.git
# Navigate to the project directory
cd hyperion-docs
# Install dependencies
pnpm install
# Start both services (docs + kroki)
pnpm devVisit http://localhost:3000 - changes hot-reload automatically!
# Stop both services (docs + kroki)
pnpm stop
# or use the script
./scripts/stop.shhyperion-docs/
βββ apps/
β βββ docs/ # Next.js + Fumadocs app
β βββ app/ # Next.js App Router
β β βββ api/diagram/ # Diagram proxy API
β β βββ docs/ # Docs routes
β β βββ layout.tsx # Root layout
β β βββ page.tsx # Home page
β βββ components/ # React components
β βββ content/docs/ # MDX documentation
β βββ diagrams/ # Diagram source files (.puml, .dot)
β βββ openapi/ # OpenAPI schema files (.yaml)
β βββ lib/ # Utilities
β βββ mdx-components.tsx # MDX component config
β βββ source.config.ts # Fumadocs source config
β βββ Dockerfile # Docs service Dockerfile
βββ docker-compose.yml # Services orchestration
βββ pnpm-workspace.yaml # Monorepo config
βββ package.json # Root scripts
<Diagram lang="mermaid" chart="
graph TD;
A[Client] --> B[Server];
B --> C[Database];" />Place your diagram files in apps/docs/diagrams/:
<Diagram lang="plantuml" path="erd.puml" alt="Entity Relationship Diagram" />
<Diagram lang="graphviz" path="flow.dot" alt="Processing Flow" />- PlantUML -
puml,plantuml - Graphviz -
dot,graphviz - Mermaid -
mermaid(or use<Mermaid>component) - C4 PlantUML -
c4plantuml
Easily extend by adding to LANG_MAP in apps/docs/app/api/diagram/route.ts.
MDX File β <Diagram> Component β /api/diagram API Route β Kroki Service β SVG/PNG Response
- Runtime:
nodejs(required forfsaccess) - Security: Path allowlist, size limits, language validation
- Caching:
Cache-Control: no-storein dev
Query Parameters:
lang- Diagram language (e.g.,puml,dot)path- Relative path to diagram filefmt- Output format (svgorpng, default:svg)
- Fetches from
/api/diagramor generates Mermaid diagrams directly from the chart string - Opens modal on click
- Supports SVG
- Whiteboard canvas
- Pan, zoom, reset controls
cd apps/docs
pnpm install
pnpm devNote: You'll need to run Kroki separately or set
KROKI_BASE_URLto a public instance.
-
Add language mapping to
apps/docs/app/api/diagram/route.ts:const LANG_MAP: Record<string, string> = { // ...existing d2: 'd2', // Add new type };
-
Create diagram files in
apps/docs/diagrams/ -
Use in MDX:
<Diagram lang="d2" path="my-diagram.d2" />
Edit apps/docs/tailwind.config.ts to customize Tailwind or override Fumadocs styles.
- Path Traversal: All paths resolved relative to
apps/docs/diagramsand validated - File Size: Max 256 KB per diagram file
- Language Allowlist: Only mapped languages accepted
- No Code Execution: Diagrams treated as opaque text sent to Kroki
- Check Kroki is running
- Verify diagram file path is relative to
apps/docs/diagrams - Check browser console for API errors
- Confirm language is in
LANG_MAP
cd apps/docs
pnpm typecheckMIT
- Fork the repo
- Create a feature branch
- Make your changes
- Submit a pull request
Built with β€οΈ using Fumadocs, Next.js, and Kroki