jeffgreco13/filament-breezy
Enhanced security for Filament v4 panels. Adds a customizable profile page with avatar, password updates, two-factor authentication with recovery codes, passkeys, Sanctum token management, and active browser session controls. Installs in minutes.
Architecture fit
BreezyCore::make() registered via ->plugins([])), which means it sits at the same architectural layer as your panel providers — not in your domain layer. It adds Livewire page components (My Profile, 2FA challenge, passkey auth) and a TwoFactorAuthenticatable trait on the Authenticatable model.Integration feasibility
composer require, php artisan breezy:install, add the plugin to the panel, add Breezy's views to your Tailwind v4 theme via @source '../../../../vendor/jeffgreco13/filament-breezy/resources/**/*', optionally publish views.myProfile(shouldRegisterUserMenu:, userMenuLabel:, shouldRegisterNavigation:, navigationGroup:, hasAvatars:, slug:), passwordUpdateRules(rules:, requiresCurrentPassword:), enableTwoFactorAuthentication(force:, action:, authMiddleware:, scopeToPanel:). That is a well-designed escape-hatch surface: you can swap the profile page class (customMyProfilePage), the 2FA page, the auth middleware, the avatar upload component, and individual profile sub-components by key (personal_info, update_password, two_factor_authentication, sanctum_tokens, browser_sessions).avatar_url), $fillable, and HasAvatar on the User model. That is your schema change, correctly, not a package migration you inherit.Technical risk
scopeToPanel: true (the default) means 2FA is enforced only for that panel — other panels, and all API routes, stay unguarded unless you extend coverage. Passing authMiddleware: false silently disables enforcement unless you register MustTwoFactor yourself. force: true without a recovery communications plan produces a lockout wave on deploy.getProfileFormComponents(), you must keep getCurrentPasswordComponent() in the returned array — otherwise the email-change re-authentication guard silently disappears. That is a security regression that passes code review and tests unless someone tests the exact flow.PanelProvider, an incompatibility is a panel boot failure — high blast radius, zero graceful degradation.jeffgreco13/... but the repository is Jacobtims/filament-breezy. Combined with Dependents: 0 against a badge showing substantial downloads, provenance and adoption evidence both need independent validation before you make it a dependency of an admin surface.Key questions
Jacobtims/filament-breezy the canonical upstream, a maintained mirror, or a fork? Who has commit rights, and how are security advisories disclosed?SECURITY.md?scopeToPanel: true intentional guidance, or a default we should override in a multi-panel install?Stack fit
HasApiTokens), database sessions for browser-session management, HTTPS + configured RP ID for passkeys.authGuard from the panel. For a multi-panel product (e.g., admin + customers), you must confirm that each guard's model extends Authenticatable, and decide deliberately whether 2FA is scoped per panel or global.Migration path
TwoFactorAuthenticatable trait and the avatar_url migration as a forward-only, nullable migration; backfill nothing.BreezyConfig service provider or config class so every setting is reviewable in one diff and portable if you ever replace the package.Compatibility
composer.json, and treat Filament upgrades as joint, gated changes.@source line is a build-pipeline contract: add it, commit the theme, and add a CI check that the compiled CSS contains Breezy classes so a missing rebuild fails the build rather than shipping an unstyled profile page.Sequencing
Password::default()->mixedCase()->uncompromised(3)), requiresCurrentPassword: true. Ship to internal/admin panel first.force: false), with recovery-code UX and a published help article.force: true only after user comms and after an ops recovery runbook exists; scope explicitly and consciously.Maintenance
^ ranges.Support
force: true ships.Scaling
scopeToPanel / authMiddleware you must reason about. Standardize on one pattern early.Failure modes
| Failure | Symptom | Mitigation |
|---|---|---|
| Theme not rebuilt after install | Unstyled/broken profile UI in prod | CI CSS assertion; commit compiled theme |
force: true with no comms |
Mass lockout on deploy | Staged rollout, recovery runbook, feature flag off-switch |
scopeToPanel: true left default |
2FA unenforced on other panels/APIs | Explicit config + test asserting enforcement |
authMiddleware: false without manual registration |
Silent 2FA bypass | Config lint / test |
Override drops getCurrentPasswordComponent() |
Email-change takeover path reopens, silently | Regression test on email-change flow |
| Sanctum or session driver absent | Token or sessions screen errors/blanks | Pre-flight checks in install docs |
| Passkey RP ID mismatch | Passkey auth fails or registers unusably | Environment config validation |
| Filament major upgrade | Panel provider boom, admin unavailable | Joint pinning; staging-first upgrade |
Each of these needs a named owner and a rollback step; the 2FA ones need a kill switch you can flip without a code deploy.
Ramp-up
How can I help you explore Laravel packages today?