Built for Laravel 12 & 13 · PHP 8.5+

Beautiful docs,
from plain Markdown.

Drop .md files into your Laravel app. One Artisan command later — a fully rendered, cached, and searchable documentation site. No Node.js, no database, no configuration.

terminal
$composer require affonsopaulo/manual
$php artisan vendor:publish --tag=manual-assets
$php artisan manual:init
$php artisan manual:build
# Manual build complete: 14 documents scanned.
# Visit /manual in your browser.
Laravel 12 & 13
PHP 8.5+
MIT License
Zero Node.js dependencies
No database required

Features

Everything your docs need.
Nothing you don't.

Servera Manual is opinionated about simplicity. Every feature is designed to stay out of your way while delivering a production-quality documentation experience.

File-System Routing
The directory layout is the navigation. No route declarations, no config files — every URL, breadcrumb, and sidebar entry is derived automatically from your files.
getting-started/index.md → /manual/getting-started
YAML Front Matter
Control titles, custom URLs, navigation order, page visibility, and stable keys — from a small YAML block at the top of each Markdown file.
title, order, slug, url, hidden, key
Two-Layer Cache
A manifest cache stores the full document graph. Each page is cached individually. Both layers auto-invalidate the moment any file changes — no manual purging required.
manifest cache + per-page HTML cache
Client-Side Search
A JSON endpoint exposes the full search index — titles, headings, excerpts, and content. No search server, no Algolia API key, no external dependencies.
/_manual/search.json · hidden pages excluded
Image Serving
Images are served through the same middleware as documents. Use @image/ from any page depth — no relative paths to maintain.
![](@image/screenshot.png) · works anywhere
Dynamic Helpers
Embed Laravel route URLs and cross-page links directly in Markdown using {{ }} expressions. Links resolve at render time — always correct, refactor-safe.
{{ doc('key') }} · {{ route('name') }}

How it works

From zero to live docs in three steps.

No build pipeline to configure, no tooling to install. Just Markdown files and one Artisan command standing between you and a production-quality documentation site.

01
Write your Markdown files
Create .md files anywhere inside your source directory. The directory structure becomes the sidebar automatically. Add optional YAML front matter to customize titles, order, and URLs per page.
docs/manual/
  ├── index.md
  ├── getting-started/
  │   ├── index.md
  │   └── installation.md
  └── guides/
      └── front-matter.md
02
Run the build command
A single Artisan command scans your source directory, validates routes, renders every page to HTML, warms both cache layers, and builds the JSON search index. Run it once on deploy and you're done.
$ php artisan manual:build
# Manual build complete:
# 14 documents scanned,
# 14 cached pages,
# 14 search documents.
03
Your docs are live
Visit /manual in your browser. Sidebar navigation, breadcrumbs, prev/next links, syntax-highlighted code, full-text search — all ready, all from your Markdown files.
# Routes registered:
GET /manual
GET /manual/{path}
GET /manual/_images/{f}
GET /manual/_manual/search.json

In practice

Markdown in, documentation out.

Write a Markdown file with optional front matter on the left. On the right, what Servera Manual automatically generates — navigation, breadcrumbs, prev/next, search, and syntax highlighting.

getting-started/installation.md
---
title: Installation
description: Step-by-step guide to installing Servera Manual.
order: 1
key: getting-started.installation
---

# Installation

Install the package via Composer:

```bash
composer require affonsopaulo/manual
```

Publish assets and scaffold:

```bash
php artisan manual:init
php artisan manual:build
```

Visit `/manual` — your docs are live.

// Dynamic cross-page link:
[Config]({{ doc('getting-started.configuration') }})
localhost/manual/getting-started/installation
My App
Installation
Step-by-step guide to installing Servera Manual.
Install the package via Composer:
$ composer require affonsopaulo/manual
Publish assets and scaffold:
$ php artisan manual:init
$ php artisan manual:build
Visit /manual — your docs are live.
← Overview
Configuration →

Configuration

Sensible defaults. Full control.

Publish the config file when you need to change something. Everything has a default that works without touching it — including the source path, cache, middleware, and search endpoint.

config/manual.php
<?php

return [

    // The directory scanned for .md files (relative to base_path())
    'source_path' => 'docs/manual',

    // URL prefix for all routes: /manual, /manual/...
    'route_prefix' => 'manual',

    // Shown in the browser tab and on error pages
    'site_title' => env('APP_NAME', 'Documentation'),

    // null = default Laravel store · 0 or negative = bypass (dev mode)
    'cache_store' => env('MANUAL_CACHE_STORE'),
    'cache_ttl' => 3600,

    // Applied to all routes: documents, images, and the search endpoint
    'middleware' => ['web'],

    'assets' => ['enabled' => true],

    'search' => [
        'enabled' => true,
        'endpoint' => '_manual/search.json',
    ],

    'images' => [
        'enabled' => true,
        'path' => '_images',
        'extensions' => ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'ico'],
    ],
];

Ship your docs today.

One package, one command, zero configuration. Your Laravel app already has everything it needs to serve beautiful documentation.

$  composer require affonsopaulo/manual