manggala/universal-panel
Universal Panel offers a flexible, configurable admin panel for Laravel apps, helping you build dashboards, resource CRUD screens, and management interfaces quickly with minimal boilerplate and full control over layout, navigation, and access.
composer require manggala/universal-panel — requires PHP ^8.2 and Laravel ^10 || ^11 || ^12. Nothing to build on the frontend: the default stack is 'blade', so you get a working panel before you touch Vite.
Run php artisan universal-panel:doctor immediately after install. It is the fastest smoke test in the package — it checks PHP version, PDO, Mbstring, and whether your Vite build is healthy. If the panel renders blank or 500s on first boot, run this before reading a single stack trace.
Publish config/assets and register your first panel in a service provider using the fluent builder from the release notes:
Panel::make('superadmin')->path('superadmin')->role('Superadmin');
Authentication is plug-and-play — /admin/login, /admin/register, /admin/forgot-password, /admin/reset-password, /admin/logout ship as views. Create the role your panel expects (make:role) before you hit the login page, or the role-based redirect will have nowhere to land.
First real use case: scaffold one CRUD end-to-end with php artisan make:panel-resource Post --generate. The --generate flag writes the Eloquent model and migration for you — review the migration, migrate, then visit /admin/posts. That single loop (generate → migrate → visit) tells you more about the framework's opinions than the docs will.
Where to look first: the doctor command, config/universal-panel.php (panel/stack defaults), and the generated resource class from step 5 — that file is the template for everything else you'll write.
One panel per audience, not per feature. The panel builder is designed around role-driven routing: superadmin at /superadmin, staff at /admin. Keep the mapping explicit (panel → path → role) and let the package handle post-login redirects. Resist creating a third and fourth panel for internal tooling; use the permission matrix instead.
Compose resources from generators, don't hand-roll. The suite gives you dedicated generators for forms, fields, actions, filters, and policies alongside the resource generator. The idiomatic workflow is resource → then generate the specific field/action/filter classes it needs, rather than inlining everything into one resource file. That keeps resources readable and makes custom field types reusable across modules.
Layer policies underneath the permission matrix. /admin/permissions is a GUI convenience — a checkbox matrix over modules (Posts, Pages, Media, Users, Security, Settings). Treat it as coarse gating. Generate policies (make:policy) for fine gating on individual records. Two layers, because the matrix alone won't express "editor can update their own posts only."
Let Spotlight fall out of registration. Cmd+K / Ctrl+K discovers registered CRUD resources automatically — you get quick search for free only if resources are registered through the panel. Custom system pages generally need explicit registration; if something isn't showing up in Spotlight, the first question is always "is it registered with the panel, or just a route?"
Pick the stack per panel. The multi-stack adapters (Blade, Livewire v2/v3, Inertia React, Inertia Vue v2/v3, REST) are a panel-level setting, not a global one. A common shape: Blade for the superadmin panel (zero build, fast iteration), Inertia Vue for a customer-facing panel. Resources are defined once; the adapter renders them. Test parity when you switch, because adapter coverage is rarely perfectly even.
Wire exporters/importers into background tasks. The importer/exporter and background task generators exist for a reason — CSV round-trips on any real dataset will exceed a request timeout. Generate the task, dispatch it, don't inline it in a controller action.
CI: add php artisan universal-panel:doctor as a pipeline step. It's a cheap gate that catches environment drift (missing extensions, stale Vite manifest) before deploy.
^8.2 || ^8.3 || ^8.4, but doctor is documented as checking for PHP 8.4+. On 8.2 or 8.3 you may get a failing diagnostic on a supported install — treat the doctor's PHP check as advisory until the package clarifies, and pin your CI PHP version explicitly so the discrepancy can't surprise you.laravel/framework ^13.0 is listed but does not exist yet. Constrain to ^10 || ^11 || ^12 in your own composer.json for now; the ^13 constraint is forward-looking and untested against a real release./admin. If you already own an /admin prefix, either move your existing routes or mount the panel elsewhere. Debug with php artisan route:list --path=admin — ordering matters and a wildcard from an earlier route will shadow the panel.--generate infers table names, columns, and possibly soft-deletes from the resource name. Skim the migration before migrate; renaming a table after the resource is wired up is a much larger job..no-scrollbar utility are shipped CSS. Publish assets and confirm they're loading; a broken sidebar width almost always means unpublished or unbuilt assets, which doctor's Vite check will usually surface.make:theme) for branding, plugins (make:plugin) for packaging cross-panel features, and custom field/action generators for anything domain-specific. Reach for a plugin before forking package views.How can I help you explore Laravel packages today?