rsc-kit/laravel
RSC Kit for Laravel brings server-driven component workflows to Laravel applications, with streamlined setup, routing, and rendering for reusable UI that keeps logic on the backend and cuts client-side JavaScript. Build faster, lighter interfaces while staying in familiar Laravel patterns.
Architecture fit
rsc-kit/laravel sits at the seam between Laravel's request/controller layer and a React Server Components renderer, so adopting it is an architectural decision, not a library swap. The v0.15.5 addition — Rsc::refuse(), a refusal carrying data for the page — is the first primitive in this package that lets server-side logic authoritatively decline to render a component and hand structured data back to the client. That matters to a TPM because it is the mechanism by which authorization, feature-flagging, and "not available in your region"-style branching can live in PHP rather than leaking into the JS bundle or being duplicated on both sides. If your product has any server-authoritative UI decisions (entitlements, per-tenant configuration, A/B assignment), this is the right shape of API. If it does not, this release is not a reason to adopt the package.
Integration feasibility
Feasible but non-trivial: RSC in a PHP host implies a second runtime (Node) alongside PHP-FPM, a bundler step (Vite) that must stay in lockstep with the PHP-side component registry, and a serialization contract between the two. Rsc::refuse() deepens that contract because refusal payloads cross the boundary and must be deserializable on the client with a stable shape. There is no evidence in the release notes of a coordinated JS-side handler API, protocol versioning, or a documented serialization format — those are the first things to verify in the spike.
Technical risk
Key questions
refuse() abort the stream, and how does that interact with Suspense and error boundaries?Stack fit Reasonable only if the team already runs a Node toolchain for frontend builds — which most Laravel shops do via Vite — and is comfortable operating a Node process in production. The package does not remove PHP from the request path, so you carry both runtimes and both dependency graphs permanently. Treat it as a frontend-architecture commitment, not a Composer dependency.
Migration path Do not attempt an incremental page-by-page migration of an existing Blade/Livewire/Inertia app. RSC integration is a routing-and-rendering-model decision; partial adoption creates two rendering paradigms with a shared layout and divergent data-loading idioms. The viable path is a bounded, additive surface: one new route group or one new product area built RSC-first, coexisting with the existing app behind the same session/auth layer.
Compatibility
Pin exactly (0.15.5, not ^0.15) and vendor the lockfile. Verify the paired JS package version explicitly — the PHP/JS version pairing is the most likely source of silent breakage. Confirm PHP and Laravel minor-version support in the package's CI matrix before committing; the notes do not state it.
Sequencing
refuse() so a 0.16 rename is a one-file change. Do not call the package API directly from feature code.Maintenance Two dependency graphs to patch, two lockfiles to audit, and a PHP/JS version pairing that must move together. Budget recurring maintenance for the wrapper layer and for tracking upstream releases; a solo-maintainer pre-1.0 package will not absorb your upgrade burden. Assign explicit ownership of the PHP↔JS version pin.
Support No commercial support path is evident. Internal escalation means reading the renderer source. Ensure at least one engineer can debug inside both the Laravel package and the JS renderer — that is a single point of failure if it is one person.
Scaling The PHP tier scales conventionally. The Node render tier does not: it needs its own horizontal scaling, its own concurrency limits, and its own cold-start story. Refusals are cheap (they short-circuit work) but they add a code path that bypasses normal render metrics, so dashboards will undercount traffic unless refusal outcomes are emitted as first-class events.
Failure modes
Ramp-up Expect 2–4 weeks before a mid-level Laravel engineer is productive and considerably longer before they can debug the boundary. The concepts to teach are not in the package docs: RSC's server/client split, the serialization contract, and the refusal-as-control-flow idiom. Onboarding material should be written internally — do not assume upstream documentation covers the refusal path, since the feature shipped without it in these notes.
How can I help you explore Laravel packages today?