awcodes/recently
Awcodes/Recently is a Filament plugin that tracks and displays recently viewed records in your admin panels. Add the plugin, use the trait on EditRecord or ViewRecord pages, and give users quick access to their recent history.
Architecture fit. awcodes/recently is a thin, opinionated Filament panel plugin rather than a general-purpose Laravel package. It has four moving parts: a persisted recent_entries table (published migration), a RecentEntryResource that surfaces tracked entries, a Blade dropdown injected via the PanelsRenderHook::USER_MENU_BEFORE render hook (configurable to other hooks), and an opt-in HasRecentHistoryRecorder trait added to individual EditRecord / ViewRecord pages. Configuration is split between config/recently.php (user_model, max_items, width, global_search, menu, icon) and fluent per-panel overrides (globalSearch(), menu(), icon(), rounded(), label(), width(), maxItems(), renderUsingHook()). This is a good architectural fit only if we are already standardized on Filament panels; there is no standalone (non-Filament) path, and the package assumes it can own the user menu region of the topbar.
Integration feasibility. Install is a two-step composer + php artisan recently:install wizard, followed by one line in the panel provider and a trait on selected pages. The real integration cost is not PHP — it is frontend: the docs explicitly require a custom Filament theme and an @source '../../../../vendor/awcodes/recently/resources/**/*.blade.php' addition to the theme CSS. Teams that have not yet built a custom theme (common in early-stage internal panels) inherit that entire Tailwind/Vite theme pipeline as a prerequisite. Two known plugin conflicts (QuickCreatePlugin, OverlookPlugin) require explicitly excluding RecentEntryResource, which implies the package leaks a resource into shared plugin surfaces and needs coordination when those plugins are added later.
Technical risk. Low-to-moderate, and mostly ecosystem risk rather than code risk:
composer.json constraints before we pin anything.max_stored_items, prune_after_days via model:prune) and dead-link suppression (track_records, include_trashed_records) only arrived in v3.2.0 and are opt-in. Older pins grow the table indefinitely and surface "not found" pages for deleted records.view/viewAny/tenant scoping), users can see breadcrumbs to records they can no longer access. A v1.0.4 fix ("add auth check to query scope") suggests user scoping exists, but resource-level policy enforcement is not documented.Key questions for the maintainer / spike.
canView() / canAccess() and by the current panel's tenancy, or only by user_model + panel ID?recent_entries (user_id, created_at, panel/tenant columns), and what is the retention default with pruning disabled?Stack fit. Appropriate only for Laravel applications running Filament panels (v4/v5 on the 3.x line, v3 on 1.x) with a custom theme already in place or planned. It is a UX affordance for internal/admin tooling — a navigation accelerator, not a data or workflow primitive. Nothing else in the stack should depend on it.
Migration path and sequencing.
composer.json and confirm it against our pinned Filament minor. Do not trust the README matrix alone.recently:install, add the theme @source directive, register RecentlyPlugin::make(), and enable the trait on exactly one high-traffic resource's EditRecord. Validate menu rendering, dark mode, SPA mode, and panel path prefixes.track_records migration, set max_stored_items and prune_after_days, and schedule php artisan model:prune. Do this before traffic, not after.RecentEntryResource::class to OverlookPlugin / QuickCreatePlugin excludes as part of the same change set, so later plugin adopters don't rediscover it.Compatibility and upgrade cadence. Because package majors are welded to Filament majors, our Filament upgrade playbook must include this package as a first-class line item: Filament major bump → package major bump → re-publish config/migrations → re-verify trait placement and render hook. Budget this as recurring, low-effort-but-mandatory work. Laravel 13 support landed in the 3.0.2 line, so the package is reasonably current on framework dependencies; no concern there.
Maintenance. Low code surface, MIT, actively released (dependabot automation and multi-version CI visible in release notes). Single-maintainer project with no downstream dependents — treat it as a convenience dependency with a documented exit path (drop the plugin, keep or delete the table, remove the trait). The exit cost is genuinely small, which is the strongest argument for adoption.
Support. GitHub issues only, no SLA, documentation at docs.aw.codes plus in-repo README. Community translations are partial (German, pt_BR contributed). Internal teams should expect to read the source for anything not covered by the README — plan for one engineer to own familiarity with it rather than assuming self-service.
Scaling considerations.
USER_MENU_BEFORE is a per-page-load concern. If it queries synchronously, every Filament page view pays an indexed lookup. At internal-admin traffic levels this is negligible; in a high-seat-count panel it should be verified and, if needed, cached or lazy-loaded.max_stored_items / prune_after_days are configured. Make pruning part of the install runbook rather than an optional hardening step.Failure modes and mitigations.
| Failure | Impact | Mitigation |
|---|---|---|
Migration not run / track_records enabled without its migration |
Missing-table errors on panel pages | Deploy migrations before flipping flags; gate config on migration presence |
Theme @source missing or theme rebuilt without it |
Unstyled dropdown, visual regression in the topbar | Add the directive to version control with a comment; visual smoke test in CI |
| Entries for deleted records | Click-through to 404 | Enable track_records + include_trashed_records per policy |
| Authorization drift (record access revoked, entry persists) | Potential information disclosure via titles/links | Authorization audit gate; re-test on policy changes |
| Multi-tenant / multi-panel leakage | Records surfaced in wrong panel or tenant context | Confirm per-panel scoping in spike; disable menu on tenant-scoped panels if unverified |
QuickCreatePlugin / OverlookPlugin collision |
RecentEntryResource appears in create/omnisearch menus | Register excludes in the same PR |
| Write failure breaks page render | Edit/view page errors from a non-essential feature | Verify failure tolerance in spike; otherwise accept and monitor |
Ramp-up. Developer ramp-up is genuinely low — one plugin registration line and one trait per page, well documented. The real ramp-up is operational: theme build pipeline ownership, migration sequencing across environments, scheduled pruning, and a standing checklist for new resources and plugin conflicts. Call it half a day for the first panel including the theme work, and near-zero marginal cost afterward.
Recommendation. Adopt with guardrails for Filament-based internal admin panels, contingent on the authorization audit passing and the Filament constraint being confirmed from source. Do not adopt as a platform-wide dependency, do not expose it on tenant-scoped or customer-facing panels without verified scoping, and do not treat it as a source of truth for user activity analytics — it is a navigation convenience, and pruning means it is deliberately lossy.
How can I help you explore Laravel packages today?