No framework swap
No TanStack Start, Vite migration, Hotwire layer, or file-based routing requirement.
Keep Rails as the application server for auth, sessions, CSRF, validations, mailers, jobs, and Active Record. Add React on Rails Pro where server-rendered React and RSC need a Node rendering boundary. Use bare TanStack Router where the browser should own app navigation and URL state.
Demo login: demo@example.com
/ password
Rendering boundary
Public RSC
A TanStack route loader composes a Pro RSC payload from Rails; only explicit client islands hydrate.
Authenticated TanStack
TanStack Router, Query, and Table run inside Rails-owned full-page routes.
Classic Rails
Plain Rails CRUD remains available where a client app shell would add no value.
Why this stack
Inertia keeps Rails controllers close to pages by sending props to a client component tree. This starter chooses a different boundary: Rails remains the app server, while React on Rails Pro owns the server-rendered React and RSC boundary. That lets server components stay server-only instead of becoming another client page protocol.
No TanStack Start, Vite migration, Hotwire layer, or file-based routing requirement.
RSC modules can await server data without shipping that implementation to the browser.
The dashboard table keeps filter, sort, and pagination in shareable browser URLs.
Authentication, authorization boundaries, CSRF, model validation, mailers, and jobs stay in Rails.
Each surface this starter ships is one click away, with a direct link to its source on GitHub. Authenticated routes open the sign-in page first.
RSC + TanStack
A bare TanStack Router loader fetches a React on Rails Pro RSC payload from Rails and composes it beside client islands.
App shell
Authenticated Rails routes render a TanStack Router, Query, and Table dashboard through the React on Rails Pro Node renderer.
Data
Rails keeps persistence, validation, CSRF, filtering, sorting, and pagination. TanStack Query owns browser cache and invalidation.
Baseline
Conventional Rails forms and controller patterns remain available for CRUD screens that do not need a client app shell.
Accounts
Session auth, signup with email verification gating, password reset, mailers, and previews are already wired.
Profile
Profile updates run from the TanStack dashboard while Rails still owns validation and the unverified-on-email-change gate.
The repo ships an AGENTS.md playbook with reference patterns. Point Claude, Cursor, or Codex at the repo and paste one of these to learn, extend, or experiment.
Clone shakacode/react-on-rails-starter-tanstack and read AGENTS.md. Then explain how Rails routes /dashboard to DashboardController#show, how app/views/dashboard/show.html.erb renders DashboardApp, and how React on Rails Pro hands TanStack Router its SSR and hydration state.
Walk me through the /rsc-showcase flow in this repo: app/controllers/rsc_showcase_controller.rb, app/views/rsc_showcase/show.html.erb, app/javascript/src/RscShowcase/ror_components/RscShowcaseApp.tsx, and the React on Rails Pro RSC payload route. Include how /hello_server remains the lower-level streaming reference.
In this repo, add a priority column to Project (enum: low, medium, high). Surface it as a sortable, URL-synced column in the TanStack table in DashboardApp.tsx, add server-side sorting in app/controllers/api/projects_controller.rb, and write request and Playwright specs following the existing patterns.
Add an authenticated TanStack route at /reports following the dashboard-props-controller and tanstack-route reference patterns in AGENTS.md. Pass Rails-owned props through DashboardController and render a summary built with TanStack Query.
One link each. No detours.
Honest status: Rspack is the default for local development and deployed asset builds. The RSC showcase uses React on Rails Pro's RSCRoute path on Rspack; Webpack remains documented only as an optional comparison check. See SPIKE.md.