pushery/visual-feedback-for-laravel
Visual feedback for Laravel apps: surface toasts, alerts, and inline UI cues so users always know what happened. Simple installation, sensible defaults, and Blade-friendly helpers keep feedback consistent without extra frontend work.
mail = a human reads an inbox. webhook = reports land in the ticketing tool you already run (one queue, not two). database = you now own a triage UI, retention policy and prune schedule. Most teams should pilot mail and graduate to webhook.off / optional / required, defaultable from env and overridable per mount — so an internal admin panel and a customer-facing page can ask different questions without environment churn. Authenticated reporters are identified by the auth guard, so email/phone can be dropped for them.retention_days. Setting retention, scheduling the prune, and confirming backups inherit the same classification is a policy call you now own.wire:navigate, PostgreSQL type errors in the report browser, billed S3 PUT/DELETE on refused uploads) — but it means pinning the version and reading changelogs becomes a standing commitment, not a one-off.Consider it when:
screenshot.strategy=dom capture (no browser permission prompt) is good enough and the operational tail is smallest: mail-only, no migration, no triage UI.wire:navigate), Inertia or plain Blade. The widget is a Livewire component, so @livewireScripts/@livewireStyles are already in place.VISUAL_FEEDBACK_MAIL_TO is empty by default and the mail channel silently marks itself unavailable), a running queue worker (every channel dispatches a job — a default database queue with no worker accepts and drops reports), and re-publishing assets after every composer update (the four bundles under public/vendor/visual-feedback are copies, not symlinks).Look elsewhere when:
script-src source, and a queue worker monitoring story.For executives: This gives users a way to report a problem from inside the product, with a screenshot and the page context attached, instead of an email that says "it's broken." It's MIT, self-hosted, no vendor contract, no data leaving our infrastructure, and roughly three lines in the layout to switch on. The risk is that it's a young, single-maintainer package with a small community — so we contain it: one include in a single partial, a 30-day pilot on one internal surface, mail-only, and a decision at day 30 on five metrics.
For engineering: No build step, fluent PHP API, Livewire-native. Three concerns to plan for, all of them silent if missed: the config and asset publishes are hard requirements (assets are copies — re-publish per deploy; php artisan about reports staleness), every channel dispatches a queued job, and the CSP must permit all four bundles. The database channel needs its own migration tag before it will work. Keep the integration in one partial so removal is a one-line operation.
For support/ops: Reports arrive either in an inbox or in our existing ticketing tool, with capture strategy and whether the screenshot was edited recorded alongside — so we can tell "the user drew on it" from "the DOM fallback produced a degraded image" without emailing them back. The failure mode to watch is silence: no recipient set, MAIL_MAILER=log, no worker, or stale bundles all accept a report and drop it. Alert on the package's "no channel was enabled and available" log line from day one.
The ask: approve a 30-day pilot — mail-only, one internal surface, screenshot.strategy=dom, no database channel, no migration. Judge it at day 30 on reports per week, usable-screenshot share, median time-to-reproduce versus baseline, delivery failure rate, and whether reports land in triage without a human re-filing them. Then either promote to the webhook channel or remove the include.
How can I help you explore Laravel packages today?