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.
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:
composer require docuccino/laravelcomposer require --dev docuccino/inference-phpstanphp artisan docuccino:exportReaders 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.
composer require --dev docuccino/laravel docuccino/inference-phpstanphp artisan docuccino:exportRead the docs locally, ship nothing: composer install --no-dev puts neither package in your
production vendor/.
composer require --dev docuccino/laravel docuccino/inference-phpstanphp artisan docuccino:export --out=build/openapi.jsonExport in CI and upload the artifact to whichever documentation host you use. Both packages stay dev-only, because your app never serves the docs.
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.