Overview and enable recipe
Plugins are optional on a clone. Media Drive ships in the template already; the clone adds the rest only when the product needs them. The docs-stack set — filament-seo, filament-blog, filament-docs, filament-admin-bar, filament-content-api — is the canonical CMS plugin group for a docs + blog + landing product (ADR 0008). Shield and Drive are not docs-stack plugins; they are already on the template.
Composer
While developing, require each plugin from a path repository — either 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.
Enable in a PanelProvider
Add the plugins to the panel that owns the CMS resources — typically the admin panel:
->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 permission matrix —
editor,author, anduserrows must carry Shield permission rows, not just role names, or the Roles UI counts zero andRolePolicy403s. Keepsuper_adminas the all-permissions role. Do not push these 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/*).
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.
Public HTML stays in the clone
Plugins own tables and Filament resources. They do not ship a themed landing page, docs chrome, or blog index. Post::publicPath() defaults to /blog/{slug} and Doc::publicPath() to /docs/{path} — override in the clone if the product uses other prefixes. Brand, CSS, logo, and panel colors are clone work, never plugin work.