awcodes/recently
Recently adds a "Recently Viewed" menu to Filament 4 and 5 panels, tracking visits to EditRecord and ViewRecord pages. Install via Composer, add the plugin, and include the trait on resource pages so users can quickly reopen records they've interacted with.
Architecture fit. awcodes/recently is an additive Filament panel plugin, not a framework-level dependency. It integrates through three supported extension points only: the panel plugin registry (->plugins([RecentlyPlugin::make()])), a page-level trait (HasRecentHistoryRecorder on EditRecord/ViewRecord), and a render hook (PanelsRenderHook::USER_MENU_BEFORE by default, overridable via renderUsingHook()). It also contributes a RecentEntryResource that participates in Filament's global search. No core patching, no service-provider overrides, no middleware. This is the lowest-friction integration shape Filament offers, which is the main argument in its favor.
Integration feasibility. Straightforward for a team already on Filament 4.x/5.x: composer require awcodes/recently, php artisan recently:install, register the plugin, add the trait to two page classes, done. Two non-obvious prerequisites carry most of the real effort: (1) a custom Filament theme must exist and the package's Blade views must be added to the theme CSS via @source '../../../../vendor/awcodes/recently/resources/**/*.blade.php' — meaning a front-end asset build step and rebuild are mandatory, not optional; (2) the package ships at least two migrations (base table, plus the v3.2.0 track_records migration published under the recently-migrations tag), so schema change control must be sequenced.
Technical risk.
composer.json constraints in the tag, not the README.EditRecord/ViewRecord page hit, which is a per-pageview write on your primary database.Key questions.
max_stored_items/prune_after_days sufficient without an index review?RecentEntryResource exposed in panel navigation and global search by default, and can it be hidden without forking?Stack fit. Laravel (up to Laravel 13 per v3.0.2) + Filament panels 4.x/5.x, PHP 8.2+. The package is strictly useless outside Filament panels — if any part of the admin surface is Livewire/TALL but not Filament, it will not cover it. Use the 3.x line: it supports Filament 4 and 5 on one release line, which removes a major-version fork from your upgrade path.
Migration path. Pin ^3.1 initially (v4/v5 dual support, no forced migration), then move to ^3.2 when you want pruning and deleted-record hiding. v3.2.0 is explicitly backward-compatible: "Every new option defaults to the current behavior." The only upgrade friction is the track_records migration, which is opt-in but must be published and run before enabling the flag.
Compatibility. Two documented conflicts: OverlookPlugin and QuickCreatePlugin both need RecentEntryResource::class added to their excludes([...]), otherwise the plugin's own bookkeeping resource shows up in their pickers. Also verify SPA mode (fixed in 1.0.4) and any custom theme pipeline — a missed @source line yields an unstyled dropdown, not an error, so it fails silently in review.
Sequencing.
composer.json, not the README table.menu(false) and globalSearch(false) — no UI exposure yet.@source directive, rebuild assets, verify the dropdown renders styled.max_stored_items and prune_after_days, and confirm model:prune is actually scheduled.track_records (with its migration) and decide deliberately on include_trashed_records.Maintenance. ~One table, one resource, one trait, one render hook, one config file. The code surface you own is small; the surface you inherit is a dependency on a solo maintainer plus a theme build step that must survive every Filament upgrade. Release cadence is healthy (Dependabot bumps, CI, a recent feature release responding to community proposals in #39/#40), which is a positive signal for responsiveness despite the low star count.
Support. No commercial backing. GitHub issues, a docs site (docs.aw.codes/recently), and Filament community channels. Escalation path for a production incident is effectively "read the source" — budget accordingly.
Scaling. The dominant cost is one write per tracked page view. At meaningful admin traffic this is the first thing to break: it competes with business writes on the primary, and the table grows monotonically until pruning is enabled. Levers: max_items (UI only) vs. max_stored_items (storage) vs. prune_after_days (scheduler-driven) are three distinct knobs — teams routinely set only the first and are surprised later. Confirm an index on the user key before enabling broadly.
Failure modes.
@source omitted → silently unstyled menu.model:prune unscheduled → unbounded table growth.track_records is enabled; soft-deletes need include_trashed_records).OverlookPlugin/QuickCreatePlugin unexcluded → internal resource leaks into user-facing pickers.USER_MENU_BEFORE if other plugins target the same slot.Ramp-up. Low for anyone fluent in Filament plugin conventions: roughly half a day to install, theme, and validate in staging. The real cost is the review window — half a day to a day of engineering plus a security/privacy pass on tenancy and policy evaluation before this goes panel-wide. Total credible estimate: one engineer, two to three days, gated on the tenancy answer.
How can I help you explore Laravel packages today?