laraarabdev/recordkeeper
RecordKeeper adds a lightweight audit trail to your Laravel Eloquent models. It records creates, updates and deletes, shows what changed and who made the change, and keeps a searchable history your team can review without altering existing tables. Drop-in setup for new and existing apps.
Architecture fit RecordKeeper is a Laravel-side record/audit-trail package (Composer-installable, service-provider bootstrapped, Eloquent-model-coupled). Architecturally it sits in the "cross-cutting concern" tier of a Laravel app: it observes model lifecycle events and writes to its own persistence layer. That is a good fit for a Laravel monolith or a modular monolith where every write already flows through Eloquent. It is a poor fit for services that write through raw query builders, stored procedures, or non-Eloquent data paths, and it does not replace a database-level CDC or event-stream audit strategy. Treat it as an application-level audit trail, not a compliance-grade immutable ledger, unless the persistence and retention model is verified.
Integration feasibility
Low mechanical effort: composer require, config publish, migration publish, add a trait/interface to audited models. The real effort is not installation, it is (a) deciding which models are in scope, (b) deciding what constitutes sensitive payload (this package will capture attribute diffs by default, which frequently sweeps up PII), and (c) agreeing on retention. Expect one developer to get a working pilot in days; expect the scope/retention/PII decisions to take longer than the code.
Technical risk The dominant risk here is information risk, not code risk. The v0.3.0 release notes contain only an auto-generated compare link — no changelog body, no migration guide, no breaking-change callout. For a package that stores historical data and likely ships migrations, that is a material gap: we cannot currently state whether the schema changed, whether existing rows are backfilled, or whether the observation API changed between 0.1.3 and 0.3.0.
Compounding factors:
0.MINOR bumps may contain breaking changes by design. The jump 0.1.3 → 0.3.0 skips 0.2 entirely and is two minor bumps on a pre-1.0 package. Assume breaking until proven otherwise.LaraArabDev), pre-1.0, small apparent release cadence. No evidence of a support contract, security policy, or LTS branch.Key questions
CHANGELOG.md and read the GitHub compare diff directly — the release notes do not substitute for it.Stack fit
Assumes a standard Laravel app (Eloquent as the system of record, Composer, package auto-discovery). Verify against the actual composer.json version constraints in the repo rather than the README — pre-1.0 packages frequently carry wide Laravel constraints (^9|^10|^11) that are not actually tested across the matrix.
Migration path Do not adopt 0.3.0 blind from 0.1.3. Sequence:
CHANGELOG.md at 0.3.0; classify each change as additive / behaviour-changing / breaking."x/y": "0.3.0", not ^0.3) in composer.json for the pilot. For a write-path package, ^ is the wrong default.Compatibility
Three axes to clear: Laravel/PHP version matrix; database engine (the audit table's column types and indexing strategy matter on MySQL vs Postgres); and queue driver if logging is async. Also check whether the package assumes a specific app timezone or App\Models\User shape.
Sequencing Spike (2–3 days: install, audit two low-risk models, inspect captured payload for leakage) → architecture review of payload scope and retention → staging rollout on a non-critical bounded context → production on one domain aggregate → expand model coverage in waves. Do not enable globally on first deploy; a global trait rollout maximizes both blast radius and the volume of PII you capture before you have a redaction policy.
Maintenance Pre-1.0 with a thin release-notes culture means upgrade cost is unpredictable per bump. Budget a recurring line item: at each minor release, one engineer-day to read the diff and regression-test the audit path. Exact-version pinning is mandatory; automated dependency PRs should not auto-merge this package.
Support Single-maintainer, community-supported, no SLA. Escalation path is "open an issue." Acceptable for internal tooling and non-regulated audit; not acceptable as the sole control for a regulated audit requirement without a fork-and-own contingency plan. Recommend we vendor/forward-port patches if the package goes quiet.
Scaling
Two cost curves. (1) Write amplification — one audit row per observed model event multiplies write volume by the write-to-read ratio of the audited models; high-churn tables can double or triple DB write load. (2) Table growth — audit tables grow monotonically and are rarely pruned; they will outgrow their source tables. Mitigations to design in from day one: async/queued writes, a retention window with a scheduled prune job, composite indexes on (subject_type, subject_id, created_at), and a separate database/connection for the audit store if volume is meaningful.
Failure modes
Ramp-up Low. A Laravel-fluent engineer is productive in under a day. The genuinely hard parts are policy, not API: scope, redaction, retention, and erasure. Assign those to a named owner (security or data) rather than leaving them implicit in the implementation ticket.
Recommendation: Proceed to a scoped pilot on 0.3.0 with exact-version pinning — conditional on obtaining the 0.1.3→0.3.0 diff and confirming no destructive migrations. Do not adopt as a compliance control. Re-assess at 1.0 or at the first release that ships a substantive changelog.
How can I help you explore Laravel packages today?