DocSmith is a lightweight PHP tool that compiles Markdown directories into responsive, searchable, SEO-friendly static documentation websites with zero frontend configuration.
Writing technical documentation in Markdown is straightforward, but transforming those files into a searchable, responsive website often introduces complex JavaScript static site generators, node build pipelines, or heavy CMS platforms.
mrpunyapal/docsmith is a native PHP library and standalone CLI tool that compiles a directory of Markdown files directly into clean static HTML pages with built-in dark mode, dual-theme syntax highlighting, search, and AI-ready exports.
You can explore a live example of a site generated with DocSmith at mrpunyapal.github.io/docsmith.
How DocSmith Works
DocSmith follows a straightforward static compilation pipeline:
Markdown Files (docs/)
↓
DocSmith Engine
├── Frontmatter parsing and document discovery
├── League CommonMark (GFM) + Phiki syntax highlighting
├── Navigation tree generation and custom ordering
└── Search index, sitemap, and LLM text generation
↓
Static HTML Documentation Site (dist/)
- Source Discovery: Scans your documentation directory and parses YAML frontmatter metadata.
- Markdown Rendering: Converts Markdown through League CommonMark with GitHub-flavored Markdown extensions.
- Syntax Highlighting: Renders server-side code syntax highlighting using Phiki with GitHub Light and Dark themes.
- Site Assembly: Injects navigation, table of contents, search overlays, and responsive mobile drawers.
- Asset & Metadata Publishing: Emits static assets,
search-index.json,sitemap.xml,llms.txt, and.nojekyll.
Installation and Quick Start
DocSmith requires PHP 8.3 or newer and Composer:
composer require --dev mrpunyapal/docsmith
1. Build via CLI
DocSmith ships with a standalone binary at vendor/bin/docsmith:
vendor/bin/docsmith build --source=md --output=docs --title="Package Docs"
2. Build via PHP API
You can also run builds directly within PHP build scripts using the static entry point or fluent builder:
use Docsmith\Docsmith;
Docsmith::make()
->source(__DIR__ . '/md')
->output(__DIR__ . '/dist')
->title('Acme Cache Docs')
->description('High-performance caching library for PHP.')
->accentColor('#ff2d20')
->accentColorDark('#ff6b61')
->siteUrl('https://acme.github.io/cache')
->repositoryUrl('https://github.com/acme/cache')
->rightSidebar()
->build();
Organizing Markdown Files
DocSmith maps your Markdown files directly to clean static URLs:
md/
├── index.md → docs/index.html
├── installation.md → docs/installation/index.html
├── configuration.md → docs/configuration/index.html
└── usage/
├── basics.md → docs/usage/basics/index.html
└── advanced.md → docs/usage/advanced/index.html
If your source directory does not contain an index.md, DocSmith automatically generates a clean landing page listing all available documentation sections.
Frontmatter Options
Each Markdown file can include YAML frontmatter to control page metadata and navigation:
---
title: Advanced Configuration
description: Fine-tune caching drivers, timeouts, and memory limits.
sidebar_label: Configuration
order: 3
hidden: false
---
# Advanced Configuration
title: Page title displayed in browser tabs and navigation.description: Meta description used for SEO and search snippets.sidebar_label: Shorter label displayed in the sidebar menu.order: Numeric sort priority.hidden: When set totrue, the page is rendered to HTML but omitted from the sidebar, search index, and previous/next pagination.
Customizing Sidebar Navigation Order
By default, pages appear in alphabetical or frontmatter-defined order. You can set an explicit sequence using navigationOrder():
Docsmith::make()
->source(__DIR__ . '/md')
->output(__DIR__ . '/dist')
->navigationOrder([
'Introduction',
'Installation',
'Configuration',
'Basic Usage',
'Advanced Usage',
])
->build();
Entries can match page titles, sidebar_label properties, or relative Markdown paths. Unlisted pages retain their natural position after ordered items.
Polished Reading Experience
DocSmith generates standalone, zero-dependency HTML with built-in UX features:
1. Dual-Theme Syntax Highlighting
Code blocks are highlighted during static compilation using Phiki, emitting token styles for both light and dark backgrounds without client-side highlighting libraries:
use Acme\Cache\Repository;
$cache = new Repository(driver: 'redis');
$cache->set('user:42', $user, ttl: 3600);
Each code block includes a 1-click clipboard copy button.
2. Light and Dark Theme Modes
The site includes a theme toggle that automatically detects system color scheme preferences (prefers-color-scheme) and persists manual user selections via localStorage.
3. Responsive Navigation & Tables
- Mobile layouts include a sliding navigation drawer with touch backdrop support.
- Wide Markdown tables are automatically wrapped in
<div class="table-scroll">containers to prevent viewport overflow on smaller screens. - An optional right sidebar (
->rightSidebar()) extracts page headings into an active Table of Contents.
Built-In Search & Modal Overlay
DocSmith builds a static search-index.json during compilation containing page titles, descriptions, section headings, and content text:
- Sidebar Filter: Instantly filters sidebar navigation links as you type.
- Global Search Overlay: Press
Cmd+K(macOS) orCtrl+K(Windows/Linux) or click the search bar to launch a modal search dialog with full content matching.
Multi-Version Documentation
For libraries maintaining multiple major releases, DocSmith provides multi-version builds with a header version switcher:
Docsmith::make()
->source(__DIR__ . '/md')
->output(__DIR__ . '/dist')
->versions([
'v1' => ['label' => 'v1.x', 'source' => __DIR__ . '/md/v1', 'default' => true],
'v2' => ['label' => 'v2.x', 'source' => __DIR__ . '/md/v2'],
])
->build();
- The default version outputs directly to the root (
/installation/index.html). - Secondary versions output to versioned subpaths (
/v2/installation/index.html). - A version switcher dropdown is automatically rendered in the header navigation.
AI-Ready Documentation Exports
DocSmith automatically exports documentation in formats structured for LLMs, coding agents, and automated workflows:
| File | Format and Purpose |
|---|---|
llms.txt |
Standard directory index per the llms.txt specification with absolute URLs and summaries. |
llms-full.txt |
Concatenated plain-text export of the entire documentation site. |
export/docs.md |
Single unified Markdown file containing all pages and metadata. |
AI exports are enabled by default and can be toggled using ->llmsExport(false).
Open Graph Social Cards
DocSmith can generate Open Graph preview images using Playwright and capturist:
Docsmith::make()
->source(__DIR__ . '/md')
->output(__DIR__ . '/docs')
->siteUrl('https://acme.github.io/cache')
->ogGeneratedAll() // Generates docs/og/cover.png
->build();
You can generate a single shared social cover or individual cards per page (->ogGeneratedPerPage()), with support for custom HTML card templates (->ogTemplate(...)).
Real-World Example: Package Documentation Script
Here is a complete build-docs.php script for a PHP package:
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use Docsmith\Docsmith;
Docsmith::make()
->source(__DIR__ . '/docs')
->output(__DIR__ . '/dist')
->title('AuditLogger PHP')
->description('Immutable audit logging and security tracing for PHP applications.')
->accentColor('#0284c7')
->accentColorDark('#38bdf8')
->siteUrl('https://acme.github.io/audit-logger')
->repositoryUrl('https://github.com/acme/audit-logger')
->editBranch('main')
->rightSidebar()
->navigationOrder([
'Getting Started',
'Installation',
'Configuration',
'Logging Events',
'Custom Formatters',
])
->build();
echo "Documentation built successfully in dist/\n";
Add a Composer shortcut to composer.json:
"scripts": {
"docs:build": "@php build-docs.php"
}
Summary
DocSmith provides a focused, native PHP solution for turning Markdown into production-ready static documentation sites:
- Zero Node Runtime: Compiles complete HTML sites natively in PHP without requiring node modules or complex JavaScript build tools.
- Built-in Essentials: Includes dark mode, Phiki syntax highlighting, search index generation, mobile navigation, and LLM text exports out of the box.
- Hosting Agnostic: Generates clean static folders compatible with GitHub Pages (
.nojekyll), Cloudflare Pages, Netlify, and Vercel. - Live Documentation: View a live production example at mrpunyapal.github.io/docsmith.
- GitHub Repository: MrPunyapal/DocSmith
Related Tips
View all tips →Clean Up Redundant Code Comments with a Custom Rector Rule
Use a custom Rector rule to automatically strip noisy inline comments and empty docblocks across your codebase while preserving essential PHPDoc annotations.
Typed Arrays and Array Shapes in PHP with PHPDoc
Document and enforce structured array schemas using PHPDoc array shapes, lists, and non-empty array annotations for static analysis in PHPStan and Psalm.