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

Dusk Updater Api Laravel Package

orchestra/dusk-updater-api

A standardised API from Orchestra for fetching and downloading ChromeDriver binaries used by Laravel Dusk, simplifying driver version discovery and updates in test environments.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. orchestra/dusk-updater-api is a deliberately narrow library, not an application feature. It exposes ChromeVersionFinder, ChromeDriverDownloader, and their interfaces so that calling code can resolve a Chrome/ChromeDriver version pair and obtain a download URL programmatically. It is the API-only extraction of the predecessor orchestra/dusk-updater, which shipped Artisan commands; v1.0.0 states this explicitly ("based on orchestra/dusk-updater source code"). That separation is clean and, for teams with opinionated CI or image-baking tooling, correct: the package owns resolution and retrieval, the consuming application owns policy — which driver, which platform target, where it lands on disk, how it is cached.

For teams that want a turnkey command, it is the wrong shape. The orchestration layer that the predecessor shipped has to be written and owned internally. From a TPM standpoint that is the headline: the deliverable is not the dependency, it is the wrapper around it, and the wrapper must be scoped, staffed, and scheduled as project work rather than treated as a Composer line item.

The central architectural question is overlap. laravel/dusk already resolves and downloads a compatible ChromeDriver during dusk:install / dusk:update, and current Dusk handles Chrome-for-Testing resolution internally. This package therefore earns a place only where the native path is insufficient: air-gapped or proxy-restricted CI, pre-baked container images, multi-arch builds, or centralised driver caching across many pipelines. Absent one of those specific needs, adoption creates a second source of truth for driver versions and an additional failure surface for no functional gain.

Integration feasibility. Mechanically trivial — a --dev Composer dependency, PSR-4 classes, interface-backed, no service provider required for basic use. The real cost is everything the package does not supply: no CLI, no config file, no compatibility matrix, no documented retry, timeout, proxy, or mirror behaviour, and a README that states the purpose and stops. Adopters must design and maintain version comparison, target paths, caching, platform detection, checksum handling, and error semantics themselves. Estimate the spike at days and the durable wrapper at low single-digit engineering weeks including tests, not hours.

Technical risk. Material, and mostly non-technical:

  • Adoption signal is near-zero. Zero dependents and a low composite score (2.1) mean no external evidence of CI or production use. Nothing has stress-tested the resolver outside the maintainer's own ecosystem.
  • Bus factor of one. The release history (v1.0.0 → v1.0.6) is effectively single-author. Several releases are type-hint fixes (v1.0.1, v1.0.3), test-runner bumps, and dependency widenings — normal housekeeping for a young package, but continuity rests on one person.
  • Documentation debt. No supported-version matrix, no statement of which upstream endpoint is contacted, no retry/timeout/proxy documentation, and no guidance on verifying downloaded binaries. Release notes are changelogs, not documentation.
  • Binary supply chain. The package's entire value proposition is fetching executables. Confirm what is downloaded, over what transport, from which endpoint (official Chrome-for-Testing vs. a mirror), and whether integrity is verified before execution. The README is silent and v1.0.6 does not address it.
  • Widening dependency envelope. Since v1.0.2 the package pulls in orchestra/sidekick; v1.0.4 added PHP 8.5 and Symfony Process 8 support; v1.0.6 added Guzzle 8. The maintainer tracks ecosystem majors quickly — a positive signal — but the transitive footprint grows for a small utility, raising lockfile-conflict risk in large Laravel monorepos.
  • Version claims need verification. Treat every compatibility claim as unverified until checked against the actual composer.json constraints and the CI matrix.

Key questions for the maintainer and for internal due diligence:

  1. What does this do that current laravel/dusk driver resolution does not, and can both coexist without contending for vendor/laravel/dusk/bin?
  2. Which upstream endpoint is contacted, is HTTPS enforced, and are downloaded binaries integrity-checked before execution?
  3. What is the support policy across Laravel, PHP, Guzzle, Symfony, and Chrome majors — and what is the expected window before a Chrome release breaks resolution?
  4. Is orchestra/dusk-updater deprecated in favour of this package, and what is the migration contract for existing users?
  5. Is there a commitment to the 1.x line, and what is the process for security fixes in a package that downloads executables?
  6. Are there platform/architecture gaps (arm64, Windows, Alpine/musl) where resolution silently returns nothing?
  7. Does Guzzle 8 support raise the PHP/Laravel floor, and what happens on projects still pinned to Guzzle 7?

Integration Approach

Stack fit. Appropriate only for Laravel projects already running Dusk in a controlled environment — containerised CI, headless Linux agents, or image-baking pipelines — where the team wants explicit control over which ChromeDriver version lands on disk. Keep it in require-dev; nothing suggests runtime use. For teams whose local and CI environments already work via php artisan dusk:install, this adds a dependency and removes no work. Guzzle 8 support makes it marginally more compatible with current-generation dev stacks but does not change the fit assessment.

Migration path. Two realistic entry points with very different cost profiles:

  • From orchestra/dusk-updater: conceptual rather than mechanical. The Artisan commands are gone, so equivalent logic must be reimplemented in a project-owned command or script that calls the finder and downloader. Budget for this; it is not a drop-in swap.
  • From bespoke shell scripts (wget a pinned ChromeDriver, chmod +x, drop into the Dusk bin directory): the strongest case. Replacing a hardcoded, frequently stale URL with dynamic version resolution is a genuine reliability improvement, and the surrounding wrapper is largely unchanged.

