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

  1. php artisan migrate — create the plugin tables (posts, docs tree, SEO morph, API keys, delivery log).
  2. Seed the Shield CMS permission matrix — editor, author, and user rows must carry Shield permission rows, not just role names, or the Roles UI counts zero and RolePolicy 403s. Keep super_admin as the all-permissions role. Do not push these roles into the template.
  3. Wire AdminBar::newItems(...) and AdminBar::editUsing(...) so the toolbar links to the clone's edit routes for the current Post / Doc.
  4. 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.

See also

Built by Qcentic