orchestra/memory
Orchestra Memory gives Laravel apps a lightweight in-memory key-value store for the current request lifecycle. Use its simple put, get, has, and forget API to cache computed values and share state between components without touching persistent storage or external cache drivers.
Architecture fit. Orchestra Memory is a small, conventional Laravel package: a service provider, a facade, and a driver-based repository for namespaced key-value settings (get/set/forget/has) backed by array, cache, or database drivers. From a TPM lens the property that matters most is surface area, and this one is tiny. It occupies the narrow niche between static config files (deploy-coupled, developer-owned) and bespoke settings tables (schema, migrations, and a repository we would have to write and own). That makes it cheap to adopt and — critically for a TPM — cheap to reverse, which is the single most attractive attribute in the dependency.
It follows Laravel conventions rather than inventing them, so it will not reshape our architecture or constrain the design of the features that consume it. It is also not a differentiator: the roadmap value is entirely in not writing ~50–200 lines of settings plumbing and in consolidating three ad-hoc settings implementations behind one abstraction. It is an enabler to be sequenced under a feature, not a feature to be shipped.
Integration feasibility. Low-to-moderate. Integration is a Composer constraint, an optional config publish, and — only if the database driver is used — one migration. No queue workers, no external services, no infrastructure change. The genuine feasibility question is the inverse of what the release notes state: v6.0.0 is a major bump whose only announced changes are Laravel 8 and Laravel Octane support, which conventionally means Laravel 6/7 (and possibly older PHP) were dropped. If any application in the estate sits below Laravel 8, this is not a package upgrade — it is a framework programme, and that programme dominates the estimate by an order of magnitude.
The composer.json constraint is the one artifact that resolves this. A TPM should require it be read and recorded verbatim in the dependency register before any estimate is accepted; do not let the support matrix be inferred from release notes, and do not let it be inferred from a developer's recollection.
Technical risk. Three items should be carried on the risk register, not buried in a ticket:
Key questions.
composer.json, and is the v5 line end-of-life or merely frozen?Stack fit. Strong on Laravel 8, and strongest if Octane (Swoole/RoadRunner) is genuinely on the roadmap — v6 is effectively the minimum viable version in that topology. If the estate is on Laravel 6/7, fit is conditional on completing a framework upgrade first, and the package should be scoped as a follower on that programme, never as its driver. If Octane is not planned, v6.0.0 is housekeeping: record it as a dependency-maintenance item and do not stand up a workstream around it.
Migration path. Treat it as framework-coupled, not a package bump, and plan four steps:
If the framework upgrade is large, split steps 2 and 3 into separate workstreams with separate rollback points and separate go/no-go gates. Compressing them for schedule reasons forfeits the only diagnostic lever available.
Compatibility. Run a Composer dry-run resolution against each application's lockfile early. Conflicts surface only at resolution time, and one lagging adjacent package can deadlock the entire Laravel 8 move — a schedule risk that is invisible until it is expensive. Confirm the PHP floor explicitly rather than assuming it tracks Laravel 8's. Separately, audit our own code for the same long-lived-singleton hazards the package claims to have fixed; the package cannot protect us from state we cache ourselves, and Octane will not distinguish between the two when it fails.
Sequencing. Framework → package → Octane, each gated on its own acceptance criteria and rollback point. Define the gates before the work starts — green test suite, no new deprecations, settings read/write parity verified against the prior driver, Octane soak test clean — so each gate is a decision rather than an opinion. Then place the first consumer feature (admin settings panel, per-tenant overrides, or extension configuration) immediately after the package gate, so the abstraction is proven against a real requirement rather than adopted speculatively.
Maintenance. Upstream is neutral-to-positive but concentrated: a low-adoption, single-maintainer package is one maintainer's attention away from stalling. Record it in the dependency register with pinned version, verified supported matrix, named internal owner, and a defined review window each framework cycle. If no compatible release lands inside that window, that is the pre-agreed trigger to execute the internal-replacement plan — not a debate. Because the interface is a handful of methods, replacement should be measured in days; keep the estimate honest by writing the wrapper boundary now.
Support. There is no vendor, no SLA, and effectively no community. Support is us. Two TPM actions follow: constrain usage to the package's public API behind a thin first-party wrapper (never subclass package internals, never bind call sites directly to the facade), so debugging and replacement stay inside our own code; and budget support capacity for the settings layer explicitly, however small, rather than assuming it is free because the dependency is free.
Scaling. Technically the package does not constrain scale — the cache driver inherits whatever backend we already run, and the database driver is a simple key-value table. The scaling concern is organizational: every additional team that adopts the facade directly converts a cheap-to-replace internal utility into a load-bearing platform dependency, which is precisely the commitment the adoption signal does not support. Gate broad adoption on a second consumer, and route access through the wrapper so the blast radius stays bounded.
Failure modes. Enumerate them and map each to a detection:
Ramp-up. Low, with one caveat. A developer reads the whole repository in an afternoon, and the API is four methods; onboarding cost is negligible and there is no training surface to build. The caveat is conceptual rather than syntactic: engineers must internalize that this is a settings store with driver-dependent durability, not a cache and not a config replacement. Publish a one-page usage standard covering the wrapper boundary, driver choice per environment, what may and may not be stored (no secrets, no per-request scratch data), and the Octane-safe pattern. That page is the ramp-up artifact; the code will teach itself, and the standard is what prevents the scattered-settings problem from reappearing behind a new facade.
How can I help you explore Laravel packages today?