Skip to content

Conversation

@AbanoubGhadban
Copy link
Collaborator

@AbanoubGhadban AbanoubGhadban commented Aug 25, 2025

Summary

Remove this paragraph and provide a general description of the code changes in your pull
request... were there any bugs you had fixed? If so, mention them. If
these bugs have open GitHub issues, be sure to tag them here as well,
to keep the conversation linked together.

Pull Request checklist

Remove this line after checking all the items here. If the item is not applicable to the PR, both check it out and wrap it by ~.

  • Add/update test to cover these changes
  • Update documentation
  • Update CHANGELOG file

Add the CHANGELOG entry at the top of the file.

Other Information

Remove this paragraph and mention any other important and relevant information such as benchmarks.


This change is Reviewable

Summary by CodeRabbit

  • Documentation
    • Spotlighted "Early Hydration" with a narrative and explicit benefits (eliminates race conditions, faster time‑to‑interactive, streaming HTML optimization, async script safety).
    • Added a performance visualization showing before/after hydration behavior and clarified target scenarios.
    • Added a Major Performance Breakthroughs upgrade guide with adoption steps and results.
    • Removed an older React Server Components marketing/documentation page.
    • Updated React Server Components tutorial link; script‑loading guidance unchanged.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 25, 2025

Walkthrough

Documentation updates: release notes reworded to present "Early Hydration" with benefits, narrative, and visualization; one React-on-Rails Pro doc deleted and a new upgrade-guide added; a React Server Components tutorial link path was updated. No code or public API changes.

Changes

Cohort / File(s) Summary of Changes
Release notes
docs/release-notes/15.0.0.md
Rewrote "Improved Component Hydration" as "🚀 Major Performance Breakthrough: Early Hydration"; converted bullets into a narrative with explicit benefits (Eliminates Race Conditions, Faster TTI, Streaming HTML Optimization, Async Script Safety, No More Defer), added contextual scenarios and a before/after performance visualization; kept "Enhanced Script Loading Strategies" text.
Removed Pro doc
docs/react-on-rails-pro/react-server-components.md
Deleted the React Server Components marketing/documentation page (announcements, case studies, onboarding steps and links removed).
New Pro guide
docs/react-on-rails-pro/major-performance-breakthroughs-upgrade-guide.md
Added a new upgrade guide describing RSC + SSR streaming + Early Hydration, Fastify Node renderer and infra notes, optimized script loading defaults, adoption steps, experiments and a performance diagram.
Internal link update
.../react-server-components-tutorial.../react-server-components/tutorial/
Updated the React Server Components tutorial link path in affected docs to the new URL path.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant Browser
  participant Rails
  participant NodeRenderer as Node Renderer

  Note over Rails,NodeRenderer: Page request triggers server rendering pipeline
  Browser->>Rails: GET /page
  Rails->>NodeRenderer: request HTML stream (RSC/SSR)
  NodeRenderer-->>Rails: streaming HTML chunks (progressive)
  Rails-->>Browser: streaming HTML (first chunks arrive)
  Note over Browser: Early Hydration starts as soon as interactive chunks arrive
  Browser->>Browser: Early Hydration (hydrate components progressively)
  Browser->>Browser: Final JS boot completes (full interactivity)
  Note over Browser: Result: faster TTI, fewer race conditions
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • justin808
  • alexeyr-ci2
  • Judahmeek

Poem

A rabbit reads the changelog bright,
Early hydration springs to light.
Docs pruned, links set neat and right,
Streams arrive and pages bite—
I hop, I cheer, v15 takes flight! 🥕🐇

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.

✨ Finishing Touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch abanoubghadban/update-release-notes

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
docs/release-notes/15.0.0.md (3)

14-23: Soften absolutes, align with Breaking Changes, and fix compound-adjective hyphenation.

The bullets overstate guarantees (“Eliminates Race Conditions”) and slightly conflict with the nuanced guidance later (“defer … doesn’t work well with Streamed HTML”). Recommend softening language, adding a brief cross-reference to the defaults that make this work (generated_component_packs_loading_strategy: :async, force_load: true), and fixing “full page load” → “full-page load.”

-### 🚀 Major Performance Breakthrough: Early Hydration
+### 🚀 Major Performance Improvement: Early Hydration

-**React on Rails now starts hydration even before the full page is loaded!** This revolutionary change delivers significant performance improvements across all pages:
+**React on Rails can start hydration before the full-page load.** This change delivers significant performance improvements across many pages (especially with streaming). See “Breaking Changes” for defaults that enable this (`generated_component_packs_loading_strategy: :async`, `force_load: true`).

-- **Eliminates Race Conditions**: No more waiting for full page load before hydration begins
-- **Faster Time-to-Interactive**: Components hydrate as soon as their server-rendered HTML reaches the client
-- **Streaming HTML Optimization**: Perfect for modern streaming responses - components hydrate in parallel with page streaming
-- **Async Script Safety**: Can use `async` scripts without fear of race conditions
-- **No More Defer Needed**: The previous need for `defer` to prevent race conditions has been eliminated
+- **Minimizes race conditions**: Hydration can begin before the full-page load.
+- **Faster time-to-interactive (TTI)**: Components hydrate as soon as their server-rendered HTML reaches the client.
+- **Optimized for streaming HTML**: Components hydrate as server-rendered chunks arrive, in parallel with page streaming.
+- **Async-script friendly**: Safe to use `async` without introducing hydration ordering issues.
+- **Defer rarely needed**: In most cases, you no longer need `defer` due to improved hydration handling.

