bbs-lab/nova-action-event-columns
A Laravel Nova package that adds action event columns to your resources, making action and event data easier to display, scan, and review directly in Nova tables. Useful for quick visibility into recorded action activity and debugging workflows without writing custom column code.
action_events, but the default schema can't answer "from where?" or "for which tenant?" This package closes that gap with an ip_address column out of the box and a registry for tenant_id, user_agent, etc. That directly supports SOC 2 / ISO 27001 evidence, GDPR subject-access and breach-investigation requests, and enterprise security questionnaires — often a hard blocker in B2B/enterprise deals.tenant_id turns Nova's activity log into a per-tenant audit trail, which unlocks customer-facing "activity history" screens, tenant-scoped admin views, and per-tenant retention policies — roadmap items that are otherwise blocked on data that was never captured at write time.delete, force-delete, and restore jobs via the mass-insert override — means destructive actions are attributable, not just creates and updates. That shortens incident triage and reduces engineering time pulled into support tickets.action-events:prune command (--days / --hours / --all, with production confirmation) lets you ship a documented retention window instead of an unbounded audit table. This is a storage-cost decision and a GDPR storage-limitation decision, and it's now a config line rather than a custom job.ip_address capture is toggleable via config, so you can enable it per environment, validate the data quality in staging, and roll to production without a code change.Adopt when:
action_events as your operational audit trail.Look elsewhere or proceed with caution when:
action_events model and ActionResource; there is no value outside it.insert() override as unacceptable coupling. Extending Nova's mass-insert path is the clever part and the fragile part; if your team's policy is "no overrides of framework internals," get an explicit exception or scope down to the creating hook only.For executives: This is a small, low-cost addition that unblocks enterprise and compliance requirements we currently can't satisfy — specifically, being able to say who changed what, from where, and on behalf of which customer. It also converts Nova's existing activity log into a per-tenant audit trail we can surface to customers, and it lets us enforce a retention window so the audit table doesn't grow unbounded. The alternative is building and permanently maintaining the same capability ourselves against Nova's internals.
For engineering: A first stable release of a Nova extension that adds registered columns to action_events and populates them on every write path — a creating hook for the save-based paths and an insert() override for the mass-insert paths (deletes, force-deletes, restores, custom actions). Configuration is publishable (migration, column-stub migration, config), the built-in ip_address column is behind a config toggle, and a custom ActionResource renders registered columns with sensible read-only defaults. Ships an action-events:prune command with day/hour/all granularity and a production confirmation prompt. Quality posture is above the norm for a v1.0.0: 100% line coverage, mutation-tested (MSI ≥ 80%), PHPStan level 8, Pint, CI on Nova 5 (Laravel 11/12/13, PHP 8.3/8.4) and Nova 4 (Laravel 11, PHP 8.4). Requires PHP ^8.2.
Two things to decide explicitly before we adopt: (1) the insert() override touches Nova's mass-insert internals — we should accept that coupling consciously and pin/monitor Nova versions; (2) if this becomes the basis of a compliance obligation, we need a named owner and a fallback, since it's a single first-stable dependency. If both are acceptable, the recommended path is to enable ip_address in staging first, add tenant_id alongside the tenant rollout, and set the prune window to match our documented retention policy.
How can I help you explore Laravel packages today?