rollout/rox
rollout/rox is a Laravel package for managing feature rollouts and toggles. It helps you enable or disable features for specific users, segments, or rollout percentages, keeping release control in configuration and code.
Architecture fit. rollout/rox is the PHP client SDK for the Rox/CloudBees Rollout feature-flag and remote-configuration service. It is a runtime library, not a Laravel package: there is no service provider, no facade, no publishable config, and no Blade/Vite integration. Architecturally it occupies the same layer as a feature-flag abstraction, which in a Laravel codebase is a cross-cutting concern that should sit behind a container-bound contract rather than be called statically from controllers and jobs. The SDK's model — register an environment key and a per-request user/entity context at bootstrap, then evaluate flags synchronously against a locally cached flag set — maps cleanly onto Laravel's request lifecycle for classic PHP-FPM, but not onto long-lived workers (Octane/Swoole/RoadRunner) or queue consumers, where the "current entity" is mutable global state. Any adoption therefore requires a thin adapter layer we own, not direct SDK calls in application code.
Integration feasibility. Technically straightforward for a senior engineer: composer require, a service provider that boots Rox with credentials pulled from config/env, a middleware that seeds the entity context per request, and a wrapper class exposing isEnabled(string $flag, bool $default). The real cost is not the happy path but the governance around it: default values, kill-switch semantics, and context lifecycle. The critical feasibility gate is legal, not technical — the repo metadata reports NOASSERTION for license, meaning GitHub could not identify an SPDX license. We cannot ship that to production without written clarification from the vendor; treat this as a hard blocker and start the legal thread on day one.
Technical risk.
Key questions. What is the SPDX license, and does it survive legal review? Is the vendor contract and roadmap such that this SDK is supported through our planning horizon? Do we need experimentation and segmentation, or only static on/off flags — because if the latter, Laravel Pennant is first-party, free, and already in the framework? Which runtimes must evaluate flags (FPM, Octane, queue, scheduler, CLI)? What is the acceptable p99 added latency per request? Who owns the flag inventory and the retirement of stale flags? What is the exit cost if Rox is sunset?
Stack fit. Composer-installable PHP with no framework coupling, so it will install into a Laravel 9/10/11 application, but manual registration in AppServiceProvider (or a dedicated provider) is required. Pin the dependency to an exact version rather than a caret range given the maintenance profile, and add it to the SBOM and license-scanning gate. Verify PHP constraint compatibility against the platform's pinned minor version before committing.
Migration path. Treat this as a capability introduction, not a package install.
FeatureFlags contract with a NullDriver default so application code never references the vendor namespace.RoxDriver adapter behind that contract; keep the SDK confined to one directory.Compatibility. The abstraction is the compatibility strategy — if Rox is deprecated or the license blocks us, swapping to Pennant, Unleash, Flagsmith, or GrowthBook costs one adapter class rather than an application-wide refactor. Keep the SDK out of Blade templates and out of domain/service classes entirely. Confirm behavior under php artisan config:cache and route:cache, since SDK bootstrap that reads env() at runtime breaks once config is cached; all credentials must flow through config/*.php.
Sequencing. License/legal clearance and vendor roadmap confirmation in parallel with the spike. Spike and adapter in sprint one; tests including network-fault injection and a fake flag client in sprint one to two; staging rollout and observability in sprint two; production canary in sprint three. Do not start the spike on a critical flag path.
Maintenance. We own the wrapper permanently, even if the vendor does not update the SDK. Expect infrequent upstream releases and no guarantee of timely PHP minor-version support; schedule a quarterly review of the dependency against new PHP releases and a documented "vendor abandoned" trigger that starts the adapter swap.
Support. With 0 stars and 0 dependents there is no community to lean on and no evidence of an active public issue triage process. The only escalation path is the commercial CloudBees relationship, if one exists. Name an internal owner and record the vendor contact in the service catalog; otherwise a flag-related incident has no external backstop.
Scaling. Evaluation must be local and in-memory — no network call on the request path — so the scaling question is flag-payload size, per-worker memory under Octane, and refresh cadence against the vendor's CDN or API rate limits. At fleet scale, stagger refreshes and confirm whether flag distribution is edge-cached or per-instance. If targeting is multi-tenant, validate that segmentation rules do not require shipping tenant data to the vendor beyond the entity identifier.
Failure modes. Enumerate and test: SDK init failure at boot (must degrade to defaults, not 500), stale or expired flag cache, malformed payload, network partition, clock skew affecting time-based targeting, cross-request context leakage under Octane, queue workers lacking an entity context, and config-cache interaction at deploy time. Each needs a defined application-level default and an alert. The most dangerous mode is not an outage — it is silently serving default values while operators believe a flag is live, which argues for a metric comparing evaluated flags against expected state.
Ramp-up. The SDK API surface is small; a mid-level engineer can be productive in a day. The genuine ramp-up cost is organizational: flag naming conventions, default-value discipline, stale-flag cleanup, and kill-switch authority. Budget roughly one engineer-sprint for the adapter, tests, and runbook, plus legal review time for the license, and treat the low adoption score (0.24) as a signal to fund an exit path from the outset rather than as a reason to reject the capability outright.
How can I help you explore Laravel packages today?