lara-zeus/activity-timeline
A Laravel/Filament package from Lara Zeus that adds a clean activity timeline to your admin panel, making it easy to display, browse, and review model or user activity in chronological order. Simple to install and customize.
Architecture fit. The package is a presentation layer, not an audit system. It is a Filament v5 plugin that renders spatie/laravel-activitylog records as a chronological timeline inside a resource View page, an infolist entry, a relation manager, or a custom page. That framing drives the whole evaluation: adopting it means committing to Spatie's activity_log table as the event store, and buying only the UI on top. Fit is strong where the stack is Laravel + Filament v5 with activitylog already present or easy to add; fit is poor for API-only services, non-Filament or plain-Blade admin UIs, teams wanting a bespoke event schema, or any requirement framed as compliance-grade evidentiary audit.
Integration feasibility. High, with a small and well-bounded unit of work. Two Composer installs (plugin plus spatie/laravel-activitylog), publish and run the activitylog migration to create activity_log, optionally publish plugin config/views for theming, run filament:assets, register the plugin on the panel provider, then tag the target model with LogsActivity and a getActivitylogOptions() implementation. The genuinely non-trivial part is that last step, and it is a product/data-governance decision rather than engineering effort: what fields get logged, what gets excluded via logOnly() / dontLogEmptyChanges(), and what a customer is allowed to see about themselves and about staff. Realistic estimate: one to two developer-days for a scoped pilot on a single high-value resource, plus separate product time to settle the logging policy.
Technical risk. Low on the plugin code, moderate on the surrounding surface. Release 5.0.3 is a patch: one feature (compact density option), documentation/CI hygiene, and Dependabot bumps taking filament/filament from 5.6.1 to 5.7.0 — no migrations or breaking changes indicated. The material risks are: (1) Filament minor-version coupling, since the plugin tracks Filament's release line and Filament minors have historically shifted view internals, so panel and plugin should stay on the same minor; (2) an unbounded activity_log table that this package never prunes, which is a query-cost and compliance-adjacent problem the plugin does nothing to solve; (3) a very small project footprint — 10 stars, zero dependents, single-maintainer cadence dominated by chores and Dependabot — which is a continuity risk, not a functional one. MIT licensing removes legal friction but carries no support commitment.
Key questions.
compact a config value, a fluent setter, or a per-placement argument — and does enabling it require republishing views or assets?activity_log entirely inherited from Spatie?causer and subject, and required indexes on subject_type / subject_id?Stack fit. Adopt only where the admin surface is Filament v5. It fits back-office support tooling, order/ticket/account history tabs, ops change feeds, and internal "recent activity" widgets. It does not fit customer-facing surfaces, non-Filament front ends (Blade support is claimed but the value and the maintenance attention are clearly Filament-shaped), or any role as a primary event store.
Migration path. Greenfield adopters follow a short, linear path: require plugin and activitylog, publish and run the activitylog migration, publish plugin config/views only if customisation is planned, run filament:assets, register the plugin, tag one model with LogsActivity, mount the widget on that resource's View page. There is no legacy migration, but there is a historical-data expectation to manage: changes that happened before the trait was added are not retroactively captured, so timelines start empty and fill forward. Set that expectation with stakeholders before launch. If a custom audit table already exists, make an explicit call between dual-writing, backfilling into activity_log, or accepting a fresh start — and write the decision down, because it determines whether the first demo looks broken.
Compatibility. Keep the panel and the plugin on the same Filament minor line and treat a Filament upgrade as a joint change, not two independent ones. Pin the plugin version in composer.json rather than floating, since there is no published BC policy. The two-install dependency means the Filament upgrade review has to account for spatie/laravel-activitylog as well; in practice this is a three-package upgrade cadence, and the plugin is the least consequential of the three.
Sequencing. Start with the record-scoped timeline on the View page of the single most-edited resource — orders, tickets, whichever support opens dozens of times a day. That exercises the path used ~90% of the time at the lowest risk. Second, embed a compact timeline in an infolist entry or sidebar on a custom page to validate the density lever and confirm the setter behaves as documented. Only then consider a panel-wide activity dashboard, and gate it behind an access policy decision first: a global feed exposes cross-record and potentially cross-tenant activity, which is a policy question before it is a sprint. Decide compact per placement deliberately rather than toggling responsively — dense in sidebars and modals, full layout in the dedicated history tab.
Maintenance. Low ongoing code maintenance, moderate dependency-watch burden. The plugin is thin, MIT-licensed, and small enough to fork or replace; the maintenance attention it requires is mostly keeping it in lockstep with Filament minors and monitoring a single-maintainer project for signs of dormancy. Budget a recurring line item: a scheduled review of upstream activity each Filament upgrade cycle, plus a documented fallback. Because the integration surface is a widget plus fluent setters, replacing the renderer with a small custom Blade partial is a contained cost — write that fallback down at adoption, not after the maintainer goes quiet.
Support. No upstream SLA, no published BC policy, no visible test-coverage commitment. Internal support therefore rests on the adopting team: designate an owner, keep the version pinned, and avoid spreading the widget across dozens of pages before the first upgrade cycle has been survived once. The activity_log retention policy and the field-visibility policy (logOnly(), dontLogEmptyChanges() — old/new attribute values are stored verbatim, so form-level hidden() is not a privacy control) must live with a named product owner, since those are the decisions that generate support tickets.
Scaling. Rendering is presentation-only; compact changes density, not query cost. Two scaling concerns dominate. First, activity_log never prunes itself — decide a retention window at adoption and schedule cleanup, because the window is simultaneously a product choice (how far back must support look?) and a cost driver (query time as the table grows). Second, any feed that is not record-scoped — the panel-wide dashboard especially — must eager-load causer and subject and rely on indexes for subject_type/subject_id, or it degenerates into N+1 queries and becomes the slowest page in the panel. Treat both as launch prerequisites for the global view, not follow-ups.
Failure modes. Watch for: timeline pages timing out or loading slowly once activity_log grows unmanaged; empty timelines at launch being read as a broken feature rather than a missing backfill; sensitive values appearing in history because logging was configured at the trait level without a field-visibility review; a Filament minor upgrade silently breaking the widget's views mid-cycle; and upstream abandonment leaving the plugin pinned to an aging Filament line. Each has a cheap mitigation — retention job, stakeholder expectation-setting, logOnly() review, joint upgrade testing, documented fork path — and each becomes expensive if deferred.
Ramp-up. Shallow. One developer familiar with Filament can go from Composer require to a working timeline on a resource in an afternoon; the fluent-setter API is learnable in minutes and the mental model is "a widget with configuration," not a framework. The steeper learning curve is not the package but the two adjacent disciplines it exposes: Spatie's ActivitylogOptions (what to log, what to redact) and Filament panel/asset registration conventions. Plan on roughly half a day of engineering onboarding plus a product session on field visibility and retention before the first user sees a timeline.
How can I help you explore Laravel packages today?