visualbuilder/filament-panel-screenshot-catalogue
A Filament plugin that builds a searchable catalogue of panel screenshots, making it easy to quickly browse, compare, and reference UI states across your Laravel admin panels. Handy for documenting designs, reviewing changes, and keeping visual snapshots organized and accessible in one place.
composer require and publish the config (php artisan vendor:publish --tag="...-config"). The package shells out to a headless browser, so confirm the runtime prerequisites it documents (Node/Puppeteer or a Chrome/Chromium binary, --no-sandbox in containers) before writing any code — most "it doesn't work" reports are environment issues, not API issues.Single capture, persisted on a model Wrap the capture call in a small service or action class rather than scattering facade calls. Have it return a value object (path, final URL, captured-at, status) so the rest of the app never depends on the package's internals. Store the path plus the final URL on your model — the final URL is now the key diagnostic field for the 5.9.0 behaviour.
Queued bulk capture / backfill
Use a dedicated queue (e.g. captures) with a longer --timeout than your default workers, and chunk IDs with Bus::batch() or LazyCollection. Make jobs idempotent (unique key on target + date, WithoutOverlapping middleware) so retries and backfills don't produce duplicate files or duplicate rows. Rate-limit with RateLimited middleware if you're capturing a third-party site.
Handling the 5.9.0 landing-mismatch failure The new behaviour is the important design driver: instead of receiving a wrong-but-successful image, you get a failure with a reason when the browser ends up on a consent screen, onboarding flow, or login page. Model this as a distinct outcome, not a generic error:
captured, blocked (redirect/consent/login), error (timeout, DNS, HTTP 5xx).blocked as terminal — do not put it on the normal retry ladder. Retrying a consent wall just burns browser starts.blocked in your UI/admin as "requires attention" with the final URL, so someone can fix auth/cookies rather than silently shipping a login screenshot to a customer.Bus::batch()->allowFailures() and inspect failedJobs().Authenticated and consent-gated targets
For pages behind a login, pass a session/cookies (pre-authenticated storage state) or hit a tokenised preview URL. For cookie-consent walls, prefer a deterministic bypass (seed the consent cookie) over scripted clicking. The 5.9.0 check is effectively your regression test that these mechanisms are still valid — when auth silently expires, you'll now get a clear blocked reason instead of a plausible-looking screenshot of a login form.
Wait strategies and custom scripts
Use the package's wait-for-selector / wait-for-network-idle options and any pre-capture script hook for dismissing overlays or forcing lazy images to load. Encode these as named "capture profiles" in your own config (e.g. marketing, app-dashboard) so behaviour is consistent across jobs.
Scheduling and freshness
Schedule periodic re-captures with ->withoutOverlapping() and a onOneServer() guard. Pair each capture with a retention/cleanup job that deletes stale files from the disk.
Testing
Fake the capture layer in feature tests and assert your branching logic — especially that a blocked reason does not retry and does mark the record. Keep a small, tagged integration suite (staging, real browser) for the handful of URLs you care about; assert both success and the intended blocked cases.
\Throwable and store nothing, or assume a capture job's success means the image is usable. Existing rows captured before the upgrade may contain login pages — consider a one-off re-capture of your most-viewed targets.blocked results on pages that are actually fine. If you see intermittent mismatch on a known-good URL, raise the wait, don't disable the check./dev/shm, and the Chrome sandbox are the usual culprits for blank or crashed renders. Prefer documenting a known-good image over debugging per-project.How can I help you explore Laravel packages today?