orchestra/dusk-updater
A Symfony Console updater for Laravel Dusk ChromeDriver binaries. Run vendor/bin/dusk-updater to download the latest or specified Chrome/ChromeDriver version, detect Chrome versions, and auto-update when outdated. Works with all Dusk versions, including outside Laravel.
Architecture fit: The package is a standalone Symfony Console command designed specifically for Laravel Dusk environments, making it a natural fit for test automation tooling. However, its reliance on external ChromeDriver APIs and OS-specific path handling introduces complexity. The low adoption (10 stars, 0 dependents) suggests limited real-world validation beyond niche use cases. v3.2.0 changes the architecture fit only marginally: widening the HTTP client constraint to Guzzle 8.0 does not alter the command model or the Dusk coupling, but it does reduce the chance of the package being the constraint that blocks a host application's dependency graph.
Integration feasibility: Straightforward installation via Composer (--dev) and simple CLI commands. Integration with CI/CD pipelines is feasible but requires careful handling of OS-specific binary paths (e.g., macOS ARM64 vs. Windows). Compatibility with Laravel Dusk versions is documented, but the package's separation from Laravel's core (via Symfony Console) may complicate integration in non-standard setups. The Guzzle 8 allowance in v3.2.0 improves feasibility for newer Laravel applications whose lockfiles already resolve to modern Guzzle releases, since the updater no longer pins the transitive HTTP stack to a legacy major.
Technical risk: High risk due to questionable release metadata (e.g., "2026-01-20" release date, PHP 8.5 support for an unreleased PHP version), zero dependents indicating no production usage, and potential API dependency fragility (ChromeDriver download endpoints frequently change). The forked origin (staudenmeir/dusk-updater) adds uncertainty about maintenance continuity. v3.2.0 does not mitigate these risks and arguably reinforces the pattern of asserting compatibility with unreleased upstream versions: Guzzle 8.0 has not reached general availability, so "supports Guzzle 8.0" most likely means the constraint was widened against a development branch rather than validated against a shipped release. A widened constraint without CI coverage is a latent breakage vector — an untested Guzzle 8 release could change redirect, retry, or stream behaviour on the ChromeDriver download path.
Key questions: Why does the package claim support for PHP 8.5 (which doesn't exist)? How is the "2026" release date reconciled with current PHP/Chrome ecosystems? Are there known issues with ChromeDriver version 120+? What contingency plans exist if Google changes its ChromeDriver API structure? Does v3.2.0 allow both Guzzle 7 and 8 concurrently, and is the Guzzle 8 path actually exercised in CI against a tagged release or only against dev-master?
Stack fit: Ideal for Laravel Dusk-based testing environments where ChromeDriver version mismatches cause flaky tests. Fits cleanly as a dev dependency in Laravel projects but requires explicit integration into test execution workflows. Not suitable for non-Laravel projects or Selenium-based testing outside Dusk's scope. The v3.2.0 Guzzle widening makes the package safer to co-install in modern Laravel stacks, where an older transitive Guzzle requirement can otherwise force a dependency downgrade.
Migration path: Minimal migration effort—replace manual ChromeDriver management with php vendor/bin/dusk-updater update in CI/CD pipelines. For local development, integrate detect --auto-update into pre-commit hooks or IDE launch scripts. Requires killing existing ChromeDriver processes before updates (per README guidance). Upgrading from v3.1.x to v3.2.0 is a non-breaking dependency-constraint change; no command or configuration migration is required, and no code changes are expected in the consuming project.
Compatibility: Supports PHP 8.1+ (v2.0.0+) but conflicts arise from inconsistent version claims (e.g., "PHP 8.5" support). Works with ChromeDriver versions 113–127 but may break with future Chrome updates due to API dependency. Windows lacks --chrome-dir support, and ARM64 macOS requires v2.1.2+ for correct extraction. On the dependency axis, v3.2.0 accepts Guzzle 8.0 while retaining Guzzle 7 support under the prior constraint range; confirm this in composer.json before upgrading, since a hard bump to ^8.0 would break applications still pinned to Guzzle 7.
Sequencing: 1) Install via composer require --dev orchestra/dusk-updater; 2) In CI, run update before Dusk tests; 3) For specific Chrome versions, use update <major-version>; 4) Always kill ChromeDriver processes prior to updates; 5) Use detect --auto-update locally for proactive alignment. For teams already on the package, upgrade to v3.2.0 in a dedicated dependency PR and let the full Dusk suite exercise the updater, rather than folding the bump into an unrelated feature branch.
Maintenance: High maintenance burden due to low adoption (0 dependents), a single-maintainer fork lineage, and an inherent dependency on Chrome's release cadence, which ships a new major version roughly every four weeks. The v3.2.0 Guzzle change does not reduce this burden and adds a second upstream to track: if Guzzle 8 ships with breaking changes relative to the untested branch the constraint targets, the maintainer must respond with a patch, and consumers inherit the delay. Pinning the package to an exact patch version in composer.lock and reviewing release notes before each bump is advisable.
Support: Support depth is thin. There is no evident production user base to surface regressions, and issue triage depends on a small maintainer group. The Guzzle 8 claim is a support liability specifically because it invites users onto a combination (updater + unreleased Guzzle) that is unlikely to have been exercised broadly. Teams adopting it should expect to self-diagnose HTTP-layer failures during ChromeDriver downloads and should capture verbose output in CI logs.
Scaling: Scales linearly across CI jobs with no shared state, but each job performs an outbound ChromeDriver download, which becomes a cost and rate-limit consideration at high parallelism. Cache the resolved driver binary per Chrome major version in CI (keyed on the Chrome version, not the updater version) and reuse it across jobs to avoid per-job network calls and to insulate builds from transient endpoint failures. Note that this caching strategy is unaffected by v3.2.0 — the Guzzle change is purely about client library resolution, not download behaviour.
Failure modes: (1) ChromeDriver endpoint changes or version-detection drift, the dominant and recurring failure; (2) OS/path handling gaps on Windows (--chrome-dir unsupported) and ARM64 macOS pre-v2.1.2; (3) stale ChromeDriver processes locking files, requiring the documented kill step; (4) dependency-resolution breakage if the Guzzle constraint is narrowed or if Guzzle 8 introduces behaviour changes on the download path — the new failure vector introduced by v3.2.0; (5) silent drift from the forked upstream. Treat the updater step as best-effort in CI (fail fast with clear diagnostics, and allow cached-binary fallback) so a ChromeDriver outage does not block unrelated test signal.
Ramp-up: Low for basic use — a single composer require --dev, one CLI command in the pipeline, and the documented kill-process step are enough for a working setup, roughly half a day for an engineer familiar with Dusk. Higher for owning it: diagnosing download/version-detection failures and reasoning about the Guzzle and PHP version claims requires familiarity with Composer constraint resolution and Chrome's release model. Budget review time for each updater release until the project demonstrates a stable release cadence and a real dependent base; the Guzzle 8 allowance in v3.2.0 is exactly the kind of claim that should be verified against composer.json and CI configuration before it is trusted.
How can I help you explore Laravel packages today?