Appearance
Commands
filamentcraft:install
bash
php artisan filamentcraft:install # guided install, with an example site
php artisan filamentcraft:install --no-example # start without the example site
php artisan filamentcraft:install --family=editorial # example site in another style family
php artisan filamentcraft:install --folio # wire a Folio storefront starter
php artisan filamentcraft:install --force # overwrite previously published files
php artisan filamentcraft:install --no-assets # skip the asset publish step
php artisan filamentcraft:install --keys=uuid # int (default), uuid or ulid primary keysThe guided install publishes the config and migrations, asks before running php artisan migrate, publishes the editor assets (skip with --no-assets), creates the storage:link symlink if it's missing, syncs theme DB rows (filamentcraft:sync-themes), and seeds a published example site (the filamentcraft:starter site) so you land on a working page. It finishes with a next-steps list that names the exact panel provider file(s) under app/Providers/Filament/ where the plugin should be registered.
Before migrating, a fresh install sets the primary key type of every FilamentCraft table: --keys= if you pass it, otherwise an interactive prompt that preselects your User model's key type. The choice is written to database.key_type in the published config. Once the tables exist, --keys is ignored with a warning. See Models & Keys.
The example site belongs to the first filamentcraft.tenancy.owner_model record when one exists. Install skips it when any site already exists, so re-running install never adds a second one, and when you decline the migration prompt, since it needs the tables. --example is still accepted for older scripts but no longer changes anything.
--folio scaffolds resources/views/storefront/ with a starter cart.blade.php, then prints the one-line Folio::path(...) registration to paste into your own FolioServiceProvider — it deliberately doesn't edit that file for you. Once registered, every Blade file in that directory auto-routes under /{tenantSlug}/* inside the FilamentCraft shell. If Folio isn't installed, the command warns (composer require laravel/folio) and moves on — the package never requires it.
filamentcraft:upgrade
bash
php artisan filamentcraft:upgrade # take a newer release
php artisan filamentcraft:upgrade --no-migrate # publish the new migrations, run them yourself
php artisan filamentcraft:upgrade --no-assets # skip the asset refreshRun this after every composer update of the package. Migrations ship as stubs that the installer copies into your database/migrations/, and the editor CSS/JS is copied into your public/ — composer update refreshes neither, it only replaces vendor/.
The command publishes the migration stubs added since your install (existing files are never touched, so it is safe to re-run), runs php artisan migrate --force, re-syncs the built-in themes, and refreshes the published editor assets. --force means a non-interactive production deploy applies the migrations instead of cancelling at Laravel's confirmation prompt, so it is safe to add to your deploy script as-is.
Skipping it is silent: the app boots and pages render against the older schema until something reaches for a column or a data normalisation that never landed. filamentcraft:doctor fails on both halves — it names each unpublished migration and each missing column — so a CI step of php artisan filamentcraft:doctor --strict catches a forgotten upgrade before your visitors do.
filamentcraft:doctor
bash
php artisan filamentcraft:doctor
php artisan filamentcraft:doctor --strict # warnings also exit non-zero
php artisan filamentcraft:doctor --json # machine-readable output for CIDiagnoses the installation end-to-end, grouped into sections:
- Environment — FilamentCraft / Laravel / Filament / Livewire / PHP versions at a glance.
- Database — all
filamentcraft_*tables exist, plus the columns added by upgrade migrations (catches "updated the package but never ran the new migrations") and the migration stubs this release ships that were never copied intodatabase/migrations(catches "updated the package but never published the new migrations" — including data-only migrations that leave no missing column behind). See Upgrading. It also fails whendatabase.key_typeno longer matches the migrated key columns, and warns whensites.owner_idcan't hold your owner model's keys. - Panel — the plugin is registered on a Filament panel and the editor is enabled; panel plugin misconfiguration (e.g. an unregistered default theme) is surfaced here.
- Configuration — lists each model override and warns when one changes the table name. Every config value is validated: typed keys that would throw mid-request (quoted booleans from
.envare the classic), tenancy mode / owner model /single_site_idsanity, region names, editor devices and control size, starter family, the cache store (undefined store names and silently-untagged stores), and the uploads disk — including a comparison ofuploads.max_size_kbagainst your PHPupload_max_filesize/post_max_sizelimits. - Themes — registered classes vs their DB rows, orphan theme slugs, and bogus
themes.registerentries. - Sections — at least one section registered, invalid
sections.registerclasses, missing discovery paths, typo'd slugs inallowed/disabled, slug overrides, the registered commerce catalogs, and invalidcommerce.catalogsclasses. - Content — live sites and published homepages, plus deep integrity scans of every published page and region: section types that match no registered section (the public render silently drops those), legacy payloads, published templates without a published revision, commerce sections used without a
Storefrontbinding, commerce sections pointed at a catalog nothing registers, and Contact / Newsletter sections whose submissions go nowhere (forms.storeoff and no listener bound). Fails whenforms.storeis on but the submissions table was never migrated. Also lists sections that threw on a real public request — those are dropped from the published page, so without this the only trace isreport(). Warns when sites are domain- or subdomain-mapped butfilamentcraft.domain.primaryis empty. - SEO — pages missing a meta description, duplicate titles within a site, a missing default share image, sites left on
noindex, and whether FilamentCraft actually serves/sitemap.xml,/robots.txtand/llms.txt— including the case where a staticpublic/robots.txtorpublic/sitemap.xmlshadows the dynamic route. - Assets — every published asset exists in
public/and is not stale (an older copy than the package ships means a previous version is still being served after an update), plus a manifest check for each configured Vite build. - License — whether a key is set and the watermark state.
Every failed check prints a remediation hint (the exact command or config change to make), and the command exits non-zero when any check fails — so it slots straight into a CI or deploy pipeline as a post-deploy smoke check. Use --strict to also fail on warnings, and --json for a structured {status, environment, summary, checks} payload.
php artisan about
FilamentCraft registers a section in Laravel's about output: package version, registered theme and section counts, tenancy mode, public-routes state, and whether a license key is set.
filamentcraft:sync-themes
bash
php artisan filamentcraft:sync-themesEnsures every registered theme class has a matching Theme DB row (matched by slug, created if missing). The install command runs it for you after migrating; run it manually after registering a new theme with ->registerTheme(...).
Seeding & starter sites
bash
php artisan filamentcraft:starter # provision a starter site (default family)
php artisan filamentcraft:starter --family=bold --owner=7 --name="Acme"
php artisan filamentcraft:seed-blueprints # seed registered blueprints into all sites
php artisan filamentcraft:seed-blueprints --site=3 # only site id 3
php artisan filamentcraft:seed-blueprints --owner=7 # all sites of one owner (tenant)
php artisan filamentcraft:seed-blueprints --force # re-seed even if templates already exist
php artisan filamentcraft:seed-blueprints --dry-run # print what would be seeded, write nothingfilamentcraft:starter provisions a complete, published seven-section homepage in one of four style families (modern, editorial, bold, elegant); --family defaults to filamentcraft.starter.family, and --name defaults to the owner name, then the family label. See Starter sites for the families, the one-line StarterSiteBlueprint::seed() DX, and the StarterSiteSeeder.
filamentcraft:seed-blueprints seeds every registered blueprint into the selected sites, skipping blueprints a site already has unless --force is passed. --owner resolves sites through filamentcraft.tenancy.owner_model.
Make commands
bash
php artisan make:filamentcraft-section Testimonial
php artisan make:filamentcraft-theme Acme
php artisan make:filamentcraft-blueprint EventHome
php artisan make:filamentcraft-blueprint EventStarter --site
php artisan make:filamentcraft-model SiteAll four prompt interactively when you omit the name. The section, theme and blueprint commands add the conventional class suffix (Section, Theme, Blueprint / SiteBlueprint) automatically.
make:filamentcraft-section scaffolds the section class + matching Blade view (or a LivewireSection with --livewire). Flags: --slug (editor slug, defaults to the kebab-cased class name), --namespace (default App\Sections), --path (default app/Sections), --view-path (default resources/views/sections), --view (dot-notation view name), and --force.
make:filamentcraft-theme scaffolds an AbstractTheme subclass under app/Themes/ with a minimal settingsSchema() to fill in. Flags: --slug, --namespace (default App\Themes), --path (default app/Themes), and --force.
make:filamentcraft-blueprint scaffolds a page blueprint — or, with --site, a SiteBlueprint (a full-site starter preset listing page blueprints). Flags: --slug (page blueprints only), --namespace (default App\Blueprints), --path (default app/Blueprints), and --force.
make:filamentcraft-model scaffolds a subclass of a FilamentCraft model (Site, Template, TemplateRevision, Theme, Region, Media, CustomFont, Redirect, SectionDefinition, AiUsage, Submission) and registers it under models in the published config, so the package uses your class everywhere. Without a published config it prints the entry to add. Flags: --namespace (default App\Models\FilamentCraft), --path (default app/Models/FilamentCraft), and --force. See Models & Keys.
filamentcraft:customize-section
bash
php artisan filamentcraft:customize-section
# Safe additive variant; the original Hero remains available
php artisan filamentcraft:customize-section hero ProductHero
# Existing hero instances resolve through the generated subclass
php artisan filamentcraft:customize-section hero ApplicationHero --replace
# Take application ownership of the selected Blade view too
php artisan filamentcraft:customize-section hero ApplicationHero --replace --copy-viewWith no arguments, the command provides a searchable picker across all 38 built-ins, makes variant mode the safe default, explains inherited versus copied views, and shows an impact summary before writing.
Flags: --replace (preserve the source slug application-wide), --slug (variant only), --copy-view, --namespace (default App\Sections), --path (default app/Sections), --view-path (default resources/views/sections), and --force.
The generated subclass inherits settings, blocks, presets, defaults, rendering behavior, and Livewire actions. The original package PHP is never copied. See Customizing Built-in Sections for schema composition, view ownership, upgrades, diagnostics, and rollback.