Actionable checks:

  • Verify terminology consistency: use “full-page load” when used adjectivally.
  • Confirm we want to avoid the marketing “revolutionary” tone in release notes.
  • Validate the “Defer rarely needed” claim against any known edge-cases (legacy Turbolinks, custom script managers).

24-29: Tighten phrasing and ensure parallel structure for the “impactful for” list.

Minor copyedits for clarity/parallelism. Optional, but reads cleaner.

-This optimization is particularly impactful for:
-- **Streamed pages** where content loads progressively
-- **Large pages** with many components
-- **Slow network conditions** where every millisecond counts
-- **Modern web apps** requiring fast interactivity
+This optimization is particularly impactful for:
+- **Streamed pages** (content loads progressively)
+- **Very large pages** with many components
+- **High-latency or low-bandwidth networks**
+- **Apps demanding fast interactivity**

30-37: Use a repo-hosted asset, add descriptive alt/caption, and fix hyphenation.

Linking to a GitHub “user-attachments” URL is brittle for long-term docs. Please move the image into the repo (e.g., docs/assets/ or similar), improve the alt text with what’s being measured, and remove contractions. Also fix “full page load” → “full-page load.”

-*Performance improvement visualization:*
+*Performance improvement visualization (TTI and hydration start timing):*

-![Performance comparison showing early hydration improvement](https://github.com/user-attachments/assets/ae33fe14-42f1-4cc1-bde3-9c5bb570cdbf)
+![Before/after chart comparing hydration start time and TTI with and without early hydration. Lower is better.](./assets/early-hydration-before-after.png)

-*The image above demonstrates the dramatic performance improvement:*
-- **Left (Before)**: Hydration didn't start until the full page load completed, causing a huge delay before hydration
-- **Right (After)**: Hydration starts immediately as soon as components are available, without waiting for full page load
+*The image above demonstrates the performance improvement:*
+- **Left (Before)**: Hydration did not start until the full-page load completed, causing a large delay.
+- **Right (After)**: Hydration starts as soon as server-rendered components are available, without waiting for the full-page load.
 - **Result**: Components now become interactive much faster, eliminating the previous race condition delays

Follow-ups:

  • Add a short “Benchmark methodology” subsection (metrics, environment, steps) to make the chart reproducible.
  • Confirm the new image path is added to the repo and referenced correctly.
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between c2cd789 and 96275f5.

📒 Files selected for processing (1)
  • docs/release-notes/15.0.0.md (1 hunks)
🧰 Additional context used
🪛 LanguageTool
docs/release-notes/15.0.0.md

[grammar] ~14-~14: There might be a mistake here.
Context: ...erformance Breakthrough: Early Hydration **React on Rails now starts hydration even ...

(QB_NEW_EN)


[uncategorized] ~18-~18: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ... Race Conditions**: No more waiting for full page load before hydration begins - **Faster...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[grammar] ~24-~24: There might be a mistake here.
Context: ...imization is particularly impactful for: - Streamed pages where content loads pro...

(QB_NEW_EN)


[grammar] ~25-~25: There might be a mistake here.
Context: ...ages** where content loads progressively - Large pages with many components - **S...

(QB_NEW_EN)


[grammar] ~26-~26: There might be a mistake here.
Context: ...y - Large pages with many components - Slow network conditions where every mi...

(QB_NEW_EN)


[grammar] ~27-~27: There might be a mistake here.
Context: ...ditions** where every millisecond counts - Modern web apps requiring fast interac...

(QB_NEW_EN)


[grammar] ~34-~34: There might be a mistake here.
Context: ...es the dramatic performance improvement:* - Left (Before): Hydration didn't start ...

(QB_NEW_EN)


[uncategorized] ~35-~35: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...re)**: Hydration didn't start until the full page load completed, causing a huge delay be...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[uncategorized] ~36-~36: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...ents are available, without waiting for full page load - Result: Components now becom...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: build-dummy-app-webpack-test-bundles (oldest)
  • GitHub Check: build-dummy-app-webpack-test-bundles (newest)
  • GitHub Check: examples (oldest)
  • GitHub Check: examples (newest)
  • GitHub Check: rspec-package-tests (oldest)

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (4)
docs/release-notes/15.0.0.md (4)

14-23: Tighten wording, hyphenate “full‑page load,” and format defer consistently.

This keeps the tone professional, reduces absolute claims, and improves consistency.

Apply this diff:

-### 🚀 Major Performance Breakthrough: Early Hydration
+### 🚀 Early Hydration: Major performance improvement

-**React on Rails now starts hydration even before the full page is loaded!** This revolutionary change delivers significant performance improvements across all pages:
+**Hydration can begin before the full page has loaded.** This change improves performance across many pages:

-- **Eliminates Race Conditions**: No more waiting for full page load before hydration begins
+- **Reduces hydration race conditions**: No more waiting for the full‑page load before hydration begins
 - **Faster Time-to-Interactive**: Components hydrate as soon as their server-rendered HTML reaches the client
