Enable docs stack
After cloning template/, enable the docs-stack plugin set on the panel that owns the CMS resources. The template already ships Drive and the installer; this step adds SEO, Blog, Docs, Admin bar, and Content API (ADR 0008).
Composer
While developing, require each plugin from a path repository — the workstation plugins/<name> checkout or a copy inside the clone's packages/:
composer require qcentic-edge/filament-seo:@dev \
qcentic-edge/filament-blog:@dev \
qcentic-edge/filament-docs:@dev \
qcentic-edge/filament-admin-bar:@dev \
qcentic-edge/filament-content-api:@dev
Once remotes exist (Qcentic-Edge/filament-*), switch the path entries to vcs repositories and tag a version. The package names do not change.
Register in a PanelProvider
Add the plugins to the admin panel — the panel that owns the CMS resources:
->plugins([
FilamentShieldPlugin::make(),
MediaDrivePlugin::make(),
FilamentSeoPlugin::make(),
FilamentBlogPlugin::make(),
FilamentDocsPlugin::make(),
FilamentContentApiPlugin::make(),
FilamentAdminBarPlugin::make(),
]);
FilamentContentApiPlugin belongs on the admin panel; it is optional on a second app panel and absent from the published template by default.
Then
php artisan migrate— create the plugin tables (posts, docs tree, SEO morph, API keys, delivery log).- Seed the Shield CMS matrix. The template seeds
super_adminanduseronly; the clone addseditorandauthorwith shrinking Shield permission rows — not just role names, or the Roles UI counts zero andRolePolicy403s. Keepsuper_adminas the all-permissions role. Copy theRoleSeeder+ShieldPermissionMatrixpattern fromexperiments/agency-site/app/database/seeders/; do not push those roles into the template. - Wire
AdminBar::newItems(...)andAdminBar::editUsing(...)so the toolbar links to the clone's edit routes for the current Post / Doc. - Add the public routes in the clone's
routes/web.php:/,/docs,/blog, and/sitemap.xml. Render them with the clone's Blade (resources/views/site/*).
The matrix shrinks as: super_admin (all) > editor (everything except :Role, :User, and the counts chart; full :Post / :Doc / :Media plus View:*) > author (write-only on :Post, :Doc, and a subset of :Media) > user (View:ApiTokens only).
Content API and discovery
The Content API writes Posts and Docs because those resources sit on the panel. The plugin reads $panel->getResources() and exposes them as REST endpoints, API-key abilities, and webhook events automatically. There is no per-model ContentApi::resource() call for Post or Doc — only for models with no Filament resource.
Flow
flowchart TD
A["Clone PanelProvider<br/>->plugins(...)"] --> B["migrate"]
B --> C["seed Shield CMS matrix<br/>editor / author / user"]
C --> D["public routes<br/>/ /docs /blog /sitemap.xml"]
D --> E["product live"]