#Installation
#Requirements
- PHP 8.2+ with
ext-opensslandext-gd - Laravel 12
- Filament 3, 4, or 5
Laravel 11 is not supported. Every 11.x release, up to and including the final 11.56.1, is affected by PKSA-mdq4-51ck-6kdq (CRLF injection in the default email rule, patched in 12.60.0). Laravel 11 is past its security-support window, so no fixed 11.x will ever be released. Composer 2.9 blocks advisory-affected packages by default, which makes the whole line uninstallable — this package dropped the constraint rather than ask you to disable that protection.
#1. Install via Composer
composer require kukux/digital-signature
#2. Publish and migrate
php artisan vendor:publish --tag=signature-migrations
php artisan vendor:publish --tag=signature-config
php artisan migrate
Then publish the plugin's JS bundle so the signature pad and picker components work in the browser:
php artisan filament:assets
filament:assets reads the asset registered via FilamentAsset::register() in SignaturePlugin and links it under public/js/filament/kukux/digital-signature/. Run it again after every composer update of this package so the published JS stays in sync with the installed version.
#3. Register the plugin
Add SignaturePlugin to your Filament panel provider.
// app/Providers/Filament/AdminPanelProvider.php
use Kukux\DigitalSignature\SignaturePlugin;
public function panel(Panel $panel): Panel
{
return $panel
->plugins([
SignaturePlugin::make(),
]);
}This automatically registers:
- Signatures resource — register reusable signature images and view signature records in the admin panel
- Sign Document actions — actions inside the Signatures resource for signing with a registered signature
Do not rely on discoverResources() to pick up the package resource from vendor. The supported setup is to register SignaturePlugin::make() on each Filament panel that should show the signature resource.
#4. Configure the admin resource (optional)
Customize the Signatures resource navigation appearance using fluent methods on the plugin:
SignaturePlugin::make()
->navigationIcon('heroicon-o-pencil-square') // default icon
->navigationGroup('Documents') // group in sidebar (null = ungrouped)
->navigationSort(10) // sort position
->navigationLabel('Document Signatures') // custom sidebar labelOr via .env:
SIGNATURE_RESOURCE_ICON=heroicon-o-pencil-square
SIGNATURE_RESOURCE_GROUP=Documents
SIGNATURE_RESOURCE_SORT=10
SIGNATURE_RESOURCE_LABEL=Signatures
SIGNATURE_RESOURCE_ENABLED=true
To hide the resource entirely (e.g. when building your own):
SignaturePlugin::make()->withoutResource()#5. Register PDF templates (optional)
If your app produces fixed-layout PDFs (DTRs, payslips, contracts) that should be sign-able through the plugin's placement designer, register them via templates():
SignaturePlugin::make()
->templates([
\App\Pdf\DtrTemplate::class,
\App\Pdf\PayslipTemplate::class,
])See PDF Templates for the PdfTemplate contract and slot definitions. This is purely additive — Signable models without a template continue to work via the ad-hoc and on-demand flows.
If you see Plugin [signature] is not registered for panel [admin], check that the plugin is registered on the same panel that is rendering the resource:
// app/Providers/Filament/AdminPanelProvider.php
use Kukux\DigitalSignature\SignaturePlugin;
$panel->plugins([
SignaturePlugin::make(),
]);In multi-panel apps, register the plugin on every panel that uses the package resource or actions.
#6. Start the queue worker
By default, SignDocumentAction signs synchronously — no queue needed. If you opt into queued signing (.queued()), start a worker:
php artisan queue:work
#7. Publish views and assets (optional)
Customise the Blade templates by publishing them into your app's view directory:
php artisan vendor:publish --tag=signature-views
To copy the compiled JS into public/vendor/digital-signature/ (instead of letting Filament symlink it via filament:assets), use:
php artisan vendor:publish --tag=signature-assets
This is only needed when you're serving the JS directly outside Filament's asset pipeline — most projects should use php artisan filament:assets from step 2 instead. If you publish manually, re-run this command after every composer update of this package.