Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Filament Feature Flags Laravel Package

ryangjchandler/filament-feature-flags

Filament Feature Flags adds a simple feature flag system to Filament panels, letting you toggle features on and off per user or globally using Laravel's Pennant. Define flags, control access with policies, and conditionally show resources, pages, and widgets.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • The package is a thin Filament admin-panel adapter over Laravel Pennant. The real architectural dependency is Pennant, not this plugin — if the platform isn't on Pennant, this package is not applicable, and if we're on LaunchDarkly/Unleash/a bespoke settings table, adopting this means adopting Pennant first.
  • It lives entirely in the admin plane: a Filament page/resource registered against a panel via the plugin API, composing with Filament's existing auth, navigation, and policy layer. It should never sit on the request-serving critical path.
  • Composable and reversible by design: removing the plugin registration leaves Pennant and its data intact.

Integration feasibility

  • Composer require + one ->plugin(...) call in the PanelProvider, plus Pennant installed and migrated. Low wiring effort.
  • The actual engineering work is not installation — it's authorization (who may toggle flags in production), scope semantics (global vs. per-user/per-team), and an audit trail. Budget for those, not for the install.

Technical risk

  • Adoption signal is effectively nil — zero dependents and no visible stars means no production reference implementations to learn from and no community regression pressure. This is the dominant risk, and it's a supportability risk, not a runtime risk.
  • Bus factor of one. Single-maintainer plugin sitting on Filament's plugin API, which is not a stable cross-major contract. A Filament v4 upgrade is a plausible breakage point with no guaranteed upstream fix.
  • Scope mismatch hazard: Pennant supports scoped features and rich (JSON) values. A global toggle UI can misrepresent a flag that is on for a subset of users, creating false confidence ("flag is off") during incident response.
  • Cache semantics: Pennant caches resolutions; confirm the UI invalidates correctly, or toggles appear to no-op.
  • Unverified as published: test coverage/CI, licence, Pennant and Filament version constraints, whether boolean-only or rich values are supported.

Key questions

  1. Which Filament majors (v3/v4) and Pennant versions are constrained? What's the stated upgrade path?
  2. Does the UI support scoped features, or only the global/unscoped scope? Does it expose rich values?
  3. How is authorization enforced — Filament policies/gates by default, or is the page visible to anyone with panel access?
  4. Is there an audit trail (who toggled what, when, previous value)? If not, how cheaply can we add it?
  5. Is there a programmatic API, or is this UI-only?
  6. Does it handle Pennant cache purging on toggle?
  7. Test coverage, CI status, release cadence, licence?
  8. What is the source size? (Determines whether forking is cheaper than adopting.)

Integration Approach

Stack fit

  • Go/no-go gate: Laravel 10/11 + Filament + Pennant already in use or planned. If flags are resolved through anything else, stop here — the plugin adds a second flag system, which is worse than none.
  • Best fit: an internal-tools team already fluent in Filament that wants a UI for engineering-owned flags, not a product-team-facing experimentation platform.

Migration path

  • No data migration of ours: Pennant owns the features table. The plugin is additive — install Pennant, define features in code (ideally a backed enum), then expose the panel page.
  • Exit cost is near zero, which materially de-risks the adoption decision: drop the plugin registration and flags keep working. This is the strongest argument for trying it rather than building.
  • Conversely, the replacement cost is also near zero (a small Filament resource over Pennant's table), which caps the value of tolerating an abandoned package.

Compatibility

  • Pin exact versions in composer.lock; treat the plugin as version-locked infrastructure. Add a smoke test that boots the panel and loads the page, so a Filament bump fails in CI rather than in an admin's browser.

Sequencing

  1. Confirm Pennant adoption and define the initial feature set as code (enum/class-based), so flags are typed and greppable.
  2. Spike the plugin in a non-production panel; verify scope behaviour, cache invalidation, and rich-value handling.
  3. Wire RBAC: gate the page behind a dedicated permission; hide it from all non-admin roles by default.
  4. Add what's missing — audit logging on toggle, and an environment guard if production toggling isn't sanctioned.
  5. Publish a flag lifecycle policy (naming, owner, expiry, cleanup) before the first flag ships.
  6. Staging pilot, then production with restricted access.
  7. Set a review trigger at the next Filament major: adopt upstream, fork, or replace with ~200 lines of in-house resource.

Operational Impact

Maintenance

  • Realistically this becomes a soft fork on day one: single maintainer, no dependent base, no visible release cadence. Assign a named owner and budget a few hours per Filament upgrade cycle.
  • Ongoing cost is dominated by flag hygiene, not the package — dead flags accumulate in the table and the UI makes creating them frictionless. Require an owner and expiry per flag.

Support

  • No Stack Overflow or community footprint; support means reading the source (likely small) or forking. Acceptable for a Filament-fluent team; unacceptable if anyone expects vendor SLAs. Do not put this behind a critical incident runbook without a fork-owner.

Scaling

  • Runtime cost is negligible — an authenticated admin page doing a handful of reads/writes against a small table. Pennant's caching keeps flag resolution cheap at request time, which is the number that actually matters.
  • Watch table growth only if per-user scoped flags get created programmatically at volume; that's a Pennant modelling concern, and the UI shouldn't be minting per-user rows.

Failure modes

  • Unauthorized production toggle — highest blast radius item; a mis-set flag can break checkout for everyone. Mitigate with a gate, audit log, and ideally an environment restriction.
  • Stale cache after toggle — flag appears changed but request-time resolution disagrees. Verify in the spike.
  • Scope confusion — global-looking UI, partially-on flag; dangerous during incidents. Mitigate with training and by restricting the UI to global flags only.
  • Upstream abandonment / Filament major bump — page breaks. Mitigate with pinned lockfile, CI smoke test, and the known fork path.
  • Silent drift — flags changed via UI diverge from feature definitions in code. Mitigate by treating code as the source of truth for which flags exist and the UI only for their state.

Ramp-up

  • Integration: an afternoon for a Filament-fluent engineer.
  • Team ramp: the real cost is teaching Pennant scope/value semantics and the flag lifecycle policy — a short internal write-up plus a convention (enum-backed features, owner + expiry) covers it. Low training burden overall, and the exit cost stays low enough that a failed pilot costs roughly the same afternoon it took to adopt.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
uni-method/symfony-lib
tacticmedia/scim-server-bundle
neika-ai/symfony-bundle
mattleads/agent-publishing-bundle
glavweb/framework-bundle
glavweb/extra-bundle
glavweb/api-bundle
glavweb/admin-bundle
adachsoft/api-version-bundle
elsayed85/laravel-api-exceptions
ouhssini/laravel-demo-mode
daworks/ncloud-outbound-mailer-driver
gp247/cms
ignibyte/aic-gates
nexa-merchant/blog
novasa/laravel-language-center
opencage/geocode
adolfoholzer/parameters
livenetworks/ln-starter
cgv/localized-resource