silvanite/novatoolpermissions
A Laravel Nova tool for managing roles and permissions directly from your admin panel. Assign permissions to roles and users through a clean Nova UI, register custom permissions, and keep access control organised without leaving Nova.
Architecture fit. silvanite/novatoolpermissions is a Laravel Nova tool that renders an admin UI over spatie/laravel-permission. It manages roles, permissions, and which Nova tools appear in navigation for a given user. It is not an authorization engine — enforcement stays in Laravel gates, policies, middleware, and application-level hasPermissionTo checks. The strategic read for a TPM is that this is a thin, replaceable presentation surface sitting on top of a durable schema. If the tool dies, the Spatie tables survive and can be driven by seeders, Artisan commands, or in-house screens. That containment is the primary reason to evaluate it at all; it means the blast radius of adopting a dormant dependency is a UI replacement, not a data migration.
Integration feasibility. Mechanically simple: composer require, register the tool in NovaServiceProvider::tools(), publish config, run Spatie migrations, and gate the tool itself behind a permission. The real work is dependency resolution, guard-name alignment, and reconciling whatever currently owns role data into Spatie as the single source of truth. A TPM should also frame the "hide unauthorized tools from the Nova sidebar" feature correctly for stakeholders: it is an admin UX improvement, not a security boundary. It reduces clutter and accidental discovery; it does not stop a determined user who can hit the underlying resource routes directly.
Technical risk. The core risk is momentum, not capability. Last release 2019-04-28, ~100 stars, zero dependents, effectively one maintainer, MIT. It tracks two of the fastest-moving dependencies in the ecosystem — Nova and Spatie — both of which have changed substantially since 2019. Installability against a current stack is a coin flip until proven. The documented v1.0.9 change is the tell: a patch release changed slug semantics from field name to attribute name and required slug field ^1.2.3. That is a breaking parameter change shipped as a patch, and its failure mode is silent — wrong or missing slugs rather than an exception. For a permissions-adjacent tool, silent wrongness in an admin UI that writes role data is the worst class of defect.
Key questions before commitment.
composer require --dry-run resolve against them?spatie/laravel-permission already our system of record, or would this create a second place where authorization data is defined?TPM stance. Proceed only as a time-boxed pilot with a written kill criterion. Acceptable as a convenience UI behind our own authorization logic; unacceptable as load-bearing security infrastructure.
Stack fit. Only a fit for a Laravel + Nova shop that has already standardized on Spatie for roles/permissions. Poor fit if Nova is not already the admin surface, if roles are developer-authored and rarely change, if we are mid-migration to a newer Nova major, or if we need a maintained dependency in the authorization path. There is no reuse outside Nova — the entire value is the Nova screens.
Migration path. Time-boxed spike with explicit exit criteria, not a rollout.
slug; confirm each passes an attribute name, pin the slug field to ^1.2.3, and add regression tests asserting stable slugs on create and update.config:clear, cache:clear, optimize:clear. Cached config is the classic way this change hides until production.Compatibility. Four constraints must hold simultaneously: Nova major, PHP version, Spatie major, and slug field ^1.2.3. They interact — bumping Spatie to a supported release is likely to break the tool regardless of the slug issue. Sequence dependency work before the tool install so we fail fast on the expensive constraint.
Sequencing rationale. Enforcement before UI; audit before upgrade; spike before ticket. Each step is cheap to reverse. The expensive mistakes — a double source of truth, unenforced permissions exposed to admins, blind patch upgrades — are all avoided up front.
Maintenance. Assume we own it. A 2019 package with zero dependents will not receive fixes for current Nova or Spatie releases. A TPM should name a fork owner, pin versions explicitly, and budget a small maintenance reserve. MIT plus a small code surface makes a fork realistic — but only if someone is actually named to carry it. "Someone will fix it if it breaks" is not a plan, and this is the single most likely failure of the whole initiative.
Support. No vendor support, no issue-response expectation, and no security advisories channel. Internal support means the owning team fields questions from admins using the screens and handles the eventual version-compatibility incident. Treat this as an internal tool with an internal SLA, not a purchased product.
Scaling. Two axes. First, permission cardinality — the Spatie permission cache is per-user, and permission sets that grow into the hundreds with frequent edits make cache invalidation the operational hotspot; plan a rebuild step into any bulk edit workflow. Second, guards and tenancy — the tool's model must match ours. If we run multiple guards or per-tenant role scoping, verify behavior before committing; retrofitting tenancy into a UI that assumes a single default guard is custom work, which collapses the build-vs-buy saving.
Failure modes to plan for.
Ramp-up. Low technical ramp for admins — the value proposition is precisely that non-developers can manage roles without a deploy. The ramp that matters is organizational: documenting who may grant what, establishing an approval habit before the screens go live (the tool provides no approval workflow or audit trail — those remain ours), and training admins that hiding a Nova tool is convenience, not security. Budget a short enablement pass and a written permission-administration policy alongside the pilot; the tool removes the developer bottleneck, which means it also removes the informal checkpoint that bottleneck provided.
How can I help you explore Laravel packages today?