Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Bones Flash Laravel Package

genealabs/bones-flash

GeneaLabs Bones Flash is a Laravel package for session-based flash notifications. It provides a clean API to queue success, error, warning, and info messages and render them in your views, making consistent user feedback easy across your application.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. genealabs/bones-flash is a session-backed flash-message module: a static helper/facade plus a Blade partial. Its entire surface area (roughly 150–200 lines across a writer, provider, config, and view) sits at the edge of the app — controllers and form requests set messages, layouts render them, session storage carries them across the redirect. That is a clean fit for the narrow problem it addresses and a poor fit for anything broader. It is not a notification system: no persistence, no read/unread state, no queued or multi-channel delivery, no user preferences. Any requirement that includes those words is a different product (Laravel's first-party notifications), and conflating the two is the most likely estimation error in this evaluation.

Integration feasibility. Mechanically low-effort: composer require, auto-discovery on the targeted framework versions, vendor:publish for views/config, one @include('messenger::messages') in the layout, one messenger()->success(...) call before a redirect. A competent Laravel engineer can have a spike running in under a day. The gating question is not integration effort but resolution: the last release is March 2020, mapping to the Laravel 5.5–7 / pre-PHP-8 era. On Laravel 9/10/11+ or PHP 8+, composer why-not genealabs/bones-flash is the go/no-go gate, and the expected answer is no-go.

Technical risk. Ranked:

  • Abandonment (high, certain). No release in 5+ years, 135 stars, zero dependents, no evident security disclosure process. Adopting means we become the maintainer of every bug we hit.
  • Compatibility failure (high, likely). Dependency resolution failure is loud and cheap; silent breakage of provider/Blade registration after a framework bump is the expensive version.
  • Output escaping (medium, severe if realized). Flash payloads routinely carry user-supplied text (names, filenames, imported titles). If the rendered view uses {!! !!}, we have unpatched XSS with no upstream fix path. This is the one failure mode that is a security incident rather than an annoyance.
  • Name/repo drift (medium). The package (genealabs/bones-flash) and repository (GeneaLabs/laravel-messenger) disagree. "Patched source" may not be what CI installs on another machine unless pinned via fork or vcs override.

Key questions for engineering before any commitment:

  1. What Laravel and PHP versions are actually in scope, and does the package resolve there without pinning the framework down?
  2. Does the shipped Blade view escape output, and can we prove it with a test that flashes a script payload?
  3. Is a thin in-house wrapper (app\Support\Flash) acceptable as the only call-site dependency, so the vendor is removable in an afternoon?
  4. Who owns removal, and by when? If nobody will own the removal ticket, the answer is do not adopt.
  5. Is there any requirement hiding behind "flash messages" that actually means notifications, preferences, or delivery channels?

Integration Approach

Stack fit. Appropriate only for Laravel 6/7-era applications, Blade-based rendering, no front-end framework requirement. It composes well with a FormRequest for validation and a single flash call after a successful write, and it deliberately does not interfere with $errors / @error markup — which is correct, and worth enforcing as a convention so validation errors and flashes don't duplicate each other in the UI. If the stack already runs Alpine/Livewire/Vue, hand session keys to the existing toast library and skip the package's rendering entirely.

Migration path (the core TPM decision). Adopt only behind a seam:

// app/Support/Flash.php
class Flash {
    public static function success(string $m): void { messenger()->success($m); }
    public static function error(string $m): void   { messenger()->error($m); }
}

Every call site depends on our class, never the vendor. The exit — replacing ~15 lines with session()->flash() plus a matching Blade component — is a one-to-three-day effort, executable in an afternoon once the seam exists. That asymmetry is the whole argument: the package is cheap to try and cheap to leave, provided we never let it leak past the wrapper. For new work on modern Laravel, skip straight to native session()->flash() + a shared component, or spatie/laravel-flash if a maintained third-party abstraction is preferred.

Compatibility. Pin exact versions. Verify with composer show genealabs/bones-flash --all and read the requires block before writing any code. Treat framework upgrades as a re-evaluation trigger, not a routine chore: on auto-discovery failure the symptom is Class "GeneaLabs\..." not found at boot or a partial that renders nothing. The remediation is explicit provider registration in config/app.php / bootstrap/providers.php plus php artisan view:clear.

Sequencing.

  1. Spike (½–1 day). Scratch app, confirm resolution, confirm the facade name, Blade namespace, and publish tags by reading src/ and grepping for loadViewsFrom / publishes.
  2. Wrapper first, before any call sites. Land app\Support\Flash and a lint/PR convention that vendor calls are not permitted outside it.
  3. Publish and own the views. Move into resources/views/vendor/messenger/, swap in design-system classes, add dismiss controls, icons, and ARIA (role="alert" for errors, role="status" otherwise).
  4. Tests as the contract. Feature tests asserting the session key is set, the message renders after redirect, it does not survive a second request, and a script-tag payload renders escaped. The second and third are the invariants most likely to break silently.
  5. ADR + removal ticket on day one. State why the module exists, where the wrapper lives, who owns it, and the replacement plan.

Operational Impact

Maintenance. This is the dominant cost and it is not integration — it is ownership. Five-plus years unmaintained with zero downstream consumers means no community pressure, no upstream fixes, and no one else hitting our bugs first. Budget it explicitly. Keep the footprint to a handful of call sites behind the wrapper; a package nobody upstreams into becomes orphaned code the next team is afraid to touch.

Support. No SLA, no security disclosure process, single-maintainer signal. If the organization requires either a support contract or a CVE response path, this fails the bar outright. It is also a useful stress test for dependency policy: if the current policy would greenlight this for new work, the policy is too permissive, and it is cheaper to tighten it here than on a higher-stakes adoption.

Scaling. Session-backed by design; there is no delivery queue, no fan-out, no cross-device state — which is correct for the problem, and a hard ceiling if requirements grow. One concrete operational limit: the session cookie driver has a ~4KB ceiling. Flashing a long validation summary or a list of failed rows will truncate or blow the cookie, and the symptom is an empty session or a 500 — not an obvious flash bug. Cap message length at the call site and never interpolate arbitrary user input wholesale. Also cap message count: stacking five warnings degrades the UI faster than it informs the user.

Failure modes and triage. The signature failure is a message that silently doesn't appear. Debug the session, not the package: dd(session()->all()) in the layout before the include tells you immediately whether the write never happened (call site in a job, queue, or middleware without session), happened into the wrong session (driver/domain mismatch), or happened and rendered nowhere (partial missing from the layout or inside an unreached branch). Flashes written before a middleware that regenerates the session, or in a terminated/queued context, vanish — write flashes as the last thing before returning the redirect. Stale compiled views after publishing are a frequent red herring; php artisan view:clear first. Do not fork the provider: publish views (the intended extension point) and wrap the API; if the code must be owned, copy ~150 lines into app/Support/ under our namespace and drop the dependency, which is cheaper than a fork and buys no merge conflicts on future framework bumps.

Ramp-up. Low. The entire source is readable in one sitting, the mental model (write flash → redirect → render partial → gone) is standard Laravel, and any mid-level engineer productive in Blade can own it. The real ramp-up risk is organizational, not technical: a successor inheriting an unmaintained dependency with no ADR and no removal ticket. A two-line note now prevents that.

Recommendation. Do not adopt for new work. Where an existing Laravel 6/7 app already depends on it, pin versions, contain it behind the wrapper, and schedule removal — do not expand the footprint. Where the requirement is genuinely "show a banner after a redirect," build the ~150-line equivalent in-house on native session()->flash() plus a shared Blade component, or adopt spatie/laravel-flash. Where the requirement is broader than transient messages, the correct answer is Laravel's first-party notification system and this package should not be in the conversation at all. The problem this package solves is real and recurring; it is also small enough to own outright, which makes "buy" the wrong side of the ledger here.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
mrnewport/laravel-plaid
mrnewport/laravel-repo
mrnewport/laravel-docsign
mrnewport/laravel-stow
mrnewport/laravel-flow
mrnewport/laravel-priceable
mrnewport/laravel-nestedterms
fredmeng/laravel-apidoc-generator
itstructure/laravel-multilingual-tools
pdustdar/elasticsearch
markupai/php-sdk
rlacerda83/lumem-microservice-shipment
uni-method/symfony-lib
tacticmedia/scim-server-bundle
neika-ai/symfony-bundle
mattleads/agent-publishing-bundle
glavweb/framework-bundle
glavweb/extra-bundle
glavweb/api-bundle
glavweb/admin-bundle