beyondcode/helo-laravel
Helo is a Laravel debugging assistant that captures dumps, queries, mails, and other debug output so you can inspect everything in a clean interface instead of cluttering your app or logs. Install via Composer and start debugging without leaving your workflow.
Mail::send, queued mailables — lands in a local viewer with HTML/plain-text rendering, headers, recipients, and attachments. Building that internally is multiple sprints against a finished problem. The PM decision is which workflow to sanction, not whether to innovate here.Mail::fake() assertion only proves that mail was sent, not that it renders. Adopting this turns "does this email render, do links point at the right environment's host, are inline images resolving, are the recipients correct?" into a checkable pre-release step at near-zero tooling cost. That changes QA sign-off criteria and reduces how much verification burden silently stays with whoever wrote the Mailable.require-dev, one config file, one .env line. Treat it as a team-standard tooling choice with a short pilot, not an architectural commitment. Decision cost is measured in hours, and the integration surface is shallow enough that a swap to Mailpit is measured in minutes.Adopt when:
require-dev and deployed with --no-dev, MAIL_MAILER=helo never committed to .env.example, CI, Docker, or K8s manifests, and a boot-time guard that throws if the helo mailer is active outside local/testing.Look elsewhere when:
host.docker.internal, not 127.0.0.1) — otherwise every send is a connection-refused and a slow registration flow that looks like an app bug.helo driver is somehow active in staging or production, outbound mail vanishes with no bounce, no error, no log line, and customers never get their password reset. The three cheap defences — require-dev, never committing the mailer value, boot-time environment guard — are non-negotiable preconditions, not nice-to-haves.For executives — one paragraph: Transactional email is a high-blast-radius feature we currently verify by hand, and broken password resets and receipts are visible to customers immediately. This package gives every developer a local inbox that captures and renders exactly what the app sends, so "do these emails look right" becomes a pre-release check instead of a hope. It costs hours to adopt, runs entirely on developer machines so no customer data reaches a third party, carries no production runtime dependency, and has already declared Laravel 13 compatibility so it won't block our upgrade path. We recommend a scoped pilot with a documented fallback rather than a strategic commitment.
For engineering — the shape of the decision:
composer require --dev beyondcode/helo-laravel, publish config/helo.php, set MAIL_MAILER=helo in your personal .env. Zero application code changes; config/mail.php should never hardcode the driver name.Mail::fake() still short-circuits before the transport resolves, so the test suite is unaffected — tests assert that mail was sent to whom; Helo is for the human eye checking what it looks like. Don't try to put it in CI.app:preview-mail artisan command that fires the whole transactional catalogue (welcome, reset, receipt) at a fake user, so pre-release verification is one command plus a scroll through the inbox.require --dev and deploy --no-dev so a stray helo mailer fails loudly with Unsupported mail transport [helo] rather than swallowing mail; never let MAIL_MAILER=helo reach .env.example or any Docker/K8s manifest; add the boot-time RuntimeException if the mailer is active outside local/testing; bind the viewer route to web + auth on shared networks since captured payloads contain live reset tokens.php artisan config:clear after editing .env, queue:restart for long-running workers, client-not-running produces slow requests rather than just missing mail, and multiple apps share one inbox with no per-app separation.How can I help you explore Laravel packages today?