tomatophp/tomato-user-activities-module
A TomatoPHP module that logs and displays user activities in your Laravel app, giving admins a clear timeline of actions and events for auditing and monitoring.
Whether to ship an audit/activity trail now, and in what form. This package is positioned as the "user activity" layer of the TomatoPHP ecosystem: a structured record of actions taken by users inside a Laravel admin application, browsable from a dashboard. That maps directly onto roadmap items like "recent activity" widgets, per-user activity timelines on a profile page, and change/moderation history on records.
Build vs. buy. An in-house activity log is deceptively expensive: an activity table with subject/causer polymorphism, event wiring across auth and model lifecycle, before/after capture, an admin browse-and-filter UI, retention pruning, and the index work to keep the admin page fast as the table grows. That is typically multi-week work plus permanent maintenance. This module is a credible "buy" candidate for the standard Laravel + Filament admin stack — the decision this supports is whether to spend engineering weeks on a solved-shaped problem or accept a thin third-party dependency.
Scope resolution before commitment (the decision this release actually forces). The package presents two different products in two different places: the repository/Composer description advertises "automatically log every request made to your Laravel application, each request identified by hash" (a request-correlation logger), while the module description describes a user activity audit trail with admin review and filtering. These are different features with different data models, different storage volume, and different compliance value. A PM decision is required up front: which capability are we actually buying, and does it match the roadmap item we are trying to close? Do not let a spike answer this implicitly.
Compliance and trust commitments. Activity records are the artifact behind access-review evidence (SOC 2 / ISO 27001 style), GDPR accountability ("who accessed what"), and internal security forensics. If audit logging appears in a security questionnaire, a customer contract, or a sales deck, it becomes a delivery dependency with a deadline. Conversely — and this is the important decision — an in-app CRUD activity table does not satisfy a request for tamper-evident or certified audit. Deciding which bar we are promising to clear is a product decision, not an engineering one.
Support and incident-response cost. Per-user timelines ("what did this account do in the 30 minutes before the ticket") shorten diagnosis for both support escalations and security questions. That is an operating-cost lever and a CSAT input, and it is usually the fastest justification for the feature to pay for itself.
Data-policy decisions the feature drags in. IP addresses and user agents are personal data under GDPR. Adoption implies a decision on what is stored, for how long, whether it is exportable on a subject-access request, and whether it belongs in the production database at all. Agree retention before the table starts growing, because pruning retroactively is a migration project.
Adoption posture and risk appetite. Zero stars, zero dependents, a single author, one tagged release (v1.0.0, March 2024) with a changelog-link-only release note, and no documented upgrade path. The decision this supports is scoped pilot with a version pin, not standardize across products. Treat the release as the entry point to an evaluation, not as evidence of maturity.
Consider it when:
Look elsewhere when:
spatie/laravel-activitylog is the more established answer, and the two can coexist (this module as the "who/where" layer, Spatie as the "what changed" layer) if you accept two tables.Evaluation gates that must be answered before this touches the roadmap:
src/ models and migrations, not from the description.composer.json first.user_id, created_at, and any polymorphic columns, since the admin table is filtered on exactly those.To executives: This is a small, low-cost Laravel add-on that gives us a user activity history — the "who changed what, when, and from where" record that shows up in security questionnaires, customer audits, and support escalations, and that shortens the time to diagnose both support tickets and security questions. Adopting it is a bounded, reversible decision: it does not touch business logic, and it can be removed if we change course. The trade-off is maturity, not price. It is a v1.0 community package with a single author and no release since March 2024, so we treat it as a scoped pilot behind an exact version pin rather than a company-wide standard until we have reviewed what it records and how long it keeps it. Two caveats to flag honestly: first, the package advertises itself in two different ways — a request-correlation logger and a user activity audit trail — so the first deliverable is confirming which one we are actually buying and that it closes the roadmap item. Second, if a customer or auditor requires certified, tamper-evident audit, this does not clear that bar and we should not tell anyone it does.
To engineering: Composer-installable Laravel module from the TomatoPHP family, targeting the same admin/UI conventions, so we expect integration to be configuration plus migrations rather than custom glue. It is v1.0.0 with a changelog-link-only release note, so the first task is a timeboxed spike, not an integration: read the service provider, models, and migrations directly (the vendor source is the documentation here), and determine exactly which events are recorded, whether before/after values are persisted, and whether IP and user agent are stored. Verify the Laravel and Filament version constraints against our panel before installing — a Filament major mismatch shows up as a panel-provider class-not-found, not a dependency conflict. Then: pin the exact version, review the published migrations and add our own index migration if user_id / created_at are unindexed rather than editing the vendor's, run config:clear after publishing config (a stale cache makes the module silently do nothing), decide the retention/pruning schedule before the table grows, and subclass the vendor model or widget instead of editing published files so minor bumps stay clean. Wrap access behind our own interface so a future swap is one file. Report back on data captured, PII exposure, and query performance at a realistic row count before we commit this to the roadmap.
How can I help you explore Laravel packages today?