leafs/blade
leafs/blade provides reusable Blade components for adding interactive maps to Laravel applications. Drop a component into any view, pass coordinates and markers, and customize the map without writing JavaScript by hand. Lightweight, expressive, and easy to integrate.
leafs/blade is a thin adapter that ports jenssegers/blade — itself a standalone wrapper around illuminate/view — into the Leaf PHP framework's service container and bootstrapping conventions. Architecturally, that means the package is not really a templating engine; it is a compatibility shim. The real engine is Laravel's Blade compiler, and the real dependency weight is illuminate/view plus its transitive support packages (illuminate/container, illuminate/events, illuminate/support, illuminate/filesystem). A TPM should evaluate the shim and the engine separately, because they carry very different risk profiles.
Architecture fit. Strong on developer ergonomics, weak on framework philosophy. Leaf positions itself as a minimal, low-ceremony micro-framework; pulling in a subset of Illuminate reverses that value proposition. If the team's reason for choosing Leaf was footprint, cold-start, or a small dependency graph, this package partially negates it. If the reason was "Laravel-like DX without Laravel," Blade is precisely the right lever — layout inheritance, components, slots, @include/@each, automatic escaping, and custom directives are genuinely mature and well-documented.
The v5.0 release shifts this calculus slightly in the package's favour. It is no longer a pure pass-through: rendering now emits breadcrumbs into Leaf Crash (the framework's error-handling surface, so a crash report shows which views rendered and how long each took), and @lingo/@tl directives bind templates to Leaf Lingo for translations. Those are Leaf-native capabilities that jenssegers/blade or illuminate/view alone would not give you. The adapter is acquiring a reason to exist beyond wiring — but it is also acquiring Leaf-specific coupling, so the "just depend on the wrapper upstream" escape hatch is now less like-for-like than it was.
Integration feasibility. Mechanically easy. Composer install, register a view path and a compiled-view cache directory, wire the container, render. There is no data migration, no protocol change, no service boundary to negotiate. The friction is dependency resolution, not integration effort — and v5 tightens that friction (see below).
Technical risk. High relative to the value delivered, and concentrated in provenance rather than code. Four stars and zero dependents means the package has essentially no production validation signal in the ecosystem — no downstream package constrains its API, no issue tracker history of real-world edge cases, no third-party tutorials. The adapter layer is maintained by the Leaf project (small team, likely single-maintainer concentration), while the engine underneath is maintained by Laravel with a much faster major-version cadence. That creates a version-lag exposure: an illuminate/* bump can strand the adapter, and a jenssegers/blade restructure can strand it faster.
v5.0 is exactly the event that risk model predicted, and it cuts both ways. The reassuring half: the maintainer shipped a coordinated major release that tracks Illuminate ^11 | ^12 | ^13 — a three-major window, not a single pinned line — which is a credible statement that the adapter intends to keep pace with Laravel, and a test suite moved onto Alchemy suggests the release is actually exercised rather than hand-verified. The concerning half: this is a breaking change. The PHP floor moved to 8.2+ and the Illuminate floor moved to 11. Any application locked to Illuminate 9 or 10 by another dependency cannot take v5, and there is no stated long-term-support or backport policy for the v4 line. "Stranded on v4" and "receiving no security patches" are the same sentence six months from now. Confirm what, if anything, the maintainer commits to patching on the prior major.
There is also a redundancy question worth surfacing early. Leaf ships its own Blade-inspired view layer with similar syntax. Adopting leafs/blade may be solving a problem the framework already solved adequately for the team's actual templates. Confirm the gap before committing — and note that the new Leaf Crash and Lingo integrations narrow that gap's justification only if you already use those Leaf subsystems; if you don't, you're paying the Illuminate dependency cost for features you won't call.
Key questions for the maintainer or spike:
jenssegers/blade or a runtime wrapper? If a fork, what is the sync cadence with upstream, and who owns that? (More important now that the package is adding its own directives on top.)^11 | ^12 | ^13 is declared — but which versions does CI actually test? A three-major constraint with a single-version test matrix is a false comfort.@lingo and @tl optional, or does the package now pull leafs/lingo as a hard dependency? If hard, the dependency graph grew and the "minimal footprint" objection strengthens.illuminate/view directly still a sane fallback, or do we lose meaningful behaviour?Stack fit. Appropriate for a Leaf application that needs Blade specifically — component-driven UI, designers already fluent in Blade, or a codebase migrating off Laravel where template reuse has real value. Stronger fit than before if the application already runs Leaf Crash and Leaf Lingo, since v5 turns those from neighbours into integrations. Poorly suited as a greenfield default on a Leaf project with simple templates, where the native view layer avoids the entire dependency question.
Migration path. Incremental and low-drama at the template level, but v5 introduces a hard prerequisite gate that must be cleared before the template work starts: PHP 8.2+ and Illuminate 11, 12, or 13. Check the environment and the rest of the lock file first. If the app is on Illuminate 10 or PHP 8.1, v5 is unavailable and the decision becomes "adopt v4 knowingly as an unsupported branch" or "defer" — a materially different conversation that should not be discovered mid-sprint. Once past that gate, Blade and Leaf's native rendering can coexist per-route; there is no cutover event, no dual-write, no state to reconcile.
Compatibility. Verify four things before any commitment: the PHP 8.2+ floor against your runtime and CI images; the illuminate/* constraint against the rest of the lock file (expect this to be the binding constraint, since Illuminate 11/12/13 is a narrow window); whether the new Leaf Crash and Lingo integrations are optional or drag additional Leaf packages into the graph; and whether the compiled-view cache path is writable and excluded from version control. Dependency conflicts here tend to surface late, at composer update time, rather than at install.
Sequencing.
illuminate/* versions pulled in.ViewRenderer interface with a Blade implementation behind it. This costs hours and converts a vendor-lock problem into a swap — especially valuable now that the adapter is accreting Leaf-specific directives, which are the parts hardest to reproduce elsewhere.composer.json, committed lock file, and a deliberate (not automatic) upgrade review. Renovate/Dependabot auto-merge is inappropriate here — v5 itself demonstrates that a major bump can move the PHP floor out from under you.illuminate/view directly — and note explicitly what you lose (breadcrumb instrumentation, translation directives) so the fallback is a costed decision rather than a rewrite.Maintenance. The recurring cost is dependency stewardship, not bug fixing. Expect to own version-lag decisions personally: when Laravel ships an illuminate/view major, someone must determine whether the adapter still works — and when the adapter ships its own major, someone must determine whether the application can move. v5 shows both directions of that coupling in a single release. Budget a small, recurring review rather than a large one-time integration, plus an explicit calendar reminder to re-evaluate the v4 support question if you defer the upgrade.
Support. Community-only. GitHub issues, no SLA, no vendor to escalate to, and a very thin base of prior art to search — a four-star package means most problems you hit, you will be the first to hit. The Alchemy-based test suite is a mild maturity signal for the package's own quality, but it does nothing for your ability to get an answer at 2am. Internal documentation of your specific configuration becomes the real runbook.
Scaling. Blade compiles templates to plain PHP, which is opcache-friendly and fast at request time; rendering is not the bottleneck. The scaling concern is the compiled-view cache under horizontal scale: either every node needs a writable shared cache directory, or — better — templates are precompiled during the build and shipped as artifacts. Choose deliberately; the default runtime-write behavior is a common source of inconsistent rendering across nodes after deploys. The new breadcrumb instrumentation is per-render bookkeeping — likely negligible, but it is new code on the hot path and worth a glance in the spike rather than an assumption.
Failure modes to instrument for:
composer update resolving an incompatible illuminate/* and breaking templates at runtime, not build time.Ramp-up. Low for anyone with Laravel experience — hours, since Blade directives and component syntax are widely documented. Near-zero for designers, who can edit templates without touching PHP. For developers without Laravel background, the cost is not Blade syntax but the implicit Illuminate conventions (service container bindings, view composers, directive registration), which are underdocumented for this specific adapter. v5 adds a second, smaller ramp: the Leaf-native @lingo/@tl directives and the Crash breadcrumbs are documented in Leaf's terms, not Laravel's, so Laravel-experienced developers will need to read Leaf docs they would otherwise skip.
Overall recommendation. Unchanged in direction, slightly improved in evidence, slightly narrowed in compatibility. Conditional adoption for a bounded, reversible use case, with the renderer abstracted and versions pinned. The v5 release is a genuine positive signal on maintenance intent and adds real Leaf-native value, but it also demonstrates the version-lag risk concretely by moving the PHP and Illuminate floors in a single bump. Do not standardize a platform or a long-lived product surface on a four-star, zero-dependent adapter without first clearing the prerequisite audit and completing the spike, and confirm that Leaf's native view layer genuinely cannot meet the requirement. If Blade is truly needed, weigh the Leaf adapter against illuminate/view directly — the Leaf-specific layer now buys breadcrumbs and translation directives, which is a real but modest premium for one more maintainer in the chain.
How can I help you explore Laravel packages today?