Digital Signature for Filament GitHub

#Installation

#Requirements

  • PHP 8.2+ with ext-openssl and ext-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

Terminal
composer require kukux/digital-signature

#2. Publish and migrate

Terminal
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:

Terminal
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.

PHP
// 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:

PHP
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 label

Or via .env:

Terminal
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):

PHP
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():

PHP
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:

PHP
// 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:

Terminal
php artisan queue:work

#7. Publish views and assets (optional)

Customise the Blade templates by publishing them into your app's view directory:

Terminal
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:

Terminal
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.