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 -
pnpm devstarts docs locally (cross-platform) - 🎯 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+
# 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 docs locally (no Docker)
pnpm devVisit http://localhost:3000 - changes hot-reload automatically!
If you want Docker-based development instead:
pnpm dev:docker# Stop Docker-based dev services
pnpm stophyperion-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
pnpm install
pnpm devNote: Diagram rendering uses
KROKI_BASE_URLwhen set. By default, it useshttps://kroki.io.
pnpm dev:docker
pnpm stop:docker-
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