jeffersongoncalves/filament-page-visits
A Filament plugin for tracking and displaying page visits in your admin panel. Log page views, see which pages are most popular, and review visit analytics without leaving Filament. Simple to install and configure for any Laravel app using Filament.
Scope of the release. 3.2.0 is an additive, non-breaking minor release. It ships one new analytics widget (ResponseTimeTrendChart, daily p50/p95/p99 over a rolling 90-day window) plus translations across 19 locales. No deprecations or breaking changes are declared, and the widget can be disabled via metrics_page.widgets.response_time_trend.
Architecture fit. The widget is a read-only presentation layer: it renders aggregates from response_time_stats, a column introduced by an upstream dependency (jeffersongoncalves/laravel-page-visits 1.3.0), and does not sit in the request path. That is a good fit for an internal ops/product dashboard, but it creates a deliberate cross-package coupling — this package's headline feature is only as good as another package's schema and aggregation job. Treat the pair as a single deployable unit rather than two independent dependencies.
Integration feasibility. Low. The upgrade path is four commands (composer update of the upstream package, publish its migrations, migrate, and ensure page-visits:aggregate-and-prune runs). The auto-hide behaviour when the column is absent is a sensible defensive default and means a partial rollout will not break existing dashboards — it degrades to the pre-3.2.0 experience.
Technical risk.
response_time_stats. We are accepting that contract without evidence in these notes about sample resolution, histogram vs. raw-sample derivation, or timezone/day-boundary handling.aggregate-and-prune prunes more aggressively, the chart will silently show a shorter horizon than its label claims.Key questions for the maintainer/vendor.
response_time_stats populated and at what granularity — can we reproduce p95 independently to validate it?aggregate-and-prune, and does it guarantee ≥90 days?Stack fit. Assumes a Laravel application with a Filament-style admin panel, the laravel-page-visits package already installed, and MySQL/Postgres as the backing store. The widget needs no queue worker, no external service, and no new infrastructure — it is a view over data we already collect.
Sequencing (order matters; do not reorder).
composer update jeffersongoncalves/laravel-page-visits to ≥1.3.0 in a staging branch and confirm the constraint resolves against the current Laravel/PHP matrix.page-visits:aggregate-and-prune is scheduled and has run at least twice post-migration. Confirm retention ≥90 days. Backfill or accept a ramp-up period — decide explicitly, and communicate the "data appears over the next N days" expectation before anyone sees the chart.metrics_page.widgets.response_time_trend = false), then enable it for a pilot group once the first aggregation cycles land.Compatibility checks. Pin both packages together in composer.json so the widget cannot be deployed against a pre-1.3.0 page-visits. Confirm the auto-hide path is exercised once in staging (deploy without the column) so we know the failure mode is graceful rather than a stack trace. Spot-check three locales, including one long-string locale, at the narrowest supported breakpoint.
Rollout shape. Low blast radius, so a standard canary is sufficient: enable for the engineering/ops panel first, then widen. Keep the config flag documented as the one-line rollback — reverting the package version should not be necessary for a cosmetic or data-quality problem.
Maintenance. We now have an explicit two-package upgrade dependency. Add both to the same dependabot/renovate group and the same release checklist; a solo upgrade of either package is the most likely way to break the widget. Ongoing effort is low — no new code to own — but the config surface (metrics_page.widgets.response_time_trend) becomes an operational artefact that should be documented in the runbook, not just the README.
Support. The dominant support load will be "the chart is empty / the numbers look wrong." Pre-empt it with a short runbook: (a) check the scheduled aggregation command ran, (b) check the migration landed and the column exists, (c) check retention settings, (d) only then treat it as a bug. Without this, the auto-hide behaviour will actively conceal the real cause and push tickets to engineering. Localisation issues will generate a smaller, low-severity stream of cosmetic tickets.
Scaling. The widget is a read-only aggregate query over 90 days; on a well-indexed table this is trivial for a dashboard viewed by tens of concurrent users. The real scaling concern is upstream storage and job runtime: adding per-request latency samples increases write volume on the visits table, and the aggregation job's duration grows with traffic. Budget for that in the upstream package's assessment, not this one — but flag it now, because the bill arrives after this release is adopted.
Failure modes and detection.
Ramp-up. Engineering effort to integrate is under a day for someone familiar with the stack; the larger cost is organisational — analysts and on-call need to understand that the chart lags by one aggregation cycle and depends on a scheduled command. Plan a short briefing for dashboard consumers and a runbook entry for on-call before enabling it broadly.
Recommendation. Adopt. This is a cheap, reversible, additive capability that turns data we already collect into a decision-useful latency view. Gate adoption on two things only: confirming the upstream aggregation job is scheduled and retention covers 90 days, and publishing the "empty chart" runbook entry. Everything else can be handled post-release.
Caveat: this review is based solely on the 3.2.0 release notes; the package identity, version constraints, and upstream internals above are inferred and should be confirmed against the source and the maintainer's answers to the questions in Technical Evaluation.
How can I help you explore Laravel packages today?