orchestra/sidekick
Orchestra Sidekick is a toolkit of utilities and helpers for Laravel package development. It streamlines common tasks and provides reusable support code for building robust packages, serving as a foundation for the Orchestra Platform ecosystem and its companion packages.
What the asset actually is. orchestra/sidekick is not application infrastructure — it is a package-author utility layer maintained by the Orchestra Platform team (crynobone). Its surface is a set of namespaced helper functions (model_diff(), model_state(), model_from(), Env, package_path(), filename_from_classname(), package_version_compare(), after_resolving(), is_testbench_cli(), working_path(), filesystem helpers, php_normalize_version()), plus a HasPreviousAttributes trait/polyfill and a console ConfiguresPrompts trait. There is no service provider, no config file, no migrations, no publishable assets.
Architecture fit. Fit is conditional on one question: do we author and maintain Laravel packages, or only consume them? If we maintain packages, publish internal starter kits, or run Testbench-based suites, fit is high — these helpers replace exactly the glue code (diffing Eloquent state, resolving package paths, version comparison, prompt configuration) that teams otherwise copy-paste between repositories. If we only build product applications, fit is low: each utility is 5–30 lines of code and the "buy" case reduces to convenience while adding a third-party dependency to the review surface. Note the deliberate tension in the signals — an overall score of 9.9 reflects release discipline and ecosystem health, while an opportunity score of 55.25 reflects a narrow, intentional niche.
Integration feasibility. Effectively trivial mechanically: Composer-only, MIT-licensed, no registration step, usable immediately after require. Real effort is governance, not engineering. Two maintained lines (1.1.x and 1.2.x) receive parallel backports of the same PRs, so we must decide which line we standardize on and pin accordingly. The package also tracks pre-release upstream aggressively (Laravel 14.x-dev, PHPUnit 13.x-dev support landed in v1.1.24/v1.2.x-era releases), which is a leading indicator of maintenance quality but also of churn.
Technical risk.
Orchestra\Sidekick\Eloquent\Watcher is explicitly marked @internal; other internals may follow. Any API not documented in the README should be treated as unstable.model_diff() / model_state(). The changelog shows repeated correctness fixes (create vs. update state, $appends exclusion, original-attribute handling). Consumers who build audit logs, change feeds, or snapshot assertions on these outputs are exposed to silent semantic changes across patch releases.HasPreviousAttributes backfills framework behavior on older Laravel versions; upgrading Laravel means the polyfill path and the native path must agree, or subtly different results appear.Key questions for the review.
@internal-marked classes, or do we restrict usage to README-documented helpers?Stack fit. Native to the Laravel + Composer + PHPUnit/Pest stack. It slots in as a require-dev or require entry in package skeletons; nothing about it constrains application architecture because it is only reachable from code we write deliberately. The strongest structural fit is with Testbench-based package test suites, where is_testbench_cli(), working_path(), and package_path() remove per-repository hardcoding.
Migration path. Adoption is additive, not a cutover. Sequence:
Compatibility. Pin exact versions in package skeletons rather than floating ranges — the patch cadence is high and semantic fixes have shipped in patch releases. Treat the 1.1.x/1.2.x choice as a matrix decision documented alongside our Laravel support policy, and verify each line's actual PHP/Laravel constraints in composer.json rather than inferring from release notes. Avoid orchestra/testbench-core leaking into production dependency graphs — it belongs in require-dev only.
Sequencing. Do the inventory and pilot in the same quarter; the pilot is days of work, and the inventory is the artifact that justifies the rest. Defer org-wide standardization until at least one full Laravel upgrade cycle has been traversed with the package in place, so we observe its upgrade ergonomics before we commit everyone to it.
Maintenance. Low steady-state cost: no runtime services, no persistence, negligible footprint. The maintenance burden shifts to version governance — someone must own the pin bump and read the changelog for semantic changes in model_diff()/model_state() before bumping. Budget a recurring but small allocation, not a project.
Support and ownership. Assign an internal owner (platform/tooling team) responsible for the pin, the sanctioned-API list, and the escalation path to the upstream maintainer. Because this is single-maintainer upstream, define a fallback posture up front: the helpers are small enough that forking or inlining the three or four functions we actually depend on is a credible contingency, and cheap to exercise if needed.
Scaling. Scales cleanly across many repositories precisely because it is dependency-free and stateless — the marginal cost of the 20th adopting repo is a line in a skeleton. The bottleneck is social, not technical: without a published list of sanctioned helpers, teams will adopt internals and create upgrade friction. A short internal style rule ("use these six helpers; do not touch @internal classes") is the highest-leverage operational control here.
Failure modes to plan for.
Ramp-up. Hours for a Laravel-fluent engineer; the helpers are self-describing and the README plus changelog is sufficient onboarding material. The real ramp-up cost is organizational: the sanctioned-API list, the pinned-version policy, and the upgrade checklist must exist before broad adoption, or every repository reinvents its own interpretation of what is safe to call.
How can I help you explore Laravel packages today?