eyewitness/eye
Eyewitness Eye is a lightweight, self-hosted Laravel package that keeps watch over your application, capturing errors and exceptions and presenting them in a clean, searchable dashboard so you can diagnose issues quickly and keep your app healthy.
What the package is. eyewitness/eye is a thin first-party SDK for a hosted Laravel application-monitoring service (Eyewitness.io). Functionally it is a service provider plus config stub and a set of request/exception/query listeners that ship telemetry to a remote endpoint — the same product category as Laravel Telescope, Sentry, Inspector, or New Relic. The code itself is likely small; the value lives entirely in the remote service it talks to.
Architecture fit. Fits one narrow case: a Laravel 5.x application that wants hosted APM and has no existing observability stack. It does not fit anything modern. Laravel 5 is long past end-of-life, and the contracts this package hooks — the exception handler's report/render signatures, config/app.php provider registration (pre-5.5), container bindings, and the absence of package auto-discovery — have all changed materially through Laravel 6–12. Porting is not a config change; it is a fork.
Integration feasibility. Mechanically trivial: composer require, publish config, set an API key in .env. The hard part is not the install, it is the dependency. The package is a client with no server of its own, so feasibility is gated entirely on the Eyewitness.io service still being live, credentialed, and contractually usable. That is unverified and is the first thing to establish.
Technical risk: High.
composer.json will pin the framework and cascade into Guzzle/PHP version conflicts on any upgrade attempt.Key questions for the vendor/owner before any commitment:
Stack fit. Target is PHP 5.5–7.1 on Laravel 5.0–5.8. On 5.5+ package auto-discovery may handle provider registration; on 5.0–5.4 it is a manual entry in config/app.php. Confirm the Guzzle major version the client requires against what the host app already resolves — a Guzzle 5 vs. 6 conflict is the most likely install blocker.
Migration path. Treat this as a bridge, not a destination. Recommended shape:
internal/telemetry-eyewitness) rather than depending on eyewitness/eye from Packagist. This removes the abandoned-upstream risk and lets us patch PHP/Laravel compatibility ourselves.TelemetryReporter interface in the app and have the Eyewitness client be one implementation. That is the seam that makes the eventual swap to Telescope or Sentry a binding change, not a refactor.Compatibility. Verify against the exact Laravel minor and PHP patch in prod, not "Laravel 5." Check for collision with any existing middleware, the exception handler, and query logging — double-registering a query listener is a common way to silently double DB overhead.
Sequencing. Audit the source and the data payload first, then staging install behind an env flag (TELEMETRY_DRIVER=eyewitness vs. null), soak for a sprint with sampling on, then and only then production. Never roll this out as part of a bundled release where it cannot be isolated and killed independently.
Maintenance. Zero upstream maintenance. Once the maintainer or the service goes dark we own the code outright — security patches, PHP 8 compatibility, Laravel upgrades. Budget it as internal software, not a dependency.
Support. No viable escalation path. If ingestion breaks, we debug a closed-source SaaS from the client side. Contrast with Sentry or Telescope, where the failure mode is documented and the code is readable.
Scaling. The critical question is whether reporting happens inline on the request or via terminate()/queue. Inline HTTP calls to a third-party endpoint add directly to p99 latency and couple our request success to their availability. Mitigations regardless of answer: push to a queue, cap payload size, sample aggressively (5–10% of successful requests, 100% of errors), and set a hard connect/read timeout measured in hundreds of milliseconds.
Failure modes to design for.
.env is fine; confirm it is not logged in the payload or echoed in error responses.Ramp-up. Low to install (half a day), high to own responsibly (audit, fork, interface abstraction, timeout hardening — call it 3–5 engineering days). The real cost is the standing obligation to maintain a dead package.
Recommendation. Do not adopt for new work. For an existing Laravel 5 app already using it, isolate it behind a feature flag and a fork, and schedule replacement. The default path is Laravel Telescope for local/staging introspection and Sentry (sentry/sentry-laravel) for hosted production error and performance monitoring — both actively maintained, both with named maintainers, both with far better community validation than a zero-dependent SDK for a niche, possibly defunct SaaS.
How can I help you explore Laravel packages today?