kyranb/footprints
Kyranb/footprints is a lightweight Laravel package for tracking user activity. Add a trait to your models, record footprints through a polymorphic relationship, and query activity history with familiar Eloquent syntax—useful for audits and recent-activity feeds.
Package context. Footprints (kyranb/Footprints) is a lightweight Laravel audit-trail package: it records user/system activity into a dedicated table via a polymorphic relation, with traits for auto-recording on model events and a facade for explicit records. It is an in-app activity log, not an event-streaming or compliance-grade audit platform.
Architecture fit. Good fit for a standard Laravel monolith or modular monolith where the requirement is "who changed what, when" surfaced in an admin UI or support workflow. It sits alongside the app rather than in front of it — no queue worker, no external service, no new infrastructure. It is a poor fit if the actual requirement is tamper-evident audit (hash chaining, immutable storage, retention policy enforcement) or high-volume analytical event tracking; those need a different product class.
Integration feasibility. Low-to-moderate effort. Typical path: install via Composer, publish config and migration, run migration, add the trait to the models in scope, and optionally enable request-context capture (IP, user agent) via middleware. The main work is not installing the package but deciding what to record — model coverage, naming conventions for footprint types, and whether to record on all events or an allowlist. That is a design decision with long-tail cost, and it belongs to the team, not the package.
Technical risk.
3.1.7.2 — four-segment patch versions suggest ad-hoc tagging. Consume with conservative constraints and pinned lockfiles rather than open ranges.master is not the same as a tagged, CI-verified release across the supported PHP matrix.Key questions for the maintainer / spike.
Stack fit. Assumes Laravel 10+ on PHP 8.1+. No additional services, no Composer dependencies of consequence, no front-end surface. It slots into the existing deployment unit and inherits the app's DB, auth guard, and queue configuration. This is about as low-friction as a package integration gets.
Migration path. The 3.2 change is additive — Laravel 13 support — and carries no breaking changes, no deprecations, and no schema migration for existing users. Two distinct paths:
^3.2 before starting the framework upgrade so the audit layer is not the item that forces a fork.If the package is not yet adopted, 3.2 is a better starting point than 3.1.x purely because it widens the supported matrix and signals the maintainer is still tracking framework releases.
Compatibility notes. Confirm the resolved constraint set after composer update — a widened illuminate/* range can quietly pull a newer framework minor into a project that intended to stay put. Verify the published config file has not gained new keys between 3.1 and 3.2; if it has, re-publish and diff rather than overwrite.
Sequencing.
^3.2.Maintenance. Low ongoing effort in steady state — the package is small and the API surface is stable. The recurring cost is the recording policy: every new model added to the app raises the question of whether it should be recorded, and unowned that question gets answered inconsistently. Assign an owner. Budget a review of the package each framework major, and expect this package to lag framework releases by weeks to months given the maintainer profile.
Support. Single-maintainer, community-supported, no SLA. Internal capability to read and patch the source is the real support plan; the codebase is small enough that a fork is a realistic contingency rather than a crisis. Track the upstream repo, watch for unaddressed Laravel compatibility issues, and pre-agree the fork trigger (e.g., no Laravel compatibility release within 60 days of a framework major).
Scaling. Writes are single-row inserts, which scale acceptably to moderate volume. Beyond that, the pressure points are table size and index bloat, not throughput. Mitigations: composite indexes on the columns actually queried, retention pruning, and — if the write endpoints are hot — consider deferring records to the queue, accepting that a dropped job means a missing audit entry. Read-side admin views must paginate; an unindexed "all activity for this record" query is the most likely production incident.
Failure modes.
Ramp-up. A developer can be productive in an afternoon: install, publish, trait on a model, one explicit record() call, observe the row. The conceptual overhead is genuinely small. The non-obvious learning is the recording policy and the retention story — those are team conventions, undocumented by the package, and should be written down in the repo's README or an ADR at adoption time. Budget roughly one engineer-day for a first integration including policy definition, and treat retention automation as a launch blocker rather than a follow-up.
How can I help you explore Laravel packages today?