innmind/http-transport
Innmind HTTP Transport is a PHP library for sending HTTP requests and handling responses through a clean, framework-agnostic API. Designed for the InnMind ecosystem, it keeps transport integration simple, testable, and lightweight for applications and services.
What the package is. innmind/http-transport is the HTTP client abstraction from the Innmind ecosystem — a set of small, composable transport decorators (retry, logging, authentication, etc.) built on Innmind's own Immutable type system and innmind/url value objects rather than on PSR-7/PSR-18. It is a transport layer, not a framework integration: there is no service provider, no facade, no config file, and no Laravel-facing surface of any kind.
Architecture fit. Poor for a conventional Laravel application. Laravel's idiomatic HTTP story is Illuminate\Support\Facades\Http wrapping Guzzle, with first-class support for retries, middleware, fakes in tests, and event dispatching. Adopting this package means introducing a second, parallel HTTP stack with a different request/response object model, a different error model (monadic Either-style returns rather than exceptions), and a different mental model. The core architectural cost is not the dependency itself but the permanent fork in how the team performs outbound I/O.
Integration feasibility. Technically possible — it is a plain Composer package with an MIT license and no framework coupling, so it can be autoloaded and used from a service class. Practically, it does not integrate so much as sit beside Laravel:
Http::fake(), Laravel's HTTP events, or any existing PSR-15/PSR-18 tooling (Telescope HTTP watchers, OpenTelemetry auto-instrumentation for Guzzle, etc.).innmind/immutable and related packages pull in their own major-version cadence and API churn.Technical risk. High, and dominated by supply-chain rather than code quality. The repository shows 1 star and 0 dependents, which means essentially no external production validation, no community bug reports, and no third-party tutorials or Stack Overflow corpus. Combined with a single-maintainer ecosystem and a composite score of ~17/100 (opportunity ~45/100), the realistic risk is that a breaking upstream change or an abandoned repo leaves you maintaining a vendored fork of a library nobody else on the team understands. The 2026-08-23 last-release date also warrants direct verification — a future-dated release suggests either pre-release tagging or unreliable metadata, and either way it should be confirmed against Packagist and the git tags before it appears in a composer.lock.
Key questions to put to the requesting engineer.
Http retry/pool APIs do not?Stack fit. Assume Laravel 10/11 on PHP 8.2+, already carrying Guzzle via the framework. This package is a duplicate capability, not an additive one. A defensible fit exists only in a narrow case: a bounded service or module deliberately written in Innmind's functional style, where the transport is an implementation detail behind an owned port. It is not a fit for shared infrastructure, job queues, or anything a typical Laravel developer will touch.
Migration path. There is no migration — there is an adoption decision. If approved, adopt it additively and narrowly:
App\Contracts\OutboundHttpClient) expressed in plain PHP types and Laravel-native exceptions.Innmind\HttpTransport.This "one adapter, one namespace" rule is the only thing that makes the dependency cheap to reverse later, which given the risk profile should be a design requirement, not a guideline.
Compatibility. Verify before anything else: PHP constraint against the runtime version, compatibility with the framework's Guzzle version (they will coexist in the same composer.lock), and whether any Innmind transitive dependency conflicts with an existing package. Because the package does not implement PSR interfaces, there is no interoperability to test — only coexistence. Also confirm the package supports the PHP versions in CI and that composer audit is clean on the full dependency tree.
Sequencing.
Total elapsed time to a safe pilot: roughly one sprint, mostly review rather than coding.
Maintenance. This is the dominant cost and it is permanent. You are taking on a dependency with no community backstop, so every PHP minor upgrade, every innmind/immutable major bump, and every security advisory in the transitive tree becomes your ticket. Realistically budget a standing allocation of a few engineer-days per quarter to track upstream and validate, plus the unglamorous work of pinning and auditing. Because the package sits outside PSR standards, you cannot substitute a maintained library later without rewriting the adapter — which is precisely why the adapter boundary matters.
Support. No vendor, no SLA, no commercial backing, no meaningful issue-tracker history to search when something breaks. Internal support depends entirely on the one or two engineers who learned it during the spike. That is a bus-factor of one or two for a component on the critical outbound path. Document the adapter, the error-mapping rules, and the fork procedure before the pilot ships — treat the documentation as a deliverable, not an afterthought.
Scaling. Throughput is unlikely to be the problem; the package is thin and the decorator model composes fine. The scaling concerns are organizational: the number of engineers who can safely modify outbound HTTP code, and the ability to add cross-cutting concerns (tracing, circuit breaking, rate limiting) uniformly. With two HTTP stacks in the codebase, every platform-level improvement — a new tracing header, a retry policy standard, a PII redaction rule in logs — must be implemented twice, and the Innmind one will be implemented late or not at all.
Failure modes to design against.
Ramp-up. Expect a meaningful ramp for anyone who has not used Innmind's abstractions. A competent Laravel developer will need roughly 2–4 days to become productive with the immutable collections, URL value objects, and non-throwing error style — but only if they are also reading the adapter, which is why the adapter should be small, boring, and heavily commented. Do not expect the wider team to learn it; expect them to learn your interface. The realistic steady state is that a small number of engineers support the package on behalf of everyone else, indefinitely, in exchange for a capability the framework already provides.
Bottom line. From a TPM standpoint the recommendation is do not adopt outside a documented, bounded experiment. The opportunity score (~45/100) suggests a real capability gap in the abstract, but every gap it fills is already filled by Guzzle plus Laravel's HTTP client with vastly better support, observability, and hiring characteristics. Approve the one-sprint spike only if the requesting engineer can articulate a requirement that Guzzle middleware genuinely cannot meet; otherwise, redirect the effort to wrapping the existing client behind an owned interface, which delivers the same decoupling benefit at a fraction of the lifecycle cost.
How can I help you explore Laravel packages today?