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

Biome Js Bundle Laravel Package

kocal/biome-js-bundle

Symfony bundle that integrates Biome, the fast JavaScript, TypeScript, and JSON formatter and linter, into your project. Configure Biome from Symfony and run checks or formatting through convenient console commands.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

What this actually is. kocal/biome-js-bundle is a Symfony bundle, not a Laravel package. It wraps the download and execution of Biome.js — a Rust-based JS/TS/JSON linter and formatter — so a PHP application can lint its front-end assets without a Node.js toolchain in the runtime or CI image. The bundle itself is thin: it registers console commands, configures a target Biome version, fetches the platform-specific binary from GitHub releases, and shells out to it.

What changed in v2.1.2. A patch release with two maintenance items, no feature or API surface change:

  • Tests on Symfony 8 stable (PR #37) — the CI matrix now runs against the Symfony 8.x stable line. This is a forward-compatibility signal, not a new capability. Open question: whether Symfony 8 is a declared constraint in composer.json or only a tested one; those are different promises.
  • .gitattributes fix (PR #38) — distribution hygiene. Means Composer dist installs exclude test/dev files. Benefits install footprint and supply-chain surface (fewer files shipped), nothing more.

Net effect on the evaluation: none material. The verdict, risk profile, and Laravel recommendation are unchanged. The two things worth carrying forward are (a) the maintainer is actively tracking Symfony majors, which is a modest positive against the bus-factor concern, and (b) Symfony 8 support implies a PHP 8.4+ leg in the test matrix — useful only as a data point if we are also evaluating a Symfony-side adoption.

Architecture fit.

  • Symfony: Native. Follows the standard bundle + DI extension + console command pattern. Low conceptual surface area.
  • Laravel: Indirect. Laravel has no bundle/DI-extension mechanism, so this cannot be composer required and used idiomatically. Its value to a Laravel team is as a reference implementation for a ~100-line Artisan command, not as a dependency.
  • The underlying pattern is portable because Laravel already ships symfony/console and symfony/process transitively, and Guzzle is available for the download step. Note that Symfony 8 alignment does not help here — Laravel does not track Symfony majors.

Integration feasibility.

  • The hard parts are not PHP-side; they are distribution-side: platform detection (linux-x64-gnu, linux-arm64-musl, darwin-arm64, win32-x64), asset naming across Biome releases, checksum verification, and version pinning. Nothing in v2.1.2 touches these.
  • Biome ships standalone binaries and platform-specific npm packages. A PHP downloader is genuinely simple if you accept pinned versions and verify hashes.
  • In a Laravel context, the sane equivalents are: a small Artisan command (php artisan biome:install), a composer post-install-cmd script, or simply using the official ghcr.io/biomejs/biome Docker image in CI. All three remove Node without adopting this bundle.

Technical risk.

  • Supply chain: downloading and executing a native binary at install/deploy time is the single largest risk. Without checksum pinning and version locking, this is an unreviewed remote-code-execution path into CI and developer machines. The .gitattributes fix marginally reduces shipped file surface; it does nothing for the download risk.
  • Maturity: 32 stars, 0 dependents, single maintainer. Effectively unproven in production; the score of ~2.88/5 reflects that. v2.1.2 is evidence of maintenance, not of adoption — the two get conflated in these reviews and should not be here. MIT license mitigates abandonment risk (forkable), but there is no bus factor.
  • Environment coupling: network access during install breaks air-gapped builds, restricted CI runners, and read-only container filesystems.
  • Silent failure modes: an architecture misdetection (e.g., Rosetta-emulated arm64 runners) or a missing musl build fails at lint time, not at install time.
  • Recency and trajectory remain positive: a patch release with no regressions and added forward Symfony coverage suggests a maintainer who keeps the lights on. Treat that as a small increment, not a re-rating.

Key questions for the maintainer / PoC.

  1. Is the Biome version pinned in config, and is the binary SHA-256 verified against a committed checksum?
  2. Does it support an offline / pre-provisioned binary path (for air-gapped CI)?
  3. New: Is Symfony 8 a declared composer.json constraint or test-only? What is the resulting PHP floor — and does the package degrade gracefully on unsupported platforms?
  4. Does it discover biome.json relative to the project root, and how does it handle monorepo sub-paths?
  5. Where is the binary cached (project bin/, var/, Composer cache) and is that path git-ignored?
  6. Does the command surface allow check --write (formatting) in addition to read-only lint?

Integration Approach

Stack fit and recommendation.

  • If we are a Symfony shop: adopt, with guardrails (pin version, verify checksum, cache binary, run non-blocking first). The bundle removes a real operational burden — Node in PHP images — with a small, reviewable code surface. Symfony 8 coverage means we can adopt without a near-term upgrade cliff.
  • If we are a Laravel shop (the likely framing): do not adopt as a dependency. Use it as a design reference and implement the equivalent natively. The port is small enough that owning it is cheaper than owning a Symfony-bundle shim inside Laravel. v2.1.2 does not change this calculus — a Symfony-major compatibility bump is irrelevant to a framework that shares only components.

Migration path (Laravel-first).

  1. Baseline decision: confirm Node is actually a cost. If CI already runs Node for asset builds (Vite, Mix), removing Node from the linter path yields near-zero benefit. If the app is API-only or ships pre-built assets, the benefit is real (smaller images, faster CI, one fewer runtime).
  2. Preferred option — CI-only, no PHP dependency: run Biome via ghcr.io/biomejs/biome as a CI job or a docker run wrapper. Zero application coupling, trivially version-pinned by image tag.
  3. Option B — Composer-native, no Docker: commit a ~100-line Artisan command modeled on this bundle: resolve pinned version + platform triple, download from GitHub releases, verify SHA-256, chmod +x, store in bin/ (git-ignored). Expose as composer lint:js / composer fmt:js.
  4. Option C — pre-commit hook: run the same binary locally via captainhook or a git-hooks Composer package for fast feedback.
  5. Avoid: attempting to boot a Symfony bundle inside Laravel via a custom service provider. It works mechanically but creates an unmaintainable seam.

Compatibility notes.

  • Symfony 8 stable is now in the bundle's test matrix. Symfony 8 carries a PHP 8.4 floor, so the effective supported range is likely wider than before, not narrower — but verify the constraint before assuming. For Laravel 10/11 use, only component-level reuse matters, and that is safe regardless.
  • Biome's rule set is not ESLint/Prettier-identical. Any migration requires accepting formatting churn or configuring biome.json to approximate existing rules. Budget for a single "big format" commit isolated from feature work.

Sequencing.

  1. Spike in one repository; measure CI time delta and image size delta.
  2. Pin the Biome version and checksums; add binary to .gitignore and CI cache key.
  3. Land as a non-blocking CI job; fix baseline findings.
  4. Flip to blocking; add pre-commit for developer feedback.
  5. Document the runbook and the version-bump procedure; then consider rolling to other repos.

Operational Impact

Maintenance.

  • Ongoing cost is dominated by Biome version bumps, not by the wrapper. Each bump requires verifying asset naming and re-pinning checksums. Budget one small PR per Biome minor release.
  • v2.1.2 is a maintenance-only release: no deprecations, no breaking changes, no action required from anyone who has already pinned. Upgrade cost is effectively zero if we are on v2.1.x; if we are pinned to an older minor, this is not the release that forces the jump.
  • Because there are 0 dependents, we are an early adopter. Expect to vendor or fork on short notice; MIT makes that a non-event legally, but it is real engineering time.
  • If we take Option B (own the ~100 lines), maintenance becomes fully internal and predictable — usually the cheaper long-run choice at this maturity level, and entirely unaffected by upstream Symfony churn.

Support.

  • No commercial support; GitHub issues only, single maintainer, low issue volume. The v2.1.2 responsiveness is a mild positive signal. Upstream Biome has an active community and fast release cadence, so most problems are answerable from Biome's own docs.
  • Internal support burden is low for PHP developers (one command) but requires one owner who understands the binary distribution model.

Scaling.

  • Runtime cost is zero — this is build/CI-time tooling only; no request-path impact, no added PHP dependencies at runtime.
  • At multi-repo scale, per-repo binary downloads are wasteful. Prefer a shared CI base image or a shared Composer package with a warm cache. GitHub release downloads are subject to rate limiting when fanned out across many parallel jobs.
  • Lint time scales with repo size, not with this package; Biome is substantially faster than ESLint, so wall-clock is usually a net win.

Failure modes to instrument.

  • GitHub outage or rate limit during install → build failure at the worst moment. Mitigation: cache the binary, fall back to a mirror, or bake it into the base image.
  • Biome release renames/moves an asset → 404 at install. Mitigation: pin exact version, never latest.
  • Arch/libc misdetection (arm64 runners, Alpine/musl) → exec-format error. Mitigation: explicit triple override env var.
  • Checksum mismatch or unverified download → security exposure. Mitigation: mandatory SHA-256 pin, fail closed.
  • Read-only filesystem or no-network environments → non-starter. Mitigation: pre-provisioned binary path.
  • Version skew between developer machines and CI → "works on my machine" lint diffs. Mitigation: version pin lives in the repo, single source of truth.
  • Silent success on zero matched files (bad glob/config) → false confidence. Mitigation: assert a non-zero file count in CI.

Ramp-up.

  • Tooling ramp-up: hours. PHP developers run one command; no Node, no package.json, no lockfile.
  • Rule ramp-up: days. The real learning curve is Biome's rule set and biome.json, plus reconciling existing ESLint/Prettier suppressions. Plan a short enablement session and a documented "how to suppress" pattern so the team doesn't disable rules wholesale.
  • Overall verdict: unchanged at viable and genuinely useful for PHP-only stacks, but at ~2.88/5 with zero dependents, treat it as a pattern to copy, not a dependency to trust — especially from Laravel, where the Symfony bundle boundary buys us nothing. v2.1.2 is a clean, low-risk patch that neither raises nor lowers that conclusion.
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.
payerurl/telegrambot-crypto-payment-instant-payout
dskripchenko/laravel-hybrid-search
riorizkyrainey/lara-ced
mehedimi/static-vel
zharp/zharp
nonsapiens/bigquery-model-sync
lgu-bayambang-ict-office/lgu-laravel-development-standards
andydefer/laravel-support
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel
draftsmaninc/draftsman
square-bit/laravel-volition
himito/laravel-mailman
htinlynn/genius-helper
maco-studios/hephaestus
elmogy/larafast
xeviant/laravel-paystack
gorilladash/laravel-website-sdk