Skip to content

Gumroad RSC experiment: benchmark findings and positioning #3144

@justin808

Description

@justin808

Context

This is the benchmark-discipline and positioning thread for the Gumroad-style React on Rails Pro + RSC experiment.

Canonical public repo:

Related hub issue:

Active public PRs:

Scope discipline:

  • this is not a Gumroad migration pitch
  • this is a measured comparison on one reduced dashboard surface
  • Rspack is a build/dev-loop story, not a page-runtime story by itself
  • RSC is the runtime experiment

Matched routes

  • Inertia control: /dashboard/inertia_demo
  • React on Rails Pro + RSC: /dashboard/rsc_demo

Both routes use the same reduced creator-home presenter surface and the same outer layout.

Current headline benchmark

The current headline benchmark is the corrected clean-port alternating result from PR #10.

Why this replaced the earlier grouped or mixed-port numbers:

  • route order affects cache state, so the alternating runner rotates order by cycle
  • an earlier run had a local asset-proxy mismatch because another repo had reclaimed port 3035
  • the follow-up run restarted both Rails and the Shakapacker dev server with SHAKAPACKER_DEV_SERVER_PORT=3036
  • Chrome and ChromeDriver matched during this pass

Latest reduced-dashboard result:

Metric Inertia demo RSC demo Delta
Navigation duration 457.16ms 402.29ms -12.0%
LCP 501.00ms 421.00ms -16.0%
Response end 320.70ms 335.96ms +4.8%
Controller action_total 163.10ms 169.74ms +4.1%
Presenter compare_props 144.80ms 145.49ms +0.5%
Page-specific JS requests 6 1 -83.3%

What this means

Positive signal:

  • the bounded RSC route wins on total navigation duration
  • the bounded RSC route wins on LCP
  • the bounded RSC route materially reduces page-specific JavaScript requests
  • the latest server-side penalty is smaller than the earlier mixed-port runs suggested

Remaining caveat:

  • Inertia is still ahead on responseEnd and route-level server timing
  • the benchmark is still local-development, not production-like
  • renderer-internal profiling is still needed before making a stronger production-performance claim

Product and positioning implications

  • Use Rspack to talk about build speed and developer loop improvements.
  • Use RSC to talk about route-level runtime tradeoffs and client-JS reduction.
  • Do not blur those two claims; it weakens both.
  • The strongest near-term message is not “replace Inertia.”
  • The stronger message is: some product surfaces cross the line into full React application territory, and that is where React on Rails Pro can justify itself.

Adjacent product idea worth discussing

A friendlier bridge for existing Inertia Rails apps may be viable:

  • keep inertia_rails in place
  • offer SSR and React 19 support first
  • wrap the Node renderer, boot/fallback behavior, CSP, and observability cleanly
  • only explore deeper RSC-style integration if the protocol fit stays honest
  • keep the implementation clean-room if any public Inertia adapter is derived from ideas in React on Rails Pro

Current validation status as of April 30, 2026 UTC

Latest local validation rerun:

  • Parent branch: npm run setup
  • Parent branch: RAILS_ENV=development NODE_ENV=development bin/shakapacker --mode development
  • Parent branch: RAILS_ENV=test npm run build:rsc-demo
  • Child branch: npm run setup
  • Child branch: RAILS_ENV=development NODE_ENV=development bin/shakapacker --mode development
  • Child branch: RAILS_ENV=test npm run build:rsc-demo

Docs/catalog status:

Useful docs

Next work

  • publish the ReactOnRails.com examples catalog when the site PR is merged
  • capture production-like renderer profiling
  • rerun the benchmark against production-like assets/rendering
  • see whether the LCP/navigation win holds while narrowing the server-side penalty
  • decide whether to keep the demo PRs as draft case-study branches or make the consolidated parent PR ready for review

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions