backstage/installer
Installer package for Backstage that walks you through the initial Laravel setup—publishing configuration, running migrations, and creating your first admin account—so new installations are fast, repeatable, and free of manual steps.
This release (v0.0.4) is the Filament v4 compatibility line. Treat it as the minimum version to install on any Filament v4 panel; earlier tags target v3 and will not boot against v4's schema/action namespaces.
composer require <vendor>/<package>:"^0.0.4"
php artisan vendor:publish --tag="<package>-config"
php artisan vendor:publish --tag="<package>-migrations"
php artisan migrate
Then register the plugin on the panel you actually use, in app/Providers/Filament/AdminPanelProvider.php:
public function panel(Panel $panel): Panel
{
return $panel
->plugins([
\Vendor\Package\PackagePlugin::make(),
]);
}
Where to look first, in order:
config/<package>.php — almost everything day-to-day is toggled here (navigation group, feature flags, table names, route prefix).First realistic use case: install locally, register the plugin, log into /admin, and confirm the plugin's pages/widgets appear in the navigation. That single smoke test validates the v4 wiring (panel registration, asset loading, Livewire 3 compatibility) before you invest in configuration.
Panel-scoped registration. Only register the plugin on the panels that need it. In a multi-panel app (AdminPanelProvider, AppPanelProvider), registering globally via a service provider is the most common source of "why does this show up in the customer portal" bugs. Keep ->plugins([...]) explicit per panel.
Compose with v4 schemas, don't fight them. Filament v4 unified forms and infolists under Filament\Schemas\Schema. When the package exposes form components, drop them into your resource's schema method rather than wrapping them in your own Form object:
use Filament\Schemas\Schema;
public static function form(Schema $schema): Schema
{
return $schema->components([
// your fields
...PackagePlugin::formComponents(),
]);
}
Actions live in Filament\Actions. If the package ships table or page actions, the v4 namespaces apply — don't copy v3 snippets from the package's older docs or from blog posts, they'll fatal on class-not-found.
Config over forking. Most plugin behaviour (labels, navigation sort, tenancy scoping, feature toggles) is exposed through the config file. Publish it, commit it, and change it there. Forking the package for a label tweak is the fastest way to make the next 0.0.x bump painful.
Testing. Use Filament's panel test helpers so the plugin's pages resolve in the test panel:
use Livewire\Livewire;
it('renders the plugin page', function () {
$this->actingAs(User::factory()->create());
Livewire::test(\Vendor\Package\Pages\SomePage::class)
->assertSuccessful();
});
Add a test that hits the panel root as an authenticated user — it catches registration and asset-pipeline regressions cheaply.
Upgrade workflow. Because this is a 0.0.x line, pin exactly ("^0.0.4" at most) and read the diff between tags before bumping. Run php artisan optimize:clear and php artisan filament:assets after every update, then re-run your panel smoke test.
Filament\Forms\Form → Filament\Schemas\Schema, and table/page actions moved to Filament\Actions. Any local override or published view copied from a v3 install will break silently or throw Class not found.@source directives pointing at vendor views. A stale compiled theme is the usual cause of "the plugin's UI looks unstyled" — rebuild with npm run build, don't just clear caches.php artisan filament:assets (and vendor:publish --force for the package's public assets) is not optional; forgetting it produces 404s on JS/CSS that look like package bugs.php artisan filament:optimize; when debugging missing pages/widgets locally, run php artisan filament:clear-cached-components before assuming the plugin is broken.--force migrations in a deployed environment.config/<package>.php changes need php artisan config:cache re-run. Plugin registration lives in the panel provider, so it's covered by optimize, but published config is not.tenant() model automatically in 0.0.x releases.0.0.x, public methods and config keys can change between patches. Wrap any direct calls into package classes in a thin adapter or service of your own so a rename is a one-file fix.php artisan about (confirm Filament + Laravel versions) → check the panel provider actually registers the plugin → filament:clear-cached-components → optimize:clear → rebuild assets. That sequence resolves the large majority of "it worked yesterday" reports.How can I help you explore Laravel packages today?