Compatibility. Pin the exact package version and verify its composer.json constraints against the project's PHP, Laravel, Guzzle, and Symfony Process versions rather than trusting release notes — the Guzzle 8 line in v1.0.6 is precisely the kind of claim to confirm in the lockfile. Confirm behaviour on every architecture in the CI fleet before rollout. Confirm the Dusk version in use and whether both the wrapper and Dusk attempt to write the same binary path. Confirm which Chrome-for-Testing contract the resolver assumes; nothing in v1.0.6 touches that surface.

Sequencing. Do not standardise on first contact:

  1. Spike (1–2 days). On a throwaway branch, resolve and download the exact Chrome version used by the CI image; confirm the URL, the artefact, and that the resulting binary runs the Dusk suite. Record which Guzzle major resolves.
  2. Pin and wrap. Encapsulate behind an internal service or Artisan command so the package API never leaks into pipelines. Pin the package version and, in shared-lockfile monorepos, pin transitive HTTP client versions.
  3. Shadow one pipeline. Run the wrapper in a non-blocking job alongside existing provisioning for two to four weeks; compare resolved versions and watch for drift across Chrome releases.
  4. Promote narrowly. Adopt only in the pipelines that motivated the change (multi-arch, air-gapped, cached-driver builds) before considering broader use.
  5. Define an exit. Keep the wrapper thin enough that replacing the package with direct calls to the Chrome-for-Testing JSON endpoints is a contained change of a few dozen lines.

Decision recommendation. Approve as an evaluated option behind a project-owned wrapper; do not adopt as a platform standard. The package is small, cheap to trial, and easy to remove, and v1.0.6 is a mildly reassuring maintenance signal (Guzzle 8 and Pest 5 tracked quickly) — but it adds no capability and answers none of the open trust, documentation, or support questions. Zero dependents, thin docs, a single maintainer, and overlap with Dusk do not justify a default dependency until the wrapper has survived at least one Chrome major-version cycle in a real pipeline.

Operational Impact

Maintenance. The package's own surface is tiny — one lookup path and one download path — so the code should rarely need patching. Maintenance cost sits in the external dependency it tracks: Chrome's roughly four-week release cadence and any change to Chrome-for-Testing endpoints. Expect occasional breakage that is not the package's fault but is the adopter's problem to detect and triage. The maintenance signal here is genuinely positive — the maintainer shipped Guzzle 8 and Symfony Process 8 support within weeks of those majors, with orchestra/sidekick adopted to reduce duplicated plumbing — but currency with Guzzle and Pest is not the same as currency with Chrome endpoints, and neither substitutes for hardening in a real pipeline.

Support. There is effectively no support channel beyond GitHub issues on a single-maintainer repository with no stated SLA, no security policy, and no published compatibility matrix. Test coverage is published via Coveralls and CI runs on every branch, which is better than many packages of this size, but coverage of the maintainer's own paths does not tell an adopter about their platform. Internally, the adopting team owns first-line support: diagnosing resolution failures, verifying binaries, and deciding fallbacks. A TPM should name an owner for the wrapper before approval and treat the package as an unsupported upstream component — acceptable for dev tooling, not something to place on the critical path to production.

Scaling. Scales well in the dimension that matters: it is stateless and cheap, and a wrapper can fan it out across many pipelines or bake drivers into shared images. It scales poorly in organisational consistency — every team that calls the package directly will implement its own caching, path handling, and error semantics, producing version drift across pipelines. Standardise through a single internal wrapper and, ideally, a single cached driver artefact registry; otherwise the diversity of resolved ChromeDriver versions across the fleet, not the download itself, becomes the operational problem.

Failure modes. Expect five: (a) upstream endpoint or URL-scheme changes breaking resolution, potentially silently if the wrapper does not assert on returned versions; (b) Chrome/ChromeDriver version mismatch producing opaque browser-launch failures mid-suite, which are expensive to diagnose because the symptom is far from the cause; (c) network or proxy failures in restricted CI with no documented retry or timeout, surfacing as flaky jobs rather than as clear errors; (d) dependency conflicts at install time in monorepos where Guzzle or Symfony Process is pinned by other packages; (e) drift between a locally cached driver and the Chrome binary actually present in the image. Mitigations are wrapper-level: assert the resolved version, fail loudly on mismatch, cache deliberately, and log the source URL on every download.

Ramp-up. Low for anyone familiar with Laravel dev tooling — the classes are small and interface-backed, and a competent engineer reads the whole package in an afternoon. The ramp-up cost is not in the code but in the undocumented operational knowledge: which endpoint, which artefacts, which platforms, which fallbacks. Budget for writing that down as part of adoption, and treat the internal runbook as a required deliverable alongside the wrapper. Because the surface is small and the exit path is a few dozen lines of direct HTTP calls, the reversibility of this decision is high — which is what makes a limited, wrapped trial the right posture rather than either a platform standard or a rejection.

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.
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
martialbe/flysystem-oss
chondal/3312client
jeroen-g/flickr
opscale-co/nova-genbi
itsjustvita/laravel-retention
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log