saade/filament-autograph
Filament Autograph adds a signature pad field to Filament forms, letting users draw handwritten signatures with mouse or touch. Signatures are saved as images or base64 for contracts, waivers, and approvals, with simple configuration and validation.
Architecture fit. This is a Filament form field — a Field subclass registered by a service provider, a Blade view, and a canvas-based signature pad bound into Livewire component state. Architecturally it is an additive leaf node: no migrations, no routes, no controllers, no jobs, no service-layer coupling. It slots into a form schema exactly where a TextInput or FileUpload already sits. From a planning perspective that matters because it means the integration has no cross-team surface area: no API contract to agree, no data model to negotiate with another squad, no infrastructure change. The corollary is equally important — if the target application is not already Filament + Livewire + Alpine, the package has effectively zero applicability and the correct decision is to integrate a plain JS signature library instead.
Integration feasibility. composer require, optionally publish config/views, one line in the form schema, and a storage decision. A first working field is realistically under a day of engineering. There is no architectural debate to schedule; the open items are version compatibility and payload handling, both of which are spike questions, not design questions.
Technical risk.
post_max_size and the signatures table bloats. This is a storage-architecture decision the TPM should force early, because retrofitting it means rewriting saved records.Key questions.
composer.json, and which are actually exercised in CI?->disk(), ->directory(), ->visibility(), required/disabled state, and deletion-on-update consistent with FileUpload?Stack fit. Laravel + Filament + Livewire + Alpine. Native fit for an existing Filament panel — the field inherits validation, state binding, and layout for free. If the target is Livewire-but-not-Filament, stop and re-scope to the underlying JS library; the wrapper's entire value is the Filament field contract.
Migration path. Purely additive and reversible, which is the strongest argument for running the spike at all. Add a nullable column or a dedicated disk path, add the field to a single form, and let existing signature workflows (wet-signature scans, file uploads, or a third-party e-sign vendor) coexist behind a flag during pilot. No schema rewrite, no backfill, no historical data migration — existing signatures stay as-is, and reverting to a FileUpload is a one-line change. This is a cheap-to-enter, cheap-to-exit dependency, which is exactly the risk profile to prioritize when engineering capacity is contested.
Compatibility. Pin the Filament major and the package minor in composer.json. Fluent method names have drifted between releases, and an unpinned composer update produces "my ->disk() call silently does nothing" bugs that surface as data-quality incidents rather than build failures. Resolve the constraint against our exact Laravel/Filament/Livewire versions in a scratch project before touching the main app. Also confirm Tailwind coverage: if the Blade view uses utility classes absent from Filament's compiled CSS, the field renders unstyled unless assets ship compiled.
Sequencing.
SignatureField extending or composing the package field, so a fork or vendor swap is a one-file change and upstream internals never leak into application code. This is the insurance policy that makes the adoption risk acceptable.Maintenance. Small code surface, low drag — realistically 1–2 days per year for Filament version bumps, plus the cost of a fork if the maintainer goes dormant. Budget for that fork from day one by keeping the wrapper thin and the diff against upstream clean. Pin versions; do not float.
Support. No vendor, no SLA, community issues only. Name a single backend owner — this is a one-person package, not a team-scale dependency, and it should not be owned by a team that assumes someone else is watching it. Track upstream tags and issues directly rather than treating the star count or release metadata as a health proxy.
Scaling. Storage cost is negligible at any realistic volume — signature images are tens of kilobytes. The scaling concern is the write path: base64 payloads riding through Livewire component state grow request size, hit post_max_size, and turn the signatures table into a hot, bloated table that is expensive to index and back up. Routing through Livewire temporary uploads to object storage removes both problems. The read path is trivial and needs no attention.
Failure modes to instrument.
Ramp-up. Engineering ramp is trivial — an afternoon for anyone fluent in Filament. The real ramp-up is organizational: agreeing on consent language, retention window, view access, and whether a PNG of a scribble actually satisfies the business requirement. Settle that before the pilot, not after, because it determines whether the second form ever ships.
How can I help you explore Laravel packages today?