ccampbell/chromephp
ChromePhp sends PHP logs and variables directly to the Chrome DevTools console using the Chrome Logger protocol, so you can debug without cluttering page output or digging through server logs. Just include the class and call ChromePhp::log().
Architecture fit — poor. ChromePHP is a single static class that serializes PHP variables into a base64/JSON payload and emits it as an X-ChromeLogger-Data HTTP response header for consumption by a companion Chrome extension. It has no service provider, no configuration, no PSR-3 compliance, and no awareness of Laravel's Log facade or the Monolog channel stack. That means it sits beside our logging architecture, not inside it: every call site is a hard-coded static call (ChromePhp::log($x)) that bypasses channel routing, contextual processors, and structured log formatting. As a dev-only eyeball tool that is acceptable; as anything resembling an observability layer it is a dead end.
Integration feasibility — trivial to install, awkward to run. composer require --dev ccampbell/chromephp plus autoloading is a five-minute job. The friction is at runtime: the class writes headers via header() directly, which conflicts with Laravel's response lifecycle. Any output before the call (echo, stray whitespace, a streamed response, a debug tool that flushes early) produces "headers already sent" and silently degrades. Under Octane/Swoole or queue workers there is no HTTP response to attach to, so the library no-ops.
Technical risk — high, and mostly external. Three concerns dominate:
Key questions for the team:
symfony/var-dumper with the dump server, or Ray does not already close?Stack fit. Marginal. It targets a Laravel/PHP 8.x stack only as a require-dev convenience. There is no Laravel package discovery, no publishable config, and no Monolog handler we would own — Monolog's own ChromePHPHandler exists historically but has been deprecated/removed in current majors for exactly the reasons above.
Migration path. Treat this as a transitional aid, not a target state. The realistic ladder is: ChromePHP → symfony/var-dumper + dump()/dd() against the dump server → Telescope (request-scoped inspection) or Ray (dedicated UI). If a team is already on Monolog, going straight to a VarDumper-based workflow avoids the browser-extension dependency entirely.
Compatibility. Practically it runs on PHP 7.x/8.x, but "runs" is not "supported." Known incompatibilities: Octane/Swoole (long-lived workers, header state bleed), CLI and queue contexts (no headers), streamed and file-download responses, JSON APIs consumed by non-browser clients, and any handler that flushes output early.
Sequencing.
require-dev, gated behind APP_DEBUG and an explicit CHROMEPHP_ENABLED env flag defaulting to false.Debug::dump() facade so the codebase is not bound to the package; the swap-out later becomes a one-file change.composer install --no-dev smoke test) that fails if the class is present in a release artifact.Maintenance. Zero upstream maintenance means we own it. The good news is the surface is one class, so a vendored fork is cheap. The bad news is there is no channel for security fixes, and a dormant package in require-dev still shows up in SCA reports and dependency-review gates, creating recurring triage noise for the platform team.
Support. No vendor, no SLA, README-only documentation. Because it is developer-facing, blast radius is contained to local environments — but that also means it will never get formal support investment, and each new hire must independently discover and install an extension that may no longer be installable.
Scaling. Two hard ceilings matter more than throughput. First, header size: Apache's default LimitRequestFieldSize (~8 KB) and nginx's large_client_header_buffers (8 KB default) will truncate or 400 on any non-trivial dump long before Chrome's own limits apply. Second, payload encoding cost scales with the object graph — dumping an Eloquent collection with eager-loaded relations serializes the whole thing on the request thread.
Failure modes.
Ramp-up. Genuinely minutes for an individual who already has the extension. Effectively blocked for anyone on a current Chrome build without a sideloaded MV2 extension — which is the majority of new engineers. Budget onboarding time for "here is why this tool doesn't work and what to use instead," which is itself an argument for standardizing on the replacement now.
How can I help you explore Laravel packages today?