Skip to content

Docuccino

Beautiful, accurate OpenAPI docs for Laravel — generated from the real shape of your code. Deep type inference, byte-for-byte deterministic output, and a semantic diff you can gate CI on.

Documentation from your code, not from annotations

Section titled “Documentation from your code, not from annotations”

Point Docuccino at your routes and it reads your controllers, form requests, resources, DTOs, enums, and exception handling to produce an accurate OpenAPI 3.2 document — then serves it in a built-in interactive viewer. You add annotations only where you want to say something your code can’t.

Docuccino compiles your application into OpenAPI 3.2 — and records how it knew. That record travels in the document under one reserved member, x-docuccino, the Docuccino extension: a stable identity for every operation and schema, and the file:line each detail came from. It’s what powers the deterministic output and the semantic diff, and the OpenAPI export drops all of it.

Where do your docs need to be readable? Pick the tab that matches:

Terminal window
composer require docuccino/laravel
composer require --dev docuccino/inference-phpstan
php artisan docuccino:export

Readers hit /docs/api on a deployed environment: the adapter ships to production and serves the committed artifact, while the analysis engine stays a dev dependency.

Your OpenAPI document lands where you point it, and the bundled viewer is live at /docs/api in your local environment. Nothing else to configure — installation walks through it properly.

Deep type inference

Response and request shapes are inferred from your real types — array shapes, generics, and conditional returns included. Your existing type hints and PHPStan extensions make your docs better automatically.

Query parameters, for free

Filters, sorts, includes, and pagination for list endpoints are detected from your code — even when the query is built several method calls deep. No hand-written parameter lists to maintain.

Error responses, automatically

Docuccino reads your actual exception handling — render callbacks, exception render(), Responsable::toResponse() — so 422, 404, 403, and your custom error shapes are documented with zero configuration.

Deterministic output

The same code on the same version always produces byte-for-byte identical output — no timestamps, no absolute paths, no shuffling. Commit the file and your day-to-day diffs stay clean. Upgrading is the one thing that moves bytes without a code change: a release that corrects what a document says changes it on purpose and names it in the changelog, so docuccino:diff shows you what moved before you commit it.

A diff you can gate CI on

docuccino:diff --enforce compares two versions of your API and enforces a versioning policy. Ship a breaking change without the right version bump and the build fails.

An extension you can build on

The extension is documented and answers to a published JSON Schema. Export the full document with docuccino:export --format=full, validate it with docuccino:validate, and read every detail’s provenance — the same document the emitters and the diff run on.

Docuccino documents Laravel applications today. Nothing in the document it compiles — OpenAPI, plus the Docuccino extension — is Laravel-specific, so the emitters, the diff and the viewer are ready for whatever it’s fed next.

Coming from Scramble or Scribe? Each has a side-by-side comparison and a walkthrough for moving your annotations and config across.

Already stuck? Troubleshooting starts from what you can see — a thin document, an export that runs out of memory, an app that won’t boot in CI — and works back to the fix.