kiritokatklian/nova-permission
A Laravel Nova tool for managing roles and permissions with Spatie's laravel-permission package. It adds a clean Nova UI to create roles, assign permissions, and attach roles to users, simplifying authorization management in Nova admin panels.
Architecture fit. Unchanged. kiritokatklian/nova-permission remains a Laravel Nova tool — registered via NovaServiceProvider::tools(), shipping a Vue/Inertia front-end and an API controller layer over the roles/permissions pivot tables owned by spatie/laravel-permission. It introduces no second source of truth and has no runtime role in request authorization, so blast radius stays confined to the admin plane. What 5.3.0 changes is not the architecture but the surface being adapted: the tool now targets a newer Spatie major, which is precisely the layer where its thinness is both an asset (little to reimplement) and a liability (little buffer when upstream semantics shift).
Integration feasibility. Still mechanically trivial and still gated on the same non-code constraint: Nova is a paid, closed-source product with major-version licensing. If Nova is already in the stack, marginal cost is near zero; if not, this package still cannot justify a Nova purchase. The release improves feasibility on one axis — a fresh install can now target a current Spatie line rather than pinning to an older one — and is silent on the other — it says nothing about a Nova version bump, so Nova 4/5 coupling is unchanged.
Technical risk. The picture moved in both directions:
@dsbaars) is a genuine governance signal — the maintainer is reviewing and merging, and the project is not a frozen snapshot. This is the first real data point against the fork-abandonment thesis.^6.0|^7.0|^8.0) or pivoted (dropped v6 to add v8), and whether the team/guard/cache code paths were tested against every still-supported Spatie major or only against v8. A single code path spanning multiple majors is exactly where silent guard/team misbehavior hides.Key questions.
laravel/nova composer constraint pinned to a single major?spatie/laravel-permission v8 that touches this tool — cache keys, teams, guards, or the HasRoles API — and was the tool's code path adjusted or merely re-constrained?Stack fit. Assumed matrix is now Laravel 10/11/12, PHP 8.1+, Laravel Nova 4 or 5, and spatie/laravel-permission v5 through v8 — but read the composer.json, not the release notes, as the contract. The release notes name only v8; which prior majors remain supported is the single most important thing to confirm before planning an upgrade.
Migration path. Still purely additive, which remains its strongest property:
composer remove plus deleting the tool registration.HasRoles trait, cache store config), then seeders that write your canonical role/permission set, then the tool as UI. Do not let the tool author your initial permission model; it should exist in code and be reviewable.Compatibility. Pin exact versions for laravel/nova, spatie/laravel-permission, and this package together; treat any bump of one as a coordinated change and never as an independent composer update. Before rollout, verify in staging: Nova boots, the tool menu renders, roles/permissions list and paginate, assignment writes land in the pivot tables, Gate::allows() reflects the change after a cache reset, teams-scoped assignments write the correct team_id, multi-guard assignments write the correct guard, and non-super-admin users cannot reach the tool. If you are currently stable on 5.2.0 + Spatie v6, there is no obligation to move — 5.3.0 buys you optionality, not capability.
Sequencing.
Gate::before so only a designated admin role can reach it. This step is not optional on any version.Maintenance. Assume you own this, and keep the vendored-fork or repositories VCS override plan in place. The release modestly improves the odds you will not need it — an actively merging maintainer is less likely to strand you on a Nova major — but it does not eliminate the obligation, and it adds a second drift vector: Spatie majors now move faster than your appetite to upgrade. Budget the same small recurring allowance (a day or two per quarter), plus a defined allowance for each Spatie major and each Nova major, because those are now two independent upgrade clocks to track.
Support. Unchanged: community only, GitHub issues, no SLA, no commercial backing. Escalation for a broken admin screen is "read the source." Acceptable for an internal admin tool; not acceptable if role administration sits on a compliance or audit path.
Scaling. Unchanged. Admin-plane traffic, single-digit concurrent users, small tables. Two caveats persist: large permission matrices (hundreds of permissions × dozens of roles) produce a heavy single-page Vue payload and a sluggish screen; and every mutation must invalidate Spatie's permission cache — confirm this explicitly rather than assuming, and re-confirm it on v8, since cache semantics are a common casualty of an authorization-library major.
Failure modes.
team_id; the record exists, authorization never passes. Fails closed, but generates "I gave them the permission" tickets. Elevated risk on 5.3.0 specifically, because one code path now spans multiple Spatie majors with different semantics.Ramp-up. Low for anyone fluent in Laravel and Nova; the learning curve is Spatie's authorization model, not this package — guards, teams, direct-vs-inherited permissions, and the caching layer. A developer who understands laravel-permission is productive in the tool within an hour; one who does not will misconfigure guards and teams regardless of UI quality. Note that the v6→v8 delta is now itself an onboarding item for the team — most tutorials and Stack Overflow answers still describe older Spatie semantics.
TPM read. 5.3.0 is a real but narrow positive: it evidences an active maintainer, a merged external contribution, and a current support matrix, and it retires the "pinned to a stale authorization library" objection that was the strongest argument for building in-house. It does not change the structural conclusion. This remains a cheap, reversible convenience layer over Spatie — adopt it only if Nova is already licensed and in use, gate it immediately, pin Nova/Spatie/this package as a triplet, and hold a fork-and-patch plan. The recommendation on when to skip it is unchanged: if Nova is not already in the stack, a ~1–2 day custom Nova resource or thin internal CRUD screen still buys you full control of the authorization model, guard/team handling, and audit trail for roughly the cost of one upgrade cycle of maintaining someone else's fork — and it removes the multi-major compatibility question entirely, because you only ever support the Spatie version you run.
How can I help you explore Laravel packages today?