laboiteacode/filament-activity-timeline
A semantic activity timeline for Filament that turns raw spatie/laravel-activitylog entries into clear, localized business sentences. Show "Client: ACME France -> Dupont Conseil" instead of "customer_id: 14 -> 27". Drop-in widget, page, or infolist support, with customizabl...
spatie/laravel-activitylog. That's roughly 1–2 weeks of design, localization, and edge-case work (attribute casting, relation resolution, empty states). Adopting this narrows the build to configuration and copywriting.hidden_attributes list, and v1.0.2 hardens that boundary: a crafted request can no longer swap the widget's presentation overrides and reveal attributes it was mounted to hide. This is a product/privacy decision you now get to make explicitly — which fields (salary bands, internal notes, margin, PII) appear in change history — rather than one that leaks through UI state.Client : ACME France → Dupont Conseil in French, not English enum keys. It supports decisions about multi-market rollout and whether admin surfaces are localized at all.pagination.max_per_page ceiling (500 by default) bounds how much history one request can pull, which makes "activity tab on a high-volume record" a safe default rather than something that needs a bespoke performance review.Adopt when most of the following hold:
spatie/laravel-activitylog as the underlying store; this is a presentation layer, not a logging engine.^1.0.2 or later. Earlier 1.x versions let a crafted Livewire request rewrite the widget's public properties, including the presentation overrides that carry the hidden_attributes mount-time list. This is a one-line composer change and should not be a debate.mount() or an extended timeline(), not through $wire.set(...) from your own JavaScript. If you do drive it from JS, v1.0.2 will throw CannotUpdateLockedPropertyException and you need a small refactor before upgrading.Look elsewhere or build in-house when:
Practical adoption stance: upgrade to at least 1.0.2, pilot on one internal admin resource behind a feature flag, and write a fallback plan (fork the renderer, keep the underlying log schema unchanged) so the exit cost stays low. Pin the version, treat major Filament upgrades as a scheduled compatibility check, and re-read release notes for security entries — this one is the second-order kind of fix a small package often never ships, so its presence is worth weighting.
To executives: "Our admin panel currently shows change history as a developer dump — status: 1 → 2, customer_id: 14 → 27. This package turns that into plain-language, localized entries staff can actually read: Status: Pending → Approved, Client: ACME France → Dupont Conseil. It's an MIT-licensed presentation layer over logging we already do, so the investment is days, not a sprint. The payoff is fewer 'what changed?' support tickets and a credible audit-history answer in B2B sales conversations. The version we'd adopt also closes a flaw where a tampered browser request could reveal fields the timeline was configured to hide — that's patched, and it's the reason we pin a minimum version rather than taking whatever is latest."
To engineering: "It's a Filament plugin that renders spatie/laravel-activitylog entries as semantic, translated events. We keep our existing logging schema; this only changes how the timeline is displayed and labelled. Ship ^1.0.2: it locks the widget's public properties, caps per_page at a configurable ceiling (500 default), and stops swallowing AuthorizationException into the empty state so denials return 403. No data migration. Two upgrade notes: stop driving the widget with $wire.set(...) — configure via mount() or an extended timeline() — and if we published the config, add pagination.max_per_page. It has CI, tests, and PHPStan, and the scope is deliberately narrow. The risk is still bus factor, not complexity — one maintainer, minimal adoption. Mitigation: pin the version, pilot on one resource, and be prepared to vendor the renderer if it goes stale."
Framing the caveat honestly: early-stage package, minimal adoption, so we're partly betting on it and partly buying a well-scoped reference implementation we could own ourselves. The security release cuts both ways: it's evidence the maintainer responds to real vulnerability reports, and it's a reminder that a small presentation package sitting on top of employee-visible PII is still attack surface. Both are acceptable for a UI-layer dependency with no data migration and no lock-in on the log store.
How can I help you explore Laravel packages today?