valentin-morice/filament-sketchpad
A Filament form field that adds a sketchpad canvas for drawing or capturing signatures with mouse and touch. Save sketches as images, customize brush and canvas settings, and integrate quickly into Laravel Filament forms and resources.
Architecture fit. The package occupies a narrow, low-blast-radius slot: a Filament form field (a Livewire component plus a Blade view and a published JS asset) that captures a drawing on an HTML canvas and binds the result to form state. It is a presentation-layer leaf — no domain model, no migrations of its own (probably), no service container gymnastics. That makes it architecturally cheap to trial and cheap to remove. It does not belong anywhere near core business logic, and it should never become the system of record for anything but a nullable image payload.
Integration feasibility. Mechanically trivial: composer require, register the plugin or use the field directly in a ->schema([...]), publish assets, add the field to one form. Real effort is in the storage contract, not the wiring. The 0 dependents and 18-star figures are a real signal — there is no production evidence in the wild, so treat the package as unproven code rather than a supported dependency.
Technical risk.
TEXT column, you inherit row bloat, backup and replication weight, max_allowed_packet ceilings, and multi-hundred-KB API responses. Disk-backed storage with a path in the DB is the correct target.Key questions. Which Filament and Livewire versions are actually supported and CI-tested? Where is the image stored — column or disk — and is there a size/validation rule? Is the payload resized or compressed client-side? Is there a test suite? Does the canvas rehydrate correctly after a failed validation round-trip? Who owns the Filament-upgrade fix if the maintainer does not?
Stack fit. Fits a standard Laravel 11/12 + Livewire 3 + Filament 3.x panel. Filament already ships Alpine, so the canvas component likely reuses it with no new frontend build step — verify whether assets are pre-compiled or require npm run build against your Vite config.
Migration path. Decide the persistence contract before the first row is written. If the package defaults to a data URI column, add a thin wrapper field or model accessor that writes the decoded image to a configured disk and stores only the path plus MIME and byte size. Doing this at zero data costs an hour; retrofitting it later means a backfill across every affected table.
Compatibility. Pin an explicit Filament constraint in composer.json, run the spike on the exact minor you plan to ship, and add a note to the upgrade runbook: "re-verify sketchpad field after any Filament major bump." Do not adopt it in the same release window as a Filament upgrade.
Sequencing.
App\Filament\Fields\Sketchpad subclass so the dependency is isolated to one file — this is the fork escape hatch.Maintenance. The code surface is small enough that a competent Laravel developer can read and fork it in a day; that is the real maintenance story, not the maintainer's commit cadence. Budget an internal owner and assume you will vendor the field if the upstream goes quiet. Track the pinned version in the dependency register alongside other single-maintainer packages.
Support. No commercial backing, issues-only support, and — with zero dependents — nobody else has debugged your failure first. Internal response time is whatever you staff; do not plan on upstream SLAs.
Scaling. Cost scales with submission volume times payload size. Offload images to object storage behind a CDN, enforce a max dimension and re-encode server-side, and monitor average stored bytes per record — a regression from 80 KB to 800 KB is a quiet 10x on storage and backup time. Watch PHP post_max_size and any reverse-proxy body limits, since the drawing travels as a form payload.
Failure modes. (1) Silent field breakage after a Filament upgrade — blank or 404'd assets, no error until a user reports it. (2) Oversized drawing → 413/500 on submit, with the user losing their work. (3) Canvas rehydrating empty after a validation failure, causing data loss on an otherwise valid form. (4) Touch/coordinate offset on iOS, producing misaligned or unusable captures. (5) Unvalidated MIME or SVG accepted, creating a stored-XSS path. (6) Unbounded column growth degrading queries and backups on the host table. Each of these is cheap to guard and expensive to discover in production.
Ramp-up. A Filament-fluent developer needs roughly half a day to wire, validate, and stress-test the field; someone new to Livewire should budget two days, mostly spent understanding state sync. Expect thin documentation — plan to read the source for the storage and event behavior rather than relying on a README.
How can I help you explore Laravel packages today?