mominalzaraa/filament-team-guard
Filament Team Guard adds team-based access control to Filament panels: assign users to teams, switch the active team, and automatically scope resources, pages, and queries so each team only sees its own data. Ideal for secure multi-tenant admin panels.
Package shape. filament-team-guard is a Laravel package that bridges Jetstream's team model into Filament panels. Architecturally it sits on three seams: (1) a Laravel service provider that binds Jetstream contracts into the container, (2) a Filament plugin that registers panel resources/pages, and (3) Livewire components that replace or override Jetstream's own team-management UI. The App\Actions\FilamentJetstream\UpdateTeamName namespace reveals a fourth surface: publishable action classes copied into the host application, mirroring Jetstream's own App\Actions\Jetstream\* convention.
What v2.1.1 actually tells us. The regression being fixed is a container-dispatch bypass. UpdateTeamName was calling $team->update() directly instead of resolving the UpdatesTeamNames contract from the container. That is a small code delta with an outsized signal: the package had duplicated persistence logic inside a Livewire component rather than delegating to the documented extension point. The consequence was silent — teams that had published and customized their UpdateTeamName action saw the package ignore it, with no exception and no log line. Only a user-reported issue (#1) surfaced it.
The fix is architecturally correct and restores the idiomatic Laravel pattern: the component resolves UpdatesTeamNames from the container, the host app rebinds it to its published action, and customization works as documented. The added integration tests covering both default and custom bindings are the more durable win — they encode the contract seam as a tested invariant, which is what was missing.
Technical risk. Three concerns:
Key questions for the maintainer / spike:
$this->authorize() / policies, or does it maintain a parallel permission model?main the only supported line?TeamUpdated event?Stack fit. Clean for a Laravel + Jetstream (teams enabled) + Filament application on a standard Livewire front end. The package follows framework conventions rather than fighting them, which is the main thing a TPM should care about at evaluation time — it means the integration cost is configuration, not adaptation. Applications running Filament without Jetstream teams, or Jetstream in personal-account-only mode, are out of scope.
Migration path. v2.1.1 is a patch on the 2.1 line: no migrations, no config schema changes, no removed APIs. Upgrade is composer update plus a container rebuild.
One caveat worth sequencing around. The fix is a behavioral change even though it is a patch. Any team that hit the bug and worked around it by rebinding UpdatesTeamNames in a service provider will now have that binding honored — which is the intended behavior, but it means previously-dead code becomes live. Sequence accordingly:
2.1.1, run composer update on a branch.UpdatesTeamNames bindings and App\Actions\FilamentJetstream\UpdateTeamName overrides; confirm what will now execute.TeamUpdated dispatches, and any audit listener still receives it.Compatibility. The isolated SQLite test configuration is a small but real signal of maintainability hygiene; it lowers the barrier for the host team to run the package's own suite in CI when validating an upgrade.
Maintenance. Single-maintainer package at v2.1.1 with issue #1 being the first filed report. That combination — a 2.x version number on a project with negligible issue history — means the semver major is not a reliable maturity signal. Budget for the possibility that the maintainer steps away, and treat the fork option as realistic rather than theoretical. The package's footprint (a provider, a Filament plugin, a handful of Livewire components) is small enough that an in-house fork is a days-not-months proposition if needed.
Support. No evidence in the release notes of a security policy, LTS branch, or backport commitment. Assume main is the only supported line and pin explicitly in composer.json rather than floating on ^2.1.
Scaling. Operationally negligible. The package adds a Livewire component render and a single contract resolution per team-name update — not a hot path. No queue workers, no scheduled jobs, no cache layer introduced. Scaling concerns sit entirely with the host application's database and Filament panel performance, not this package.
Failure modes to instrument.
Ramp-up. Low for a Laravel developer already fluent in Jetstream's action/contract pattern — the delegation model is idiomatic and the customization path is a single published class. Budget roughly half a day for a developer new to Jetstream teams to read the published action, understand the container binding, and write the regression test described above. The release notes themselves are well-formed (issue link, contributor credit, explicit description of the contract seam), which is a positive maintenance signal despite the low release count.
How can I help you explore Laravel packages today?