joelseneque/filament-help-requests
Filament plugin for submitting and managing help requests in your Laravel admin panel. Users can create support requests while admins review, track, and respond through dedicated Filament resources.
Architecture fit. joelseneque/filament-help-requests is a Filament panel plugin: a Livewire help widget for end users, a threaded "My Requests" view, and admin triage actions with fan-out to email and GitHub issues. v1.1.0 does not change that shape — it is an additive migration (add_screenshot_paths_to_help_requests_tables) plus UI work inside the existing widget. That is the right kind of release for a plugin at this maturity: feature depth on the core loop (capture → triage → reply) rather than new infrastructure.
The notable architectural decision is that screenshots became an array of paths on the request/reply rows, and the annotation (pins + notes) appears to be a client-side concern, with notes appended to the comment/reply text as a fallback. That is a pragmatic choice — no server-side image pipeline to operate — but it means the fidelity of the evidence depends on browser behaviour, and that annotated images are larger re-encoded payloads rather than the original uploads.
Integration feasibility. High for a standard Filament app. The upgrade is four commands plus a migration; the migration is additive and explicitly preserves the pre-1.1.0 single-screenshot rows. No new external services, no new auth model. storage.max_files (default 5) is a runtime config read.
Technical risk. Ranked:
screenshot → screenshots and replyScreenshot → replyScreenshots, and changing them from scalar to array, breaks any subclass, trait override, Blade partial, or Dusk/unit test that touches them. Out-of-the-box installs are fine; anyone who extended the widget is not. Treat this as a major for planning purposes.upload_max_filesize/post_max_size, nginx client_max_body_size, Livewire temp-upload disk, and — if the disk is S3 — CORS for the browser-side paste/drop path.npm run build implies published JS must be rebuilt, or the annotation UI ships stale. CI pipelines that only run composer install will silently miss it.Key questions. Which Filament/Livewire/PHP/Laravel versions are supported? What are the default storage disk and URL strategy (private disk with signed URLs, or public)? Is EXIF stripped? Are there file-size, MIME, and dimension limits on each screenshot? Is annotation purely client-side, and what happens when it fails — does the user still submit, and do they know? Are files deleted when a request is deleted or retention expires? Do the old property names remain as aliases? How does GitHub issue creation carry five images — uploads or links, and against which API limits? Are multi-image emails attachments or links, and what is the link lifetime? Is there test coverage for the array shape and the legacy single-path read path?
Stack fit. Strong if the app is already a Filament panel and the audience is authenticated panel users. The widget assumes panel auth and a tenant/user context; it is not a public contact form. If help requests are meant for external customers, the auth assumption is the blocker, not the feature set. Email and GitHub integrations imply queued jobs — confirm the queue worker is running and monitored, since a burst of five-image threads will lengthen job payloads.
Migration path.
composer update joelseneque/filament-help-requests in staging only.storage.max_files — do not rely on package defaults, or a future default change will move your limit silently.php artisan migrate; immediately open a pre-1.1.0 request and confirm the legacy single screenshot renders in widget, admin, and email.screenshot, replyScreenshot, and widget subclassing; fix before running the suite.npm run build, and wire it into the deploy pipeline rather than running it by hand.php artisan optimize:clear then rebuild config/route caches.Compatibility. Backward compatible for stock installs, breaking for extenders and testers. Storage-driver compatibility needs explicit verification: local disk is trivial; S3 requires CORS and correct visibility settings for both admin display and email embedding. Verify GitHub issue body formatting did not change in a way that breaks any downstream parser or automation reading those issues.
Rollback posture. The migration is additive, so a code rollback is mechanically possible — but any row written with multiple paths is unreadable by 1.0.x. In practice this is a forward-only upgrade. Plan for a forward fix, not a revert.
Sequencing. Staging first with a real annotated-upload test (paste, drop, browse; three pins; five files; one oversized file to see the failure UX). Then production in a low-traffic window, migrate-before-code or in a maintenance window to avoid a column-not-found gap. Notify admins that Reply and Update status now accept multiple screenshots, and that emails and GitHub issues will show all of them — that is a visible behaviour change for anyone watching those channels.
Maintenance. Small code footprint, but two new permanent surfaces: the annotation JavaScript (browser-dependent, hardest to test in CI) and multi-file storage. Every Filament/Livewire major upgrade will require re-testing the widget specifically. Given a single maintainer and a breaking rename in a minor version, pin exactly or to a patch-level constraint and upgrade deliberately rather than floating.
Support. Expect a wave of "how do I" and false-bug reports in the first weeks — pins that appear to vanish when an upload fails, pasted images that are too large, the accordion hiding a thread a user expected to see. Publish a one-page internal FAQ and make sure admins understand that notes are duplicated into the comment text (so they don't ask users to re-type them). The notification deep-link into an open thread is a genuine support-load reducer; call it out.
Scaling. Storage is the scaling axis, not compute. Rough envelope: annotated screenshots at 1–3 MB, up to five per request and five per reply, so a busy week of a few hundred threads can mean multiple gigabytes. Set a retention or lifecycle rule, and verify that deleting a request deletes its files — orphaned blobs are the most likely slow-burn cost. Email and GitHub fan-out scale with image count too; if images are attachments, mail relay size limits and deliverability become the constraint, and if they are links, link expiry becomes one. Database impact is negligible unless you start reporting on the path array, which needs indexing thought.
Failure modes to instrument before launch. PHP/nginx body-size rejection producing a silent missing screenshot; client-side canvas failure on very large pasted images yielding an unannotated submission the user believes is annotated; S3/CORS misconfiguration that passes server-side tests and fails only in the browser; deploy-order error where code lands before the migration; GitHub API rate or body-size limits on five-image issues; config not refreshed so max_files is not what you set; and mixed-shape row rendering.
Ramp-up. Roughly half a day of developer time for the upgrade, migration verification, test fixes from the property rename, and asset pipeline change. Fifteen minutes of admin training. End users need nothing beyond the UI itself. Operations needs storage monitoring and a retention job stood up before rollout, not after the first disk-pressure alert.
How can I help you explore Laravel packages today?