Releases: shakacode/react_on_rails
Release list
v17.1.0
No user-visible changes since 17.1.0.rc.4; this candidate completes publication after the partial RC4 release.
Fixed
-
[Pro] Side-effect-only RSC client modules work in generated apps again: Generated RSC apps now pin
react-on-rails-rsc@19.3.0-rc.4with React/React DOM~19.2.8. RC4 accepts"use client"browser
registration modules that intentionally perform runtime side effects without exporting a client reference,
while continuing to reject inert, type-only, and CommonJS-style modules that may have lost their exports.
It also preserves CSS-wrapper side effects through production Webpack and Rspack tree shaking. RC3 remains
outside the qualified prerelease window because it rejected valid side-effect-only registration entrypoints.
See Tutorial Issue 823 and the
RSC RC4 release.
#5066 by
justin808. -
[Pro] RSC 19.3 prerelease compatibility: The 17.1 series adds JSX/TSX client-export parsing,
Rspack shared-chunk fixes, and stylesheet hints when Webpack or Rspack scope-hoists CSS-bearing
client-reference trees into concatenated modules. Generated apps use the RC4 tuple described above.
Doctor and the Node Renderer accept this qualified tuple while preserving stable RSC 19.2.x >=19.2.1
with stable React 19.2.x >=19.2.7. Nonqualified RSC-package prereleases and unsupported React minors
remain rejected. The Node Renderer explicitly rejects React/React DOM prereleases, including apps using
stable RSC 19.2.1, and standalone RSC generators warn about React prereleases instead of discarding their
version suffix. See #4958.
#5026 by justin808. -
[Pro] Prerender-cached streamed renders now hydrate on every request: The automatic prerender cache key
deliberately ignores random dom ids so one cached render serves every mount point, but the cached
chunks still embedded the first request's dom id in their React Server Component payload keys.
Every cache hit therefore refetched the payload and failed hydration whenever the render was not
byte-identical. Cached streams are now rebound to the dom id of the render being served. Fixes
#4984. #4987 by
justin808. -
Release failures now provide supervised, reason-specific recovery:
script/release --evaluate-head
supports strict exact-HEAD CI evaluation for both preview and live retries, foreign claims identify the available
holder/task/session metadata and targeted status command, and npm readiness distinguishes stale dependencies,
pnpm-version mismatches, and package-build failures without requiringbin/setup. Fixes
#4955. -
Fresh generated apps now preserve their resolved Shakapacker version: The installer now pins
bundle add shakapacker --strictto the version already selected through React on Rails instead
of allowing an older globally installed gem to downgrade the app's lockfile. The tested
Shakapacker baseline is now 10.3.2, which includes the rack-proxy v1 development-server proxy fix
and the macOS 27 liveness fix. Fixes
#4947. #4948 by
justin808. -
[Pro] Expected Node Renderer cold starts no longer emit OpenTelemetry error spans: The
ror.bundle.build_execution_contextcache-first probe previously ended with status ERROR when a worker had not
compiled a bundle's VM context yet, even though the normal cache-miss path then rendered successfully. The probe
now treats that expected miss as normal control flow while preserving error spans for genuine failures.
#4908 by
sashakhar1. -
[Pro] Hydrated Redux stores no longer leak across Turbo/Turbolinks navigations: The hydrated-store
registry is now cleared on client-side page unload (soft navigation), alongside the existing component
teardown. Previously a leftover entry from the previous page madegetOrWaitForStoreresolve immediately
with the previous page's store, silently defeating thestore_dependencieshydration gate — most visibly
with deferred stores (redux_store(..., defer: true)), where a mid-page component could render the
previous page's Redux state instead of waiting for its own page's hydration data. Registered store
generators are unaffected and persist across navigations. Note for apps that relied on a store surviving a
soft navigation without re-rendering its hydration data: each page using a store must now render its own
redux_storecall (the documented model). Fixes
#4861.
#4871 by
AbanoubGhadban. -
On-demand renders initialize only the island's declared store dependencies:
reactOnRailsComponentLoadedwalked every store element on the page even when asked to render a
single component, so an unrelated store element whose generator was not registered (e.g. its
bundle had not loaded yet) aborted the requested render, and unrelated new stores were hydrated
as a side effect. It now reads thedata-store-dependenciesattribute thereact_component
helper already emits (defaulted to the stores registered in the request, or set explicitly with
thestore_dependenciesoption) and initializes exactly those stores, matching the Pro
renderer's dependency gating; a declared dependency that cannot initialize is logged without
aborting the render. Markup without the attribute keeps the previous initialize-every-store
behavior, andreactOnRailsPageLoaded/full page loads are unchanged. Completes
#4862.
#4870 by
AbanoubGhadban. -
[Pro] Rails requests to the Node Renderer once again continue OpenTelemetry traces: The async-http transport
now creates a CLIENT span and injects W3C trace context for regular and streaming renders, incremental async-props
renders, raw-render requests, and asset uploads when the Rails application has configured the OpenTelemetry SDK.
OpenTelemetry remains optional, and spans record only the HTTP method, normalized request path, response status, and
request/response byte sizes. Fixes
#4866.
#4869 by
sashakhar1. -
[Pro] Node Renderer transport follow-ups now expose protocol errors and accurate Fastify modes:
Rails retries continue for network disconnects and peer-reset HTTP/2 streams, while HTTP parser and framing errors
surface directly. PublicconfigureFastifycallbacks andfastifyServerOptionsnow reflect both HTTP/1.1 and
HTTP/2 runtime modes.
#4893 by
sashakhar1. -
[Pro] Bounded Node Renderer VM retention now avoids old/new RSC rebuild thrash during rolling deploys:
The default per-worker VM hard cap now retains four contexts, enough for the server and RSC bundles from one
draining and one current revision. Successful bundle sets remain reusable through a configurable, timer-driven
drain window, while inactive contexts, generation metadata, and pressure logs stay bounded. Pre-seeding now emits
an immutable revision-scoped current-generation declaration; each configured renderer worker validates and compiles
that complete server/RSC set before listening, pins it across old-only traffic gaps, and reports ready only after the
compile barrier. Symlink-mode cache paths reuse the validated immutable snapshot VM identity without rebuilding on
the first request. Doctor now requires valid renderer JavaScript before launcher-derived capacity can prove a warm
pass, and reports observed/unverified declaration evidence rather than claiming success from invalid syntax,
loopback, or Rails-process configuration. Upgrade memory impact: the
defaultmaxVMPoolSizedoubles from 2 to 4 per worker, and total VM retention scales with renderer workers and
replicas, so operators should re-check deployment memory requests and limits. InvalidMAX_VM_POOL_SIZEvalues
that previously fell back to the default now fail fast during renderer startup. Fixes
#4810.
#4811 by
justin808. -
Routine startup diagnostics no longer appear in default
INFOlogs: Successful package validation, valid
Pro license checks, non-production missing-license notices, and Node renderer connection setup now log atDEBUG
instead ofINFO. Package validation still runs, while expired or invalid configured licenses remain visible outside
production, and production license warnings and renderer failures remain actionable. Fixes
#4848.
#4849 by
Justin Gordon. -
Generated server webpack configs no longer include an unused
mergeimport or stale comments:
commonWebpackConfigalready clones the shared client configuration, so the generated server configuration
stays lint-clean without changing its runtime behavior. Fixes
#4791.
#4840 by
ihabadham. -
Release retries now durably reuse maintainer-verified ShakaPerf evidence:
rake releasecan bind an
existing successful run to the canonical release tracker withRELEASE_SHAKAPERF_RUN, then re-fetch and
re-verify the exact SHA or machine-proven runtime-equivalent evidence on later invocations instead of
dispatching duplicate performance runs. Tracker trust is bound to the exact
Release gate: react_on_rails X.Y.Zstable-base title, explicit selectors take precedence over automatic
accepted-RC reuse, and persisted accelerated retries cannot silently consume a selector. Automatic reuse
falls back to normal discovery only for authoritative natural invalidation such as stale or missing evidence,
a failed/cancelled live run, or proven runtime divergence; indeterminate API or Git failures, detector errors,
and record mutations remain blocking. Raw REST-selected runs now preserve their creation timestamp through
strict-final verification. Before either a live release or dry run can reach registry checks, confirmation,
mut...
v17.1.0.rc.5
No user-visible changes since 17.1.0.rc.4; this candidate completes publication after the partial RC4 release.
v17.1.0.rc.3
Fixed
- [Pro] RSC 19.3 release-candidate compatibility and generated defaults: Generated RSC apps now pin
react-on-rails-rsc@19.3.0-rc.3with React/React DOM~19.2.8, bringing the JSX/TSX client-export
parsing and Rspack shared-chunk fixes into the 17.1 RC soak. RC3 also restores stylesheet hints
when Webpack or Rspack scope-hoists CSS-bearing client-reference trees into concatenated modules.
Doctor and the Node Renderer accept
this qualified RC tuple while preserving stable RSC 19.2.x >=19.2.1 with stable React 19.2.x >=19.2.7.
Nonqualified RSC-package prereleases and unsupported React minors remain rejected. The Node Renderer
now explicitly rejects React/React DOM prereleases, including apps using stable RSC 19.2.1.
Action required: use matching supported stable React/React DOM versions, and upgrade the Pro gem/npm
packages together before adopting this RSC RC. A"use client"
file without runtime ES-module exports now fails the build instead of silently disappearing.
Standalone RSC generators also warn about React prereleases instead of discarding their version suffix.
See #4958 and
RSC release notes.
#5026 by justin808.
v17.1.0.rc.2
Fixed
- [Pro] Prerender-cached streamed renders now hydrate on every request: The automatic prerender cache key
deliberately ignores random dom ids so one cached render serves every mount point, but the cached
chunks still embedded the first request's dom id in their React Server Component payload keys.
Every cache hit therefore refetched the payload and failed hydration whenever the render was not
byte-identical. Cached streams are now rebound to the dom id of the render being served. Fixes
#4984. #4987 by
justin808.
v17.1.0.rc.1
Fixed
-
Release failures now provide supervised, reason-specific recovery:
script/release --evaluate-head
supports strict exact-HEAD CI evaluation for both preview and live retries, foreign claims identify the available
holder/task/session metadata and targeted status command, and npm readiness distinguishes stale dependencies,
pnpm-version mismatches, and package-build failures without requiringbin/setup. Fixes
#4955. -
Fresh generated apps now preserve their resolved Shakapacker version: The installer now pins
bundle add shakapacker --strictto the version already selected through React on Rails instead
of allowing an older globally installed gem to downgrade the app's lockfile. The tested
Shakapacker baseline is now 10.3.2, which includes the rack-proxy v1 development-server proxy fix
and the macOS 27 liveness fix. Fixes
#4947. #4948 by
justin808.
v17.1.0.rc.0
Fixed
-
[Pro] Expected Node Renderer cold starts no longer emit OpenTelemetry error spans: The
ror.bundle.build_execution_contextcache-first probe previously ended with status ERROR when a worker had not
compiled a bundle's VM context yet, even though the normal cache-miss path then rendered successfully. The probe
now treats that expected miss as normal control flow while preserving error spans for genuine failures.
#4908 by
sashakhar1. -
[Pro] Hydrated Redux stores no longer leak across Turbo/Turbolinks navigations: The hydrated-store
registry is now cleared on client-side page unload (soft navigation), alongside the existing component
teardown. Previously a leftover entry from the previous page madegetOrWaitForStoreresolve immediately
with the previous page's store, silently defeating thestore_dependencieshydration gate — most visibly
with deferred stores (redux_store(..., defer: true)), where a mid-page component could render the
previous page's Redux state instead of waiting for its own page's hydration data. Registered store
generators are unaffected and persist across navigations. Note for apps that relied on a store surviving a
soft navigation without re-rendering its hydration data: each page using a store must now render its own
redux_storecall (the documented model). Fixes
#4861.
#4871 by
AbanoubGhadban. -
On-demand renders initialize only the island's declared store dependencies:
reactOnRailsComponentLoadedwalked every store element on the page even when asked to render a
single component, so an unrelated store element whose generator was not registered (e.g. its
bundle had not loaded yet) aborted the requested render, and unrelated new stores were hydrated
as a side effect. It now reads thedata-store-dependenciesattribute thereact_component
helper already emits (defaulted to the stores registered in the request, or set explicitly with
thestore_dependenciesoption) and initializes exactly those stores, matching the Pro
renderer's dependency gating; a declared dependency that cannot initialize is logged without
aborting the render. Markup without the attribute keeps the previous initialize-every-store
behavior, andreactOnRailsPageLoaded/full page loads are unchanged. Completes
#4862.
#4870 by
AbanoubGhadban. -
[Pro] Rails requests to the Node Renderer once again continue OpenTelemetry traces: The async-http transport
now creates a CLIENT span and injects W3C trace context for regular and streaming renders, incremental async-props
renders, raw-render requests, and asset uploads when the Rails application has configured the OpenTelemetry SDK.
OpenTelemetry remains optional, and spans record only the HTTP method, normalized request path, response status, and
request/response byte sizes. Fixes
#4866.
#4869 by
sashakhar1. -
[Pro] Node Renderer transport follow-ups now expose protocol errors and accurate Fastify modes:
Rails retries continue for network disconnects and peer-reset HTTP/2 streams, while HTTP parser and framing errors
surface directly. PublicconfigureFastifycallbacks andfastifyServerOptionsnow reflect both HTTP/1.1 and
HTTP/2 runtime modes.
#4893 by
sashakhar1. -
[Pro] Bounded Node Renderer VM retention now avoids old/new RSC rebuild thrash during rolling deploys:
The default per-worker VM hard cap now retains four contexts, enough for the server and RSC bundles from one
draining and one current revision. Successful bundle sets remain reusable through a configurable, timer-driven
drain window, while inactive contexts, generation metadata, and pressure logs stay bounded. Pre-seeding now emits
an immutable revision-scoped current-generation declaration; each configured renderer worker validates and compiles
that complete server/RSC set before listening, pins it across old-only traffic gaps, and reports ready only after the
compile barrier. Symlink-mode cache paths reuse the validated immutable snapshot VM identity without rebuilding on
the first request. Doctor now requires valid renderer JavaScript before launcher-derived capacity can prove a warm
pass, and reports observed/unverified declaration evidence rather than claiming success from invalid syntax,
loopback, or Rails-process configuration. Upgrade memory impact: the
defaultmaxVMPoolSizedoubles from 2 to 4 per worker, and total VM retention scales with renderer workers and
replicas, so operators should re-check deployment memory requests and limits. InvalidMAX_VM_POOL_SIZEvalues
that previously fell back to the default now fail fast during renderer startup. Fixes
#4810.
#4811 by
justin808. -
Routine startup diagnostics no longer appear in default
INFOlogs: Successful package validation, valid
Pro license checks, non-production missing-license notices, and Node renderer connection setup now log atDEBUG
instead ofINFO. Package validation still runs, while expired or invalid configured licenses remain visible outside
production, and production license warnings and renderer failures remain actionable. Fixes
#4848.
#4849 by
Justin Gordon. -
Generated server webpack configs no longer include an unused
mergeimport or stale comments:
commonWebpackConfigalready clones the shared client configuration, so the generated server configuration
stays lint-clean without changing its runtime behavior. Fixes
#4791.
#4840 by
ihabadham. -
Release retries now durably reuse maintainer-verified ShakaPerf evidence:
rake releasecan bind an
existing successful run to the canonical release tracker withRELEASE_SHAKAPERF_RUN, then re-fetch and
re-verify the exact SHA or machine-proven runtime-equivalent evidence on later invocations instead of
dispatching duplicate performance runs. Tracker trust is bound to the exact
Release gate: react_on_rails X.Y.Zstable-base title, explicit selectors take precedence over automatic
accepted-RC reuse, and persisted accelerated retries cannot silently consume a selector. Automatic reuse
falls back to normal discovery only for authoritative natural invalidation such as stale or missing evidence,
a failed/cancelled live run, or proven runtime divergence; indeterminate API or Git failures, detector errors,
and record mutations remain blocking. Raw REST-selected runs now preserve their creation timestamp through
strict-final verification. Before either a live release or dry run can reach registry checks, confirmation,
mutation, tagging, or publication, the task also verifies the frozen pnpm install state, the repository-pinned
pnpm version, and lifecycle-enabled builds of all four npm release packages before creating a release checkout,
pulling, authenticating, or reading any remote release state. The successful check is bound to the exact commit;
when a livegit pull --rebaseadvancesHEAD, the task rebuilds and rebinds readiness before resolving the release
version or continuing. npm publication now retries only explicit OTP challenges and context-qualified transient
network/HTTP failures; successful lifecycle/tool banners no longer mask those diagnostics, while authentication,
actual lifecycle failures, registry rejection, incidental numeric diagnostics, and unknown failures stop immediately
with OTP values redacted. Saved ShakaPerf evidence also recognizes GitHub CLI's exact
no valid artifacts found to downloaddiagnostic as authoritative absence while preserving observation failures as
blocking. Stable releases also support
an append-only, tracker-bound schema-v2 observation waiver bound to the exact run attempt and canonical
repository/workflow/event/branch identity. Legacy schema-v1 waiver markers remain readable audit history but cannot
authorize publication. The waiver does not
claim the run succeeded or bypass any other release gate; the tracker, waiver, and exact run are revalidated
before remote tag push and package publication, and a rerun attempt blocks both boundaries. Fixes
#4812.
#4833 by
justin808. -
[Pro] RSC render-error details no longer reach browser-facing payloads in production-like
environments: Fetched RSC payload metadata now uses a fail-closed allowlist that exposes only the
generichasErrorssignal needed by client error boundaries. Inline error-bearing payload chunks now
also suppress console replay inproduction,staging, and unrecognized environments, closing a path
that could repeat the server error message or source-mapped file paths after diagnostic metadata was
redacted. Full diagnostics and console replay remain available indevelopmentandtest, clean
production chunks retain console replay, and server-side reporting still receives the original error
details before the browser-boundary redaction runs. Fixes
#4736,
#4822, and
#4827.
#4821 and
#4856 by
justin808. -
HTTP-served SSR bundle loading now honors the response charset, rejects non-2xx responses,
and no longer leaks URL credentials into error messages:
Whenserver_bundle_js_fileresolves to an HTTP(S) URL,RubyEmbeddedJavaScript.file_url_to_string
no longer assumes theContent-Typeheader always ends in an exact; charset=...form. A response
with no charset, aContent-Typewith no charset parameter, a missingContent-Typeheader, or a
quoted charset value (charset="ISO-8859-1") now transcodes to UTF-8 successfully instead of
raising or silently mislabeling the bytes, falling back to UTF-8 when no usable charset is declared.
A non-2xx response (for example a 404 page or a proxy error) is now rejected with a clear
bundle-load error naming the URL and status, ins...
v17.0.1
v17.0.1.rc.0
v17.0.0
Breaking Changes
- [Pro] Removed the undocumented
ReactOnRailsPro::Cache.fetch_react_componentclass API:
Pro apps should use the supported cached helper APIs (cached_react_component,
cached_react_component_hash, and related helpers) instead of calling the low-level cache class
directly. The helper cache path still preserves generated-pack loading on cache hits, tag
registration, andexpires_athandling internally. Fixes
#4497.
#4541 by
justin808. - [Pro] React Server Components now require the stable React 19.2.x RSC line: Pro RSC apps on React on Rails 17 require
react-on-rails-rsc >= 19.2.1 < 19.3, React >= 19.2.7, and matching React DOM. Non-RSC Pro apps retain React 18 support. The Pro generator scaffolds that coordinated stable runtime and rejects all prerelease RSC packages while the stable floor is active. The adoptedreact-on-rails-rscartifact uses the React on Rails Pro commercial terms rather than MIT and reportsSEE LICENSE IN LICENSE.mdin npm metadata. SetREACT_ON_RAILS_PRO_DISABLE_VERSION_CHECK=1only as an emergency rollout escape hatch to downgrade startup errors to warnings. #4357. #4490 and #4670 by justin808. - Removed the inert
config.server_render_methodoption: The open-source configuration no longer acceptsconfig.server_render_method. The option never selected a server render method — the open-source gem always renders with ExecJS — and its validator raisedReactOnRails::Errorat boot for any value other than blank or"ExecJS". Setting it now raisesNoMethodErrorat boot, so delete anyconfig.server_render_method = ...line fromconfig/initializers/react_on_rails.rb;rake react_on_rails:doctoralso flags the stale line. For a standalone Node rendering process, use React on Rails Pro's Node renderer, configured viaReactOnRailsPro.configure. Fixes #4415. #4423 by justin808. - Removed three deprecated configuration options (
config.generated_assets_dirs,config.skip_display_none,config.defer_generated_component_packs): These were deprecated in v16 and are gone in v17. Setting any of them now raisesNoMethodErrorat boot; delete the stale lines fromconfig/initializers/react_on_rails.rb(rake react_on_rails:doctorflags them). Migration: deleteconfig.generated_assets_dirs— public asset paths come frompublic_output_pathinconfig/shakapacker.yml; deleteconfig.skip_display_none— it had no runtime effect; replaceconfig.defer_generated_component_packs = truewithconfig.generated_component_packs_loading_strategy = :defer, and simply deleteconfig.defer_generated_component_packs = false(the removed option was truthy-gated — only= trueset:defer;= falsewas a no-op that fell through to the default strategy, so it did not mean:sync; set:syncexplicitly only if you relied on synchronous loading). The default strategy is:asyncfor Pro or:deferfor non-Pro on Shakapacker 8.2.0+, and:syncon older Shakapacker. Fixes #4419. #4432 by justin808. - Removed the never-wired
RenderRequest/JsCodeBuilder/RenderingStrategyrendering layer: The internal strategy-pattern classesReactOnRails::RenderRequest,ReactOnRails::JsCodeBuilder,ReactOnRails::RenderingStrategy(withExecJsStrategy), and — in Pro —ReactOnRailsPro::JsCodeBuilderandReactOnRailsPro::RenderingStrategy::NodeStrategy, plus the undocumentedReactOnRails.rendering_strategyandReactOnRails.js_code_buildermodule accessors, are removed. This scaffolding was built for the strategy-pattern refactor in #2905 (closed without wiring it in) and was never invoked on any production server-rendering path — SSR runs throughServerRenderingJsCodeandServerRenderingPool, which never touched this layer. These constants and accessors were internal and undocumented; if you reference them in application code, remove the reference (the layer performed no work). Fixes #4414. #4437 by justin808. - Removed undocumented
ReactOnRails::Utilshelpers: React on Rails 17 removes the unusedReactOnRails::Utils.server_rendering_is_enabled?andReactOnRails::Utils.rails_version_less_thanhelper methods. Remove any application calls to those helpers; release-example generation now owns its private Rails-version check outside the publicUtilssurface. Fixes #4418. #4431 by justin808. - Ruby 3.3+ is required for React on Rails v17: The open-source gem now requires Ruby
>= 3.3.0, aligning it with React on Rails Pro,create-react-on-rails-app, and the CI minimum matrix. React on Rails v16 remains the upgrade path for applications that must stay on Ruby 3.2 or older. #3500 by justin808. - [Pro] Node Renderer now requires Ruby 3.3+ for the async-http transport: The
react-on-rails-progem now requires Ruby>= 3.3(raised from>= 3.0) becauseasync-httpdepends on Ruby 3.3 features. Upgrade Ruby before moving to this release. Seedocs/pro/updating.mdfor the full upgrade guide. #3320 by AbanoubGhadban. - [Pro]
config.renderer_http_pool_sizenow limits async-http connections per renderer client: Existing numeric values now cap concurrent async-http connections for each renderer client instead of sizing a persistent process-wide connection pool. HTTP/2 may multiplex request streams over those pooled connections. Settingnilkeeps the default connection limit and does not make the async-http client unlimited. Persistent connection reuse is automatic when a long-livedFiber.scheduleris present. Seedocs/pro/updating.mdfor the full upgrade guide. #3320 by AbanoubGhadban.
Added
-
[Pro] React 18 support for non-RSC streaming SSR:
stream_react_componentwith synchronous
props is now explicitly supported on React 18 as well as React 19. Permanent packed-artifact
coverage verifies a production Webpack build and progressive Suspense output on React 18 without
installing or bundlingreact-on-rails-rsc; async props and React Server Components remain React
19-only. Fixes #4642.
#4658 by
justin808. -
Generated Rails response TypeScript contracts: Rails apps can now register explicit JSON response
contracts withReactOnRails::TypeScriptResponseTypesand run
rake react_on_rails:generate_response_typesto emit importable.d.tsdeclarations plus a
RailsResponseTypeslookup map for TanStack Query clients. Fixes
#4247. #4259 by justin808. -
Typed Rails action callers for TanStack Query mutations: The
react-on-rails/railsAction
subpath now exportscreateRailsAction, a same-origin JSON caller that attaches Rails CSRF headers and
lets mutation code type responses with the generatedRailsResponseType<'controller.action'>lookup.
Fixes #4248. #4260 by justin808. -
[Pro] Typed Rails action callers for TanStack Query mutations: The Pro package mirrors the
createRailsActionhelper atreact-on-rails-pro/railsAction. #4260 by justin808. -
[Pro] Loader-time RSC prefetch through the provider cache: Client-router loaders can now
callprefetchServerComponentto warm a bounded page-global prefetch store thatRSCProvider
adopts on the nextRSCRouterender. Prefetches no-op when the SSR payload is already embedded,
support loader abort signals, and resolve without unhandled rejections after fetch/decode failure
self-eviction. Fixes #4460.
#4489 by
justin808. -
bin/dev cleanclears generated bundles and caches: The command stops development processes, readsconfig/shakapacker.ymlorSHAKAPACKER_CONFIG, removes configured Shakapacker public/private output and cache paths plus common Rails, JavaScript, and renderer bundle caches, and skips unsafe paths outside the app root. #4218 by justin808. -
[Pro] Buffered RSC rendering for static pages:
buffered_stream_react_componentandcached_buffered_stream_react_component
now render server components through the Pro streaming/RSC renderer while
returning complete HTML to Rails, so static or cacheable pages can avoid
ActionController::Liveresponse commits when progressive streaming is not
needed. When RSC support is enabled, prerendered Pro fragment cache keys now
include the RSC bundle digest, or a missing-bundle sentinel until that bundle
exists, so deploys that update only the RSC bundle invalidate cached RSC output
consistently. Fixes
#4263.
#4268 by
justin808. -
[Pro] Cached static RSC public-page helper and diagnostics:
cached_static_rsc_componentcaches stripped static RSC HTML for public pages
that intentionally skip the generated page pack, while respecting
auto_load_bundle: falseand preserving explicit sidecar assets. Static RSC
render diagnostics report cache hit/miss state, redacted cache-key digests,
HTML and stripped payload bytes, emitted asset bytes, and RSC client-reference
entries for performance investigations. Fixes
#4295 and
#4296.
#4386 by
justin808. -
[Pro] Opt-in browser performance marks for streamed RSC observability: Pro streaming can now emit inline browser marks for RSC stream completion, embedded Flight payload chunks, Node-side flushes, hydration start, and first interactive client effects, with byte counts and timing details that avoid serialized props or payload contents. The documented path uses body-delivered marks and a fallback queue instead of HTTP trailers, so apps can measure streamed RSC responses across CDN paths that may strip or hide trailer timing. Fixes #4205, #4206, and #4207. #4222 by justin808.
-
[Pro]
Server-Timingattribution for streamed RSC responses: Whenrsc_stream_observability: true, the streamed RSC response now also carries a `Server-Timin...
v17.0.0.rc.12
Added
- [Pro] React 18 support for non-RSC streaming SSR:
stream_react_componentwith synchronous
props is now explicitly supported on React 18 as well as React 19. Permanent packed-artifact
coverage verifies a production Webpack build and progressive Suspense output on React 18 without
installing or bundlingreact-on-rails-rsc; async props and React Server Components remain React
19-only. Fixes Issue 4642.
PR 4658 by
justin808.