spatie/ignition
Spatie Ignition is a beautiful, customizable error page for PHP apps, with a dark mode and simple registration. Laravel, Symfony, and Drupal integrations are available.
Architecture fit
spatie/ignition is the framework-agnostic rendering engine behind Laravel's familiar local error page. The distinction matters commercially: for a Laravel estate, this package is almost always present transitively via spatie/laravel-ignition (bundled by default in Laravel's require-dev), so a direct dependency is rarely the correct integration point. A TPM should treat this repo as the capability layer — custom Solution objects on domain exceptions, pluggable HasSolutionsForThrowable providers, theming, and Flare/OpenAI hooks — and treat laravel-ignition (or the Symfony/Drupal/OpenMage adapters) as the installation vehicle per stack. The 521 stars and "0 dependents" understate real adoption precisely because consumption is transitive; do not use those numbers as a maturity proxy in a build-vs-buy conversation.
Architecturally the package is a bootstrap-time singleton: Ignition::make()->...->register() installs itself as the throwable handler. That is a global, last-writer-wins hook. Any existing handler — Sentry, Bugsnag, Laravel's own Handler, a legacy set_exception_handler — sits in the same slot, so handler ordering is a genuine design decision, not a footnote.
Integration feasibility
Low. One composer require, one registration line in the bootstrap, optional applicationPath() to clean stack traces. The high-value work is not installation but authoring: wrapping the 5–15 bespoke exception classes your teams actually debug into ProvidesSolution implementations, and writing one or two HasSolutionsForThrowable providers that encode institutional runbook knowledge ("this 503 means the queue worker is starved, page #oncall"). That is where a TPM gets leverage — it converts tribal knowledge into a rendered artifact at the moment of failure.
The AI-powered solution provider is the highest-friction feature to approve. It posts exception class, message, stack frame and surrounding context to OpenAI. It is explicitly opt-in, excludes request payload and environment variables, and supports PSR-16 caching via useCache(). Feasible, but it is a third-party data egress path triggered by production-adjacent incidents.
Technical risk
shouldDisplayException() / runningInProductionEnvironment() must be wired to a real environment check before this is ever enabled outside local/staging. A single misconfigured APP_ENV on a public host is a disclosure incident.censorRequestBodyFields(['password']) and anonymizeIp() exist but are opt-in defaults — someone must own them.Key questions
laravel-ignition, or genuinely adding a new dependency?Stack fit
Split the estate by framework before writing any tickets:
| Stack | Correct package | Effort |
|---|---|---|
| Laravel 9–12 | spatie/laravel-ignition (usually already in require-dev) |
Config + solution authoring only |
| Symfony | spatie/symfony-ignition-bundle |
Bundle registration |
| Drupal 10+ | Ignition contrib module | Module enable |
| OpenMage | empiricompany/openmage_ignition |
Module enable |
| Raw/legacy PHP | spatie/ignition directly |
Bootstrap hook |
Installing spatie/ignition directly into a Laravel app duplicates and can conflict with the framework's own error handling. Make "identify the correct adapter per repo" step one of the rollout, not a mid-sprint discovery.
Migration path
There is no migration — this is additive and reversible. That is its main political asset: it can ship behind a flag, per-repo, with no schema, no API contract, and no data migration. Sequence:
shouldDisplayException() is bound to a local/staging predicate in every app. Add a CI assertion or config review item that the production branch cannot render the page.ProvidesSolution classes. This is the deliverable with measurable value: reduced time-to-diagnosis for on-call.HasSolutionsForThrowable providers only for cross-cutting cases — queue starvation, DB connection exhaustion, feature-flag misconfiguration — with documentation links into your internal runbooks.useCache() configured, a scoped API key, per-environment enablement, and a cost ceiling. Treat as an experiment with a named owner and a removal date.Compatibility
Verify the PHP floor against the oldest app in scope first; a single 7.4 holdout can strand an entire rollout. Check for set_exception_handler / set_error_handler collisions in apps with custom bootstraps, and for double-reporting where an existing tracker already instruments the same throws. Lock versions per repo rather than floating, given the release-date anomaly noted above.
Sequencing
Dev environments first, staging second, production rendering never. The production-only capabilities (Flare reporting) are a distinct workstream with distinct stakeholders. A TPM should explicitly scope this initiative as developer experience and mean-time-to-diagnosis, not production observability, or scope creep into monitoring spend will follow.
Maintenance
MIT, actively maintained by Spatie with published changelog and tagged releases, and a documented contributor workflow — low supply-side risk. The real maintenance burden is internal: solution classes and provider code rot silently when exceptions are renamed or runbook URLs move, and nothing fails loudly when a Solution returns a stale link. Budget a quarterly review against the actual top-exceptions list. Treat solution text as documentation that happens to compile — it needs an owner, not just an author.
Support
Community support via GitHub issues, no SLA. Spatie monetizes through Flare and paid products, so commercial leverage exists if a critical issue arises, but only if you are a customer. For an internal platform team, the practical posture is: low blast radius (dev-facing), easy to patch by forking under MIT, and no vendor negotiation required. Do not place it on a critical path where a 48-hour issue response would halt delivery — it won't, because it only affects local debugging.
Scaling
Rendering cost is irrelevant: the page only renders for failed developer requests. The two things that scale in the wrong direction are (a) OpenAI calls, which scale with error variety rather than traffic, and (b) Flare ingestion, which scales with production exception volume and is priced accordingly — an exception storm becomes a billing event as well as an incident. Cache the AI provider and sample Flare reporting if the latter is ever adopted. Neither affects application throughput, since neither sits on the success path.
Failure modes
Ramp-up
Low — a mid-level engineer can complete a first integration in under a day, and the Solution / HasSolutionsForThrowable contracts are two methods each. The genuine ramp-up cost is organizational, not technical: getting teams to write solutions for their own exceptions, and getting security/compliance to approve the AI and Flare egress paths. Plan for one platform-team engineer at ~20% for a month, plus review time from security and from whoever owns the existing error tracker. Expect the approval conversations to take longer than the implementation.
How can I help you explore Laravel packages today?