Removed
- Removed
immediate_hydrationconfiguration and parameter: Theimmediate_hydrationconfig option, helper parameter,data-immediate-hydrationHTML attribute, andredux_storeimmediate_hydration:keyword argument have been completely removed. Immediate hydration is now always enabled for React on Rails Pro users and disabled for non-Pro users, with no per-component override. Remove anyimmediate_hydrationreferences from your initializer and helper calls. Passingimmediate_hydration:toreact_component/react_component_hashis now ignored, and passing it tostream_react_componentlogs a warning. This change also fixes HTML attribute escaping for redux store names to prevent attribute injection from unsafe store keys. Closes Issue 2142.
PR 2834 by
justin808.
Added
- [Pro] Auto-resolve renderer password from ENV:
setup_renderer_passwordnow falls back toENV["RENDERER_PASSWORD"]when neitherconfig.renderer_passwordnor a URL-embedded password is set, aligning Rails-side behavior with the Node Renderer defaults. Blank values (nilor"") are treated identically and fall through the full resolution chain: config → URL → ENV. PR 2921 by justin808. - Interactive mode prompt for
create-react-on-rails-app: Runningnpx create-react-on-rails-appwithout--proor--rscnow shows an interactive prompt to choose between Standard, Pro, and RSC modes (default: RSC recommended). Explicit flags skip the prompt, and non-interactive environments fall back to standard mode automatically. PR 3063 by justin808. - [Pro] Configurable HTTP keep-alive timeout for node renderer connections: Added
renderer_http_keep_alive_timeoutconfiguration option (default: 30s) to control how long idle persistent HTTP/2 connections to the node renderer are kept alive, preventing SSR failures from stale connections. PR 3069 by justin808. - [Pro]
react_on_rails:pronow automates Pro and RSC Pro upgrades: Added first-class--rsc-proinstall mode, automaticreact_on_rails->react_on_rails_proGemfile and package swaps, and frontend import rewrites to streamline existing app upgrades. PR 2822 by justin808.
Improved
- Doctor enforces strict version constraints:
react_on_rails:doctornow escalates non-exact gem and npm version specs (^,~,>=) from warnings to errors, matching the runtime VersionChecker behavior. Wildcard checks now also cover Pro packages (react-on-rails-pro,react_on_rails_pro). PR 3070 by justin808. - Error messages recommend doctor: Runtime version-check crashes, configuration validation errors, and autobundling errors now suggest running
bundle exec rake react_on_rails:doctorfor diagnostics andbundle exec rake react_on_rails:sync_versions WRITE=trueto fix version mismatches. PR 3070 by justin808. sync_versionshandles range specs: Version ranges like^16.5.0,~16.5.0, and>=16.5.0are now parsed and rewritten to the exact expected version instead of being skipped as unsupported. WhenFIX=trueis set, doctor auto-runssync_versionsto fix detected mismatches. PR 3070 by justin808.- [Pro] Improved node renderer error messages for malformed render requests: Added early validation for missing or invalid
renderingRequestpayloads on the render endpoint, returning actionable 400 messages that include received type, body keys, and likely causes (truncation, malformed multipart, content-length mismatch). PR 3068 by justin808. react_on_rails:doctornow prefers runtime configuration: Doctor now reads loadedReactOnRails.configurationvalues before falling back to initializer parsing, improving diagnostics for customized SSR and NodeRenderer setups. PR 2823 by justin808.- Fresh app onboarding for
create-react-on-rails-app: New apps now land on a generated root page with links to the local demos, docs, OSS vs Pro guidance, the Pro quick start, and the marketplace RSC demo.bin/devopens that page on first boot,--rscscaffolds the same fresh-app experience, and the generated app records step-by-step educational git commits for each scaffold phase. PR 2849 by justin808.
Fixed
- [Pro] Fixed TanStack Router SSR hydration mismatches in the async path: Client hydration now restores server match data before first render, uses
RouterProviderdirectly to match the server-rendered tree, and stops the post-hydration load when a customrouter.options.hydratecallback fails instead of continuing with partially hydrated client state. PR 2932 by justin808. - [Pro] Fixed infinite fork loop when node renderer worker fails to bind port: When a worker failed during
app.listen()(e.g.,EADDRINUSE), the master previously reforked unconditionally, causing an infinite fork/crash loop that consumed CPU and filled logs. Workers now send aWORKER_STARTUP_FAILUREIPC message to the master before exiting; the master sets an abort flag and exits with a clear error message instead of reforking. Scheduled restarts and runtime crashes continue to refork as before. PR 2881 by justin808. - [Pro] Fixed Pro generator multiline and template-literal rewrites: The Pro install generator now correctly handles multiline non-parenthesized
gem "react_on_rails"declarations while preserving trailing options, and correctly rewrites module specifiers around template literals by preserving escaped sequences and detecting multiline template-literal starts after a closed inline template. PR 2918 by justin808. - [Pro] Fixed SSR failures from stale persistent HTTP/2 connections to the node renderer: When idle connections became stale (closed by the node renderer but still considered active by the Ruby side), render requests could be truncated mid-flight, producing confusing
FST_ERR_CTP_INVALID_CONTENT_LENGTHand "INVALID NIL or NULL result for rendering" errors. The newrenderer_http_keep_alive_timeoutconfig (default: 30s) prevents this by closing idle connections before they go stale. Content-Length mismatches now produce specific diagnostic messages instead of generic errors, and sensitive field names are filtered from diagnostic output. Fixes Issue 3071. PR 3069 by justin808. - Legacy Shakapacker migrations are more resilient:
react_on_rails:installnow falls back cleanly when thepackage_jsongem is unavailable, installs only missing JS packages through the detected package manager, and auto-switches legacy JSX-in-.jsapps to Babel when needed. PR 2901 by justin808. - New-app root-route generation is more robust: Generator root-route detection is now centralized, duplicate route insertion is avoided, and home-page generation warns instead of failing when
config/routes.rbis missing or unexpected. PR 2891 by justin808. bin/devnow exits quietly on Ctrl-C: The process manager and generated Shakapacker watcher wrapper now treat interrupt-driven shutdown as a clean exit, avoiding Ruby backtraces during local development. PR 2652 by justin808.bin/devbrowser auto-open now waits for route readiness:--open-browserand--open-browser-oncenow poll the target app route and open the browser only after receiving a success or redirect response, reducing premature opens during boot. PR 2885 by justin808.