jeffersongoncalves/servicedeskkitv4
ServiceDeskKit v4 is a Laravel/PHP package that provides a foundation for building service desk and helpdesk features, helping developers add support workflows, service requests, and ticket management to their applications.
Install the kit into an existing Filament v4 panel app:
composer require jeffersongoncalves/servicedeskkitv4:^4.14
php artisan servicedesk:install # or vendor:publish for config/migrations if no install cmd
php artisan migrate
php artisan filament:upgrade && npm run build
Then register the plugin on your panel in app/Providers/Filament/AdminPanelProvider.php (->plugin(ServiceDeskPlugin::make())) and confirm the panel is discoverable via php artisan about / /admin.
Look first at:
config/servicedesk.php — this is where model FQCNs, table prefixes, and user model bindings live. As of 4.14.0 several of these now point at external packages, so this file is your source of truth for what actually got wired up.vendor/jeffersongoncalves/servicedeskkitv4/src/ — check the Filament/Resources and Models directories. In 4.14.0 a large chunk of these are re-exported from the user/admin packages rather than defined locally.users table matters.First use case: seed a category, open a ticket as an end user from the panel, then assign and reply to it as an agent. That single loop exercises the ticket model, the reply relation, the policy layer, and the notification path — if any of those are misconfigured after the 4.14.0 restructuring, this flow surfaces it immediately.
Extend, don't publish. The default workflow is to subclass the package resources in app/Filament/Resources/ and reference your subclass in the panel provider. Publishing the vendor resources wholesale means you own every future merge conflict, and 4.14.0 just moved a lot of those files — see Gotchas.
Compose the user/admin packages explicitly. 4.14.0 delegates the User model, admin resources, and login flow to companion packages. In practice you configure this in config/servicedesk.php (or config/auth.php) so the kit resolves your App\Models\User, then let the admin package own the auth screens. If you need custom auth (SSO, 2FA), override at the panel level rather than forking the kit's login page.
Resource composition for ticket context. Attach domain-specific fields via Filament schema callbacks on your own resource subclass rather than editing the package form. Keep the ticket↔reply↔attachment relations untouched; layer status transitions through a state machine or observer so both the UI and API paths share the same rules.
Multi-tenancy. If you run team-scoped desks, set ->tenant(Team::class) on the panel and add the tenant relationship to the ticket model through a subclass. Filament scopes resources automatically, but package-supplied queries may bypass that — audit the resource's getEloquentQuery() in a subclass before trusting isolation.
Integration points that hold up well:
TicketPolicy; the kit's authorization is a thin default and most real deployments replace it.TicketCreated / TicketReplied events in a listener rather than editing the resource actions.->widgets([...]) and add stats widgets alongside them.Deployment. Treat this like any Filament plugin: php artisan filament:cache-components and php artisan config:cache in the deploy script, plus php artisan migrate --force. Pin ^4.14 and let Dependabot (which the package itself now uses) handle patch bumps behind CI.
4.14.0 is not a no-op upgrade. The headline item — "Use user/admin packages for models, resources and login" — relocates the User model, admin resources, and login page out of this kit into companion packages. Before upgrading from 4.13.x:
composer why jeffersongoncalves/servicedeskkitv4 and read the new transitive requirements. You will likely need to add the user and admin packages explicitly, at compatible versions.Models or Filament/Resources namespaces. Those classes may now be aliases or gone.config/servicedesk.php — a stale config referencing an old namespace fails silently at boot, not at install.->login() registration. Delegated auth often changes the guard or the login route name, which breaks any hardcoded route('filament.admin.auth.login') in tests or redirects.Version drift between the three packages. Because the kit now depends on sibling packages for core classes, a mismatched minor version between them produces "class not found" or, worse, a silently different User model. Constrain all three together and upgrade them in one PR.
Migration order. If the user package ships its own users alteration, it must run after Laravel's default users migration but before the ticket foreign keys. Check migration filenames/timestamps when you publish, and prefer running the package migrations from the package rather than copying them.
Debugging checklist for a blank or 500ing panel:
php artisan about # panel + plugin discovery
php artisan filament:clear-cached-components
php artisan config:clear && php artisan cache:clear
php artisan route:list | grep filament # login route present?
A missing login route almost always means the delegated admin package isn't registered in the panel provider.
Extension points that survive upgrades: config values, model subclasses bound via config, event listeners, panel plugin options. Extension points that don't: published Blade views, edited vendor migrations, and overridden resource static properties.
Don't chase the CI noise. Most of 4.14.0 is Dependabot and workflow standardization. If you skimmed the changelog, you could easily miss the single structural change — read the PR titles, not just the version delta. Similarly, PHPStan now runs on PHP 8.4 and laravel/sail bumped to 1.68; neither affects consumers, but they hint the maintainer targets current PHP. Verify your own PHP constraint before upgrading.
Testing. Use Livewire tests against the panel (Filament::setCurrentPanel(...)) and assert the ticket lifecycle end-to-end. Given the resource relocation in 4.14.0, a smoke test that merely opens /admin/tickets is worth more than unit tests over your subclassed schema.
How can I help you explore Laravel packages today?