-- **Streaming HTML Optimization**: Perfect for modern streaming responses - components hydrate in parallel with page streaming
+- **Streaming HTML optimization**: Ideal for modern streaming responses—components hydrate in parallel with page streaming
 - **Async Script Safety**: Can use `async` scripts without fear of race conditions
-- **No More Defer Needed**: The previous need for `defer` to prevent race conditions has been eliminated
+- **No `defer` required**: The previous need for `defer` to prevent race conditions has been eliminated

58-63: Clarify breaking-change bullets and add a concise migration snippet.

Minor wording/consistency tweaks (code formatting, hyphenation) plus an initializer example to reduce ambiguity for upgraders.

-  - The previous need for deferring scripts to prevent race conditions has been eliminated due to improved hydration handling. Making scripts not defer is critical to execute the hydration scripts early before the page is fully loaded.
-  - The `force_load` configuration makes `react-on-rails` hydrate components immediately as soon as their server-rendered HTML reaches the client, without waiting for the full page load.
-  - If you want to keep the previous behavior, you can set `generated_component_packs_loading_strategy: :defer` or `force_load: false` in your `config/initializers/react_on_rails.rb` file.
+  - The previous need for `defer` to prevent hydration race conditions has been eliminated due to improved hydration handling. Executing hydration logic early (no `defer`) helps avoid full‑page‑load stalls.
+  - `force_load` makes `react-on-rails` hydrate components as soon as their server‑rendered HTML reaches the client, without waiting for the full‑page load.
+  - To keep prior behavior, set `generated_component_packs_loading_strategy: :defer` or `force_load: false` in `config/initializers/react_on_rails.rb`.
     - You can also keep it for individual components by passing `force_load: false` to `react_component` or `stream_react_component`.
-  - Redux store now supports `force_load` option, which defaults to `config.force_load` (and so to `true` if that isn't set). If `true`, the Redux store will hydrate immediately as soon as its server-side data reaches the client.
+  - Redux store now supports `force_load`, which defaults to `config.force_load` (and thus `true` if not set). If `true`, the Redux store hydrates immediately as soon as its server‑side data reaches the client.
     - You can override this behavior for individual Redux stores by calling the `redux_store` helper with `force_load: false`, same as `react_component`.

Optional initializer example to include below these bullets:

# config/initializers/react_on_rails.rb
ReactOnRails.configure do |config|
  # New defaults in v15:
  config.generated_component_packs_loading_strategy = :async # Shakapacker ≥ 8.2.0
  config.force_load = true

  # To keep pre-v15 behavior:
  # config.generated_component_packs_loading_strategy = :defer
  # config.force_load = false
end

Happy to open a follow-up PR inserting this snippet in the right place if you prefer.


65-77: Async API change: add TS-friendly example and note about awaiting in non-top-level contexts.

Calling code often needs an await site; providing TS/ESM and script-tag patterns will prevent common mistakes.

   - If you manually call this function to ensure components are hydrated (e.g., with async script loading), you must now await the promise it returns:
 
     ```js
     // Before
     ReactOnRails.reactOnRailsPageLoaded();
     // Code expecting all components to be hydrated
 
     // After
     await ReactOnRails.reactOnRailsPageLoaded();
     // Code expecting all components to be hydrated
     ```
+
+    TypeScript/ESM example (no top‑level await in CJS):
+    ```ts
+    import ReactOnRails from "react-on-rails";
+    (async () => {
+      await ReactOnRails.reactOnRailsPageLoaded();
+      // Safe to access hydrated components/stores here
+    })();
+    ```

79-79: Consider adding a Turbo equivalent note alongside Turbolinks.

Many apps have migrated from Turbolinks to Turbo. If the same async‑script caveat applied, add a brief sentence and link to the Turbo note for parity.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 96275f5 and 18ef203.

📒 Files selected for processing (2)
  • docs/react-on-rails-pro/react-server-components.md (1 hunks)
  • docs/release-notes/15.0.0.md (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • docs/react-on-rails-pro/react-server-components.md
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: AbanoubGhadban
PR: shakacode/react_on_rails#1644
File: lib/react_on_rails/helper.rb:190-197
Timestamp: 2025-02-18T13:08:01.477Z
Learning: RSC support validation in React on Rails Pro is handled through a chain of validations:
1. Pro version check in `run_stream_inside_fiber`
2. RSC support check during pack generation via `ReactOnRailsPro.configuration.enable_rsc_support`
3. RSC support validation during component registration
This makes additional validation in the helper methods unnecessary.
🪛 LanguageTool
docs/release-notes/15.0.0.md

[grammar] ~14-~14: There might be a mistake here.
Context: ...erformance Breakthrough: Early Hydration **React on Rails now starts hydration even ...

(QB_NEW_EN)


[uncategorized] ~18-~18: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ... Race Conditions**: No more waiting for full page load before hydration begins - **Faster...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[grammar] ~24-~24: There might be a mistake here.
Context: ...imization is particularly impactful for: - Streamed pages where content loads pro...

(QB_NEW_EN)


[grammar] ~25-~25: There might be a mistake here.
Context: ...ages** where content loads progressively - Large pages with many components - **S...

(QB_NEW_EN)


[grammar] ~26-~26: There might be a mistake here.
Context: ...y - Large pages with many components - Slow network conditions where every mi...

(QB_NEW_EN)


[grammar] ~27-~27: There might be a mistake here.
Context: ...ditions** where every millisecond counts - Modern web apps requiring fast interac...

(QB_NEW_EN)


[grammar] ~34-~34: There might be a mistake here.
Context: ...es the dramatic performance improvement:* - Left (Before): Hydration didn't start ...

(QB_NEW_EN)


[uncategorized] ~35-~35: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...re)**: Hydration didn't start until the full page load completed, causing a huge delay be...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[uncategorized] ~36-~36: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...ents are available, without waiting for full page load - Result: Components now becom...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: dummy-app-integration-tests (oldest)
  • GitHub Check: dummy-app-integration-tests (newest)
  • GitHub Check: rspec-package-tests (oldest)
🔇 Additional comments (2)
docs/release-notes/15.0.0.md (2)

24-29: Section reads well; impact bullets are clear and actionable.

This list crisply communicates where early hydration helps the most. No changes needed.


12-12: Verified RSC tutorial link and added minimum Pro version qualifier

  • The tutorial URL returns HTTP/2 200 OK.
  • Updated the callout to specify React on Rails Pro >= 15.0.0 as the minimum required version.

Affected file:

  • docs/release-notes/15.0.0.md (line 12)

Diff:

- ⚡️ Requires React on Rails Pro - [See the full tutorial](https://www.shakacode.com/react-on-rails-pro/docs/react-server-components/tutorial/)
+ ⚡️ Requires React on Rails Pro >= 15.0.0 – [See the full tutorial](https://www.shakacode.com/react-on-rails-pro/docs/react-server-components/tutorial/)

Comment on lines 30 to 37
*Performance improvement visualization:*

![Performance comparison showing early hydration improvement](https://github.com/user-attachments/assets/ae33fe14-42f1-4cc1-bde3-9c5bb570cdbf)

*The image above demonstrates the dramatic performance improvement:*
- **Left (Before)**: Hydration didn't start until the full page load completed, causing a huge delay before hydration
- **Right (After)**: Hydration starts immediately as soon as components are available, without waiting for full page load
- **Result**: Components now become interactive much faster, eliminating the previous race condition delays
Copy link
Contributor

@coderabbitai coderabbitai bot Aug 25, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Move the visualization asset into the repo for longevity and refine captions.

Links to user-attachments can break. Prefer storing the image under docs assets and referencing it relatively. Also tighten the caption language and hyphenate “full‑page load.”

Suggested diff (assuming image moved to docs/assets/early-hydration-before-after.png):

-*Performance improvement visualization:*
+*Performance improvement visualization:*

-![Performance comparison showing early hydration improvement](https://github.com/user-attachments/assets/ae33fe14-42f1-4cc1-bde3-9c5bb570cdbf)
+![Early hydration: before vs. after](../assets/early-hydration-before-after.png)

-*The image above demonstrates the dramatic performance improvement:*
+-*The image above illustrates the performance impact:*
 - **Left (Before)**: Hydration didn't start until the full page load completed, causing a huge delay before hydration
-- **Right (After)**: Hydration starts immediately as soon as components are available, without waiting for full page load
+- **Right (After)**: Hydration starts as soon as components are available, without waiting for the full‑page load
 - **Result**: Components now become interactive much faster, eliminating the previous race condition delays

If you keep the external asset, please verify it returns 200:


🏁 Script executed:

#!/bin/bash
set -euo pipefail
curl -I -sS "https://github.com/user-attachments/assets/ae33fe14-42f1-4cc1-bde3-9c5bb570cdbf" | sed -n '1,5p'

Length of output: 354


Fix broken image link & embed asset locally

The external asset URL currently returns a 404 (Mon, 25 Aug 2025), so the performance visualization won’t render. Embed the image under docs/assets and update its reference. Also tighten the caption language and hyphenate “full-page load.”

• Confirm broken link: https://github.com/user-attachments/assets/ae33fe14-42f1-4cc1-bde3-9c5bb570cdbf returns 404.
• Add image file at docs/assets/early-hydration-before-after.png.
• Update reference in docs/release-notes/15.0.0.md (lines 30–37).

Suggested diff:

*Performance improvement visualization:*
-![Performance comparison showing early hydration improvement](https://github.com/user-attachments/assets/ae33fe14-42f1-4cc1-bde3-9c5bb570cdbf)
+![Early hydration: before vs. after](../assets/early-hydration-before-after.png)

-*The image above demonstrates the dramatic performance improvement:*
+-*The image above illustrates the performance impact:*
 - **Left (Before)**: Hydration didn't start until the full page load completed, causing a huge delay before hydration
 - **Right (After)**: Hydration starts as soon as components are available, without waiting for the full-page load
 - **Result**: Components now become interactive much faster, eliminating the previous race condition delays

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 LanguageTool

[grammar] ~34-~34: There might be a mistake here.
Context: ...es the dramatic performance improvement:* - Left (Before): Hydration didn't start ...

(QB_NEW_EN)


[uncategorized] ~35-~35: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...re)**: Hydration didn't start until the full page load completed, causing a huge delay be...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[uncategorized] ~36-~36: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...ents are available, without waiting for full page load - Result: Components now becom...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

🤖 Prompt for AI Agents
In docs/release-notes/15.0.0.md around lines 30 to 37 the external image URL
returns 404 so the performance visualization doesn't render; add the image file
docs/assets/early-hydration-before-after.png to the repo, update the markdown
reference to point to that local path, and tighten the caption text by
hyphenating “full-page load” and shortening the caption to remove redundant
phrasing (e.g., “Left (Before): Hydration waited for full-page load; Right
(After): Hydration starts immediately as components are available — components
become interactive much faster”).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/release-notes/15.0.0.md (1)

80-80: Fix broken relative link to Turbolinks doc

The release notes reference an anchor that doesn’t exist in the Turbolinks doc:

  • File & Line: docs/release-notes/15.0.0.md:80
    Reference: [Turbolinks](../rails/turbolinks.md#async-script-loading)
    Issue: docs/rails/turbolinks.md exists, but there’s no ## async-script-loading heading to serve as the link target.

Next steps:

  • Add a ## async-script-loading section (with matching ID) to docs/rails/turbolinks.md, or
  • Update the link in the release notes to point to an existing heading (e.g., adjust to #async-script-loading or the correct section ID).
♻️ Duplicate comments (3)
docs/release-notes/15.0.0.md (1)

31-39: Fix broken external image link; store asset locally; refine caption

This external “user-attachments” URL is brittle and currently 404s; embed the asset under docs and link relatively. Also hyphenate “full‑page load” and streamline captions.

-_Performance improvement visualization:_
-
-![Performance comparison showing early hydration improvement](https://github.com/user-attachments/assets/ae33fe14-42f1-4cc1-bde3-9c5bb570cdbf)
-
-_The image above demonstrates the dramatic performance improvement:_
-- **Left (Before)**: Hydration didn't start until the full page load completed, causing a huge delay before hydration
-- **Right (After)**: Hydration starts immediately as soon as components are available, without waiting for full page load
-- **Result**: Components now become interactive much faster, eliminating the previous race condition delays
+_Performance improvement visualization:_
+
+![Early hydration: before vs. after](../assets/early-hydration-before-after.png)
+
+_The image illustrates the impact:_
+- **Left (Before)**: Hydration waited for the full‑page load, causing a large delay
+- **Right (After)**: Hydration starts as soon as components are available—no full‑page load wait
+- **Result**: Components become interactive much faster; race‑condition delays are eliminated

Action items:

  • Add the image file at docs/assets/early-hydration-before-after.png (lossless PNG preferred).
  • If you must keep an external URL, please confirm it returns HTTP 200 and add a fallback local copy.
docs/react-on-rails-pro/major-performance-breakthroughs-upgrade-guide.md (2)

55-64: Mirror language edits from release notes: hyphenate “full‑page load” and tighten phrasing

Keep the wording consistent between the release notes and this guide.

-**React on Rails now starts hydration even before the full page is loaded!** This revolutionary change delivers significant performance improvements across all pages:
+**React on Rails now starts hydration even before the full‑page load!** This delivers significant performance improvements across all pages:

-- **Eliminates Race Conditions**: No more waiting for full page load before hydration begins
+- **Eliminates Race Conditions**: No more waiting for the full‑page load before hydration begins
 - **Faster Time-to-Interactive**: Components hydrate as soon as their server-rendered HTML reaches the client
 - **Streaming HTML Optimization**: Perfect for modern streaming responses - components hydrate in parallel with page streaming
 - **Async Script Safety**: Can use `async` scripts without fear of race conditions
 - **No More Defer Needed**: The previous need for `defer` to prevent race conditions has been eliminated

72-80: Localize image asset; improve caption and alt text

Same image-link issue here; please embed locally and align caption with the release notes.

-_Performance improvement visualization:_
-
-![Performance comparison showing early hydration improvement](https://github.com/user-attachments/assets/ae33fe14-42f1-4cc1-bde3-9c5bb570cdbf)
-
-_The image above demonstrates the dramatic performance improvement:_
+_Performance improvement visualization:_
+
+![Early hydration: before vs. after](../assets/early-hydration-before-after.png)
+
+_The image illustrates the impact:_
🧹 Nitpick comments (10)
docs/release-notes/15.0.0.md (5)

12-12: Cross-link upgrade guide and verify tutorial URL

Nice callout that RSC requires Pro. Consider adding a second link to the new upgrade guide for quicker onboarding, and please verify the tutorial URL is stable.

- - ⚡️ Requires React on Rails Pro - [See the full tutorial](https://www.shakacode.com/react-on-rails-pro/docs/react-server-components/tutorial/)
+ - ⚡️ Requires React on Rails Pro — see:
+   - [Full tutorial](https://www.shakacode.com/react-on-rails-pro/docs/react-server-components/tutorial/)
+   - [Upgrade guide for v15 / Pro v4](../react-on-rails-pro/major-performance-breakthroughs-upgrade-guide.md)

16-23: Hyphenate “full‑page load” and tighten phrasing

Minor language polish for consistency and readability. Avoid “immediately as soon as,” and hyphenate the compound adjective “full‑page.”

-**React on Rails now starts hydration even before the full page is loaded!** This revolutionary change delivers significant performance improvements across all pages:
+**React on Rails now starts hydration even before the full‑page load!** This delivers significant performance improvements across all pages:

-- **Eliminates Race Conditions**: No more waiting for full page load before hydration begins
+- **Eliminates Race Conditions**: No more waiting for the full‑page load before hydration begins
 - **Faster Time-to-Interactive**: Components hydrate as soon as their server-rendered HTML reaches the client
 - **Streaming HTML Optimization**: Perfect for modern streaming responses - components hydrate in parallel with page streaming
 - **Async Script Safety**: Can use `async` scripts without fear of race conditions
-- **No More Defer Needed**: The previous need for `defer` to prevent race conditions has been eliminated
+- **No More Defer Needed**: The previous need for `defer` to prevent race conditions has been eliminated

46-47: Clarify defer caveat for streamed HTML

Small reword for precision and tone.

-  - `:defer` - Defers script execution until after page load (doesn't work well with Streamed HTML as it will wait for the full page load before hydrating the components)
+  - `:defer` - Defers script execution until after the page load (suboptimal with streamed HTML because hydration waits for the full‑page load)

55-65: Verify defaults and add initializer example

The defaults for generated_component_packs_loading_strategy and force_load are important. Recommend adding a minimal initializer snippet and verifying these match the shipped code.

 - The `generated_component_packs_loading_strategy` defaults to `:async` for Shakapacker ≥ 8.2.0 and `:sync` for Shakapacker < 8.2.0.
 - The `force_load` configuration now defaults to `true`.
+  
+Example initializer:
+
+```ruby
+# config/initializers/react_on_rails.rb
+ReactOnRails.configure do |config|
+  # Shakapacker ≥ 8.2.0 defaults to :async, otherwise :sync
+  config.generated_component_packs_loading_strategy = :async
+  # Hydrate as soon as HTML and code are available
+  config.force_load = true
+end
+```

If helpful, I can open a PR to add a configuration reference page and link it here.


66-78: Include TypeScript signature for async migration

Since reactOnRailsPageLoaded is now async, include the TS signature to make migration unambiguous.

   // After
-  await ReactOnRails.reactOnRailsPageLoaded();
+  await ReactOnRails.reactOnRailsPageLoaded();
   // Code expecting all components to be hydrated
+
+  // TypeScript
+  // declare function reactOnRailsPageLoaded(): Promise<void>;
docs/react-on-rails-pro/major-performance-breakthroughs-upgrade-guide.md (5)

3-5: Fix markdownlint MD036: use a heading instead of bold “Subject” line

Convert the emphasized line into a proper heading or drop “Subject:” entirely.

-**Subject: 🚀 Revolutionary Performance Breakthroughs: React Server Components, SSR Streaming & Early Hydration Now Available in React on Rails Pro v4 & React on Rails v15**
+## 🚀 Revolutionary Performance Breakthroughs
+
+React Server Components, SSR Streaming & Early Hydration now available in React on Rails Pro v4 & React on Rails v15.

86-90: “No code changes required” is too strong; add caveats

Infra and build tooling (e.g., Fastify renderer, HTTP/2/h2c, proxies) often need deployment and config changes. Suggest softening the promise.

-- **No code changes required** - automatic performance boost
+- **Minimal code changes in most apps** — expect deployment/config updates (renderer switch, HTTP/2/h2c, proxies). See the upgrade guide for details.

91-97: Link to configuration reference and release notes

Add cross-links so readers can jump to details about generated_component_packs_loading_strategy and the Early Hydration breaking changes.

 - **Async loading by default** for Shakapacker ≥ 8.2.0 (optimal performance)
 - **Smart hydration timing** that works perfectly with streaming HTML
 - **Eliminated waterfall delays** in component hydration
+
+See also:
+- [Release notes: Early Hydration and breaking changes](../release-notes/15.0.0.md#component-hydration-changes)

110-121: Add support and feedback links

Consider adding links to the issue tracker and discussions/Slack for upgrade support.

 Let's make your apps faster—together.
 
 **ShakaCode Team**
 _Building the future of Rails + React performance_
+
+Need help? Open an issue or start a discussion:
+- GitHub Issues: https://github.com/shakacode/react_on_rails/issues
+- Discussions/Slack: https://www.shakacode.com/community

23-39: Prefer primary sources for case studies; update links and mark third-party reports

– Replace the “productonboarding.com experiment” link with the Frigade blog post, our primary source for that data (frigade.com).
– Replace the GeekyAnts link with the official case study on geekyants.com (geekyants.com).
– For Airbnb’s “15% improvement in core web vitals and 23% reduction in TTFB” and Meta’s “30% bundle-size reduction, 60% TTI improvement, etc.”, we couldn’t locate an official Airbnb or Meta engineering post—these figures come via a third-party aggregator. Add a parenthetical note:
“(Figures reported by third-party sources.)”

No broken functionality; this simply strengthens attribution and transparency.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 18ef203 and 9cd187d.

📒 Files selected for processing (3)
  • docs/react-on-rails-pro/major-performance-breakthroughs-upgrade-guide.md (1 hunks)
  • docs/react-on-rails-pro/react-server-components.md (0 hunks)
  • docs/release-notes/15.0.0.md (1 hunks)
💤 Files with no reviewable changes (1)
  • docs/react-on-rails-pro/react-server-components.md
🧰 Additional context used
🪛 LanguageTool
docs/react-on-rails-pro/major-performance-breakthroughs-upgrade-guide.md

[grammar] ~3-~3: There might be a mistake here.
Context: ...act on Rails Pro v4 & React on Rails v15** --- We're thrilled to announce a major update...

(QB_NEW_EN)


[grammar] ~9-~9: There might be a mistake here.
Context: ...🎯 What This Means for Your Applications - Dramatically faster load times - **Smal...

(QB_NEW_EN)


[grammar] ~11-~11: There might be a mistake here.
Context: ...ions - Dramatically faster load times - Smaller JavaScript bundles - **Better ...

(QB_NEW_EN)


[grammar] ~12-~12: There might be a mistake here.
Context: ...d times** - Smaller JavaScript bundles - Better Core Web Vitals - **Improved SE...

(QB_NEW_EN)


[grammar] ~13-~13: There might be a mistake here.
Context: ...ipt bundles** - Better Core Web Vitals - Improved SEO - **Smoother user interac...

(QB_NEW_EN)


[grammar] ~14-~14: There might be a mistake here.
Context: ...etter Core Web Vitals** - Improved SEO - Smoother user interactions - **Elimina...

(QB_NEW_EN)


[grammar] ~15-~15: There might be a mistake here.
Context: ...ved SEO** - Smoother user interactions - Eliminated race conditions - **Optimiz...

(QB_NEW_EN)


[grammar] ~16-~16: There might be a mistake here.
Context: ...actions** - Eliminated race conditions - Optimized streaming performance ## 🔥...

(QB_NEW_EN)


[grammar] ~19-~19: There might be a mistake here.
Context: ...ormance** ## 🔥 React Server Components Server Components execute on the server a...

(QB_NEW_EN)


[grammar] ~40-~40: There might be a mistake here.
Context: ...e that only the first of these directly compares performance of equivalent applications ...

(QB_NEW_EN)


[grammar] ~40-~40: There might be a mistake here.
Context: ...ith and without React Server Components. Other migrations may include React or ot...

(QB_NEW_EN)


[grammar] ~43-~43: There might be a mistake here.
Context: ...upgrades and so on. ## 🌊 SSR Streaming SSR Streaming sends HTML to the browser i...

(QB_NEW_EN)


[grammar] ~47-~47: There might be a mistake here.
Context: ...smash/get/diva2:1903931/FULLTEXT01.pdf): - 32% faster time to first byte - **40...

(QB_NEW_EN)


[grammar] ~48-~48: There might be a mistake here.
Context: ...): - 32% faster time to first byte - 40% faster total blocking time - Neg...

(QB_NEW_EN)


[grammar] ~49-~49: There might be a mistake here.
Context: ...e - 40% faster total blocking time - Negative result: 2% increase in serv...

(QB_NEW_EN)


[grammar] ~50-~50: There might be a mistake here.
Context: ...e result: 2% increase in server load - [Hulu case study](https://www.compilenrun...

(QB_NEW_EN)


[grammar] ~51-~51: There might be a mistake here.
Context: ...#case-study-3-hulus-streaming-platform): - 30% faster page load times - [styled‑c...

(QB_NEW_EN)


[grammar] ~52-~52: There might be a mistake here.
Context: ...orm): - 30% faster page load times - [styled‑components v3.1.0: A massive perf...

(QB_NEW_EN)


[uncategorized] ~59-~59: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ... Race Conditions**: No more waiting for full page load before hydration begins - **Faster...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[grammar] ~67-~67: There might be a mistake here.
Context: ...ages** where content loads progressively - Large pages with many components - **S...

(QB_NEW_EN)


[grammar] ~68-~68: There might be a mistake here.
Context: ...y - Large pages with many components - Slow network conditions where every mi...

(QB_NEW_EN)


[grammar] ~69-~69: There might be a mistake here.
Context: ...ditions** where every millisecond counts - Modern web apps requiring fast interac...

(QB_NEW_EN)


[uncategorized] ~78-~78: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...re)**: Hydration didn't start until the full page load completed, causing a huge delay be...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[uncategorized] ~79-~79: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...ents are available, without waiting for full page load - Result: Components now becom...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[grammar] ~82-~82: There might be a mistake here.
Context: ...# 🚀 Enhanced Performance Infrastructure ### Fastify-Based Node Renderer - **Faster N...

(QB_NEW_EN)


[grammar] ~86-~86: There might be a mistake here.
Context: ...er** based on Fastify instead of Express - HTTP/2 Cleartext communication between...

(QB_NEW_EN)


[grammar] ~87-~87: There might be a mistake here.
Context: ...nication between Rails and Node renderer - Multiplexing and connection reuse for ...

(QB_NEW_EN)


[grammar] ~88-~88: There might be a mistake here.
Context: ...ter performance when deployed separately - No code changes required - automatic p...

(QB_NEW_EN)


[grammar] ~93-~93: There might be a mistake here.
Context: ...nt_packs_loading_strategy` configuration - Async loading by default for Shakapack...

(QB_NEW_EN)


[grammar] ~94-~94: There might be a mistake here.
Context: ...hakapacker ≥ 8.2.0 (optimal performance) - Smart hydration timing that works perf...

(QB_NEW_EN)


[grammar] ~95-~95: There might be a mistake here.
Context: ...that works perfectly with streaming HTML - Eliminated waterfall delays in compone...

(QB_NEW_EN)


[grammar] ~98-~98: There might be a mistake here.
Context: ...tion ## 💰 Why This Upgrade is Critical These performance improvements aren't jus...

(QB_NEW_EN)


[grammar] ~102-~102: There might be a mistake here.
Context: ...oday's performance-focused web landscape - SEO improvements as Core Web Vitals be...

(QB_NEW_EN)


[grammar] ~103-~103: There might be a mistake here.
Context: ...s Core Web Vitals become ranking factors - User retention - faster sites keep use...

(QB_NEW_EN)


[grammar] ~104-~104: There might be a mistake here.
Context: ...- faster sites keep users engaged longer - Conversion rates - every millisecond c...

(QB_NEW_EN)


[grammar] ~105-~105: There might be a mistake here.
Context: ... every millisecond counts for e-commerce - Mobile performance - crucial for globa...

(QB_NEW_EN)

docs/release-notes/15.0.0.md

[grammar] ~14-~14: There might be a mistake here.
Context: ...erformance Breakthrough: Early Hydration **React on Rails now starts hydration even ...

(QB_NEW_EN)


[uncategorized] ~18-~18: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ... Race Conditions**: No more waiting for full page load before hydration begins - **Faster...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[grammar] ~26-~26: There might be a mistake here.
Context: ...ages** where content loads progressively - Large pages with many components - **S...

(QB_NEW_EN)


[grammar] ~27-~27: There might be a mistake here.
Context: ...y - Large pages with many components - Slow network conditions where every mi...

(QB_NEW_EN)


[grammar] ~28-~28: There might be a mistake here.
Context: ...ditions** where every millisecond counts - Modern web apps requiring fast interac...

(QB_NEW_EN)


[uncategorized] ~37-~37: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...re)**: Hydration didn't start until the full page load completed, causing a huge delay be...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[uncategorized] ~38-~38: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...ents are available, without waiting for full page load - Result: Components now becom...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

🪛 markdownlint-cli2 (0.17.2)
docs/react-on-rails-pro/major-performance-breakthroughs-upgrade-guide.md

3-3: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: dummy-app-integration-tests (newest)
  • GitHub Check: dummy-app-integration-tests (oldest)
  • GitHub Check: rspec-package-tests (oldest)
🔇 Additional comments (3)
docs/release-notes/15.0.0.md (2)

88-95: Sanity-check Node/TS version guidance and link targets

Claims about Node versions tolerating require() for ESM and the TypeScript 5.8 link should be verified against current releases.

  • Confirm Node versions and behavior (v20.19.0+, v22.12.0+).
  • Confirm TypeScript page exists at the linked 5.8 release notes path.
  • If versions differ at release time, either pin known-good versions or phrase as “Node ≥ X.Y.Z where …”.

14-23: Overall narrative improvements: LGTM

The Early Hydration narrative, benefits, and migration guidance are clear and materially improve the release notes. Once the image is embedded locally and small wording tweaks are applied, this section will be in great shape.

Also applies to: 31-41, 50-65

docs/react-on-rails-pro/major-performance-breakthroughs-upgrade-guide.md (1)

1-18: Overall: strong, actionable upgrade guide

Great job packaging the why + how, quantitative results, and infra improvements. Once link hygiene/wording tweaks are in, this will be a solid landing doc for v15/Pro v4.

Also applies to: 43-55, 82-97, 98-107


## 🔥 React Server Components

Server Components execute on the server and stream HTML to the client—no server-side JavaScript in your bundle. Real‑world results include:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Tighten RSC description to be technically accurate

RSC streams a component payload (Flight) and doesn't inherently “stream HTML” (that’s SSR). Suggest wording that distinguishes RSC from SSR streaming.

-Server Components execute on the server and stream HTML to the client—no server-side JavaScript in your bundle. Real‑world results include:
+Server Components execute on the server and stream a lightweight component payload to the client (no server‑only code shipped to the browser). Combine with SSR streaming to progressively send HTML. Real‑world results include:
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Server Components execute on the server and stream HTML to the clientno server-side JavaScript in your bundle. Realworld results include:
Server Components execute on the server and stream a lightweight component payload to the client (no server-only code shipped to the browser). Combine with SSR streaming to progressively send HTML. Real-world results include:
🤖 Prompt for AI Agents
In docs/react-on-rails-pro/major-performance-breakthroughs-upgrade-guide.md
around line 21, the sentence incorrectly states that RSC "stream HTML" — update
the wording to state that Server Components execute on the server and stream a
component payload (Flight) to the client rather than streaming pre-rendered HTML
(which is what SSR does); replace the line with a concise distinction that RSC
streams Flight payloads and SSR streams HTML, and keep the following "Real‑world
results include:" context unchanged.

@justin808 justin808 merged commit 30a41c1 into master Aug 26, 2025
9 of 11 checks passed
@justin808 justin808 deleted the abanoubghadban/update-release-notes branch August 26, 2025 07:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants