sanjabteam/sanjab
Sanjab is a Laravel admin panel package that builds dashboards, CRUD screens, widgets, and permissions from simple configuration. It bundles media management, localization, and extensible tools for creating back-office interfaces quickly, with support for Persian and other languages.
^1.0 if you can avoid it), then run its installer:
composer require sanjabteam/sanjab
php artisan sanjab:install
The installer publishes config, migrations, assets, and typically creates the admin user/permission scaffolding. Run php artisan migrate and php artisan storage:link immediately after.config/sanjab.php first. This is the highest-leverage file in the package. Note the route prefix, the auth guard it uses, middleware stack, upload disks, pagination size, and any menu/dashboard registration hooks. Everything you debug later traces back to these values.php artisan route:list filtered by the configured prefix shows you the CRUD/dashboard endpoints the package exposes — useful when a page returns a 403 or an empty JSON payload and you need to know which controller answered.app/Sanjab-style directory). Put all package registrations there, never scattered across AppServiceProvider.User) as a CRUD resource, list it in the sidebar menu, then log in and verify the four things that matter: the index table renders, search/filter hits the right columns, the edit form saves, and the delete action respects authorization. Get that loop working before adding dashboards or widgets — most of the package's value is this CRUD path.registerUserResources(), registerMenu(), registerDashboards()). This makes it trivial to feature-flag or disable a module later, and keeps boot time visible.Auth::guard(...) matches the configured sanjab guard. Centralize "can this user see this resource" in the policy rather than in menu code.Cache::remember with a short TTL, otherwise the landing page becomes the slowest page in the app.resources/views/vendor/...) for bespoke widgets. For screens that fight the abstraction (multi-step wizards, heavy bulk actions), register a plain route + controller inside the admin middleware instead of forcing a CRUD resource.composer install --no-dev → vendor:publish only for new assets → migrate --force → config:cache/route:cache → storage:link. Publishing assets on every deploy silently clobbers local overrides if you use --force.spatie/laravel-permission in particular) when you upgrade Laravel. If the app is long-lived, budget for vendoring a fork so you can patch a fatal error yourself.web user hitting the panel with a sanjab guard gets redirect loops or 403s. Confirm the guard in config, use Auth::guard('sanjab') in your own code, and make sure policies don't assume the default guard.php artisan cache:clear). Otherwise new permissions "don't exist" until the next deploy.resources/views/vendor/ and never edit published assets in public/. Use --force deliberately, and diff after publishing.storage/logs/laravel.log and enable the package's debug flag in config.config/sanjab.php and confirm public/storage exists; a working upload with a broken preview is almost always the missing symlink.actingAs($user, 'sanjab') in feature tests, and avoid withoutMiddleware() — it hides exactly the authorization bugs you're testing.How can I help you explore Laravel packages today?