finity-labs/fin-sentinel
Fin Sentinel is a Laravel package for application monitoring, auditing, and alerting. It helps you track important events, spot suspicious or failing behavior, and respond before users are affected, with a lightweight setup that fits naturally into existing Laravel applications.
Architecture fit. finity-labs/fin-sentinel is a Filament panel plugin that adds two pages to an existing admin panel: a log file list (sentinel/logs) and a log file viewer (sentinel/logs/{base64 file}). It is a thin, self-contained surface — composer package, panel registration, no external service, no database migrations described in this release. It fits teams already running Filament + Filament Shield who want in-panel log access without standing up a log UI. It is not a log aggregation or observability tool; it reads files off the host's filesystem.
Integration feasibility. Low engineering effort: composer require, register the plugin in the panel provider, optionally publish config, then handle authorization. The real work in v1.2.3 is not code — it is the permission grant. This is a same-day change for a competent Filament developer; the TPM cost sits in the RBAC rollout and comms, not the build.
Technical risk. The release fixes a genuine security defect: before v1.2.3, Pages\LogFileViewer implemented neither HasPageShieldSupport nor its own canAccess(), so any authenticated panel user could read log files by guessing a filename — laravel.log suffices — regardless of role. Laravel logs routinely contain stack traces with query fragments, connection strings, email addresses, session identifiers, and occasionally tokens or PII. If you are on v1.2.2 or earlier, treat this as an active exposure and assess whether panel access is broad (all staff, external tenants, SSO to the whole company). Secondary risks: (a) the fix is authorization-only — the mount() path check is explicitly unchanged, so directory-traversal protection rests on that one control and deserves a read; (b) a behavior change masquerading as a patch — roles that could read logs now get 403 until View:LogFileViewer is granted alongside View:LogFileList; (c) the fallback chain is Shield → page_LogFileViewer Gate → plugin canAccess() closure, so on a Shield-less install the effective policy is whatever that closure returns, which must be reviewed explicitly.
Key questions.
canAccess() closure return today, and is it used as the sole gate anywhere?laravel.log?Stack fit. Laravel with Filament v3/v4 panels; Filament Shield optional but clearly the primary integration path (the release states Shield already generates View:LogFileViewer from panel discovery). No infrastructure footprint, no daemon, no storage layer. Appropriate for internal ops/admin panels; not appropriate as the sole log access path for production incident response.
Migration path. Upgrade the package to v1.2.3, then grant View:LogFileViewer to every role that holds View:LogFileList and is expected to read logs. No shield:generate re-run is required for the page itself. On non-Shield installs, either define the page_LogFileViewer Gate ability or confirm the plugin canAccess() closure expresses the intended policy. Validate the 200/403 matrix in staging with a real non-admin role before production — do not infer it from the diff.
Compatibility. No schema changes, no config file changes, no public API breakage. Semver says patch; operationally treat it as a permission-breaking change and route it through your normal access-control change process rather than a routine dependency bump.
Sequencing.
View:LogFileViewer in the production permission set before deploy, so the upgrade does not momentarily lock out on-call staff.Maintenance. Small dependency, low churn, single maintainer org — pin the version and review releases rather than floating. The v1.2.3 contents are a positive signal: the vendor fixed an authorization gap promptly and, notably, added the package's first page-access tests over a real Filament panel, which should reduce future regression risk on the auth seams.
Support. The dominant ticket after rollout will be "the log viewer gives me 403." Log reading is an on-call workflow, so a 403 at 03:00 reads as an outage to the person debugging an outage. Put the permission name in the runbook and in the release note to engineering before deploy, not after.
Scaling. Two structural limits worth setting expectations on. First, file-based reading: a multi-gigabyte laravel.log can make the viewer slow or memory-heavy, so retention/rotation policy matters more than usual. Second, topology: in containerized or autoscaled environments with ephemeral or per-node filesystems, the viewer shows only the local replica's logs — possibly empty, possibly stale. Keep a centralized logging system (Loki, CloudWatch, ELK) as the authoritative source and position this plugin as a convenience for single-host or shared-volume deployments.
Failure modes.
canAccess() closure, reproducing the original problem in a different form.View:LogFileViewer to a wide role set re-creates the confidentiality exposure the release was meant to close — grant narrowly.Ramp-up. Effectively zero for a Filament-fluent developer to install and wire up. For the TPM, budget roughly half a day: RBAC inventory and grants, staged verification of the permission matrix, release comms to on-call, and a short review of whether raw log content is appropriate for the current panel audience.
How can I help you explore Laravel packages today?