A simple framework
for humans

Server-first React, running on the Cloudflare platform.
Simple to build. Easy to maintain.

v1.0 shipping on the 11th of March
04DAYS
:
13HRS
:
27MIN
:
49SEC
Wanna help? Star us!

Get started

Scaffold a Vite project powered by RedwoodSDK. Includes RSC, type-safe routing/SQL, and Cloudflare integration.

$npx create-rwsdk my-project-name

Principles

Simplicity for humans is clarity for AI. By using React, TypeScript, and Cloudflare without custom "noise," AI focuses on your business logic instead of navigating framework rules.

Principle
Without
Magic
Technical Reality
No code-gen or implied routing
AI Advantage
Clarity: AI reads exactly what executes
Principle
Composability
Technical Reality
Standard functions and types
AI Advantage
Logic: AI follows your code, not a policy
Principle
WebStandards
Technical Reality
If the browser or platform has it, we use it
AI Advantage
Context: AI uses core web knowledge
Principle
Server-First
Technical Reality
Linear data flow
AI Advantage
Signal: Higher accuracy for auditing/writing

In Developers' Own Words

RedwoodSDK is composable.Wes BosWes Bos @wesbos"Interesting pivot for Redwood... a React framework for Cloudflare with full support for RSC. Vite Plugin, file-based routing, middleware... tight (but not required) integration." It is built to be server-first, centering entirely on the request-response lifecycle.Justin BennettJustin Bennett @Zephraph"I'm a fan. The defineApp api is incredibly smart. Great way to actually flow middleware types through to handlers." This makes the architecture intuitive and easy to grasp.Nico BothaNico Botha @nwbotha"Started building last night... it's been a great experience so far. Easy to pick up, and everything just works. It's the full-stack framework I've always wanted!"

But simple doesn't mean limited.Tom Preston-WernerTom Preston-Werner @mojombo"RedwoodSDK up and to the right! If you like @Cloudflare and you like @reactjs, but especially if you like to SHIP PRODUCT, you should put your 👀 on this." The framework is deeply powerful, stripping away complexity without sacrificing scale.Odd-Appeal6543Odd-Appeal6543 @Odd-Appeal6543"The boilerplate reduction that happens when you have a clear separation of server routes and client leafs... is mind blowing. Maximum control without the magic."

You are in total control.Ryan QuinnRyan Quinn @Frown360Turn"My analogy for SDK: 'instead of trying to explain your order to the chef... you get to just step into the kitchen and make it.' Feels like cheating for how nice it’s felt."

Routing

Composable functions that describe your app using standard TypeScript.

1import { defineApp } from "@rwsdk/worker"
2import { route } from "@rwsdk/router"
3
4export default defineApp([
5 // Match paths to route handlers
6 route("/", () => {
7 return <h1>Hello, World!</h1>
8 }),
9])
1 / 5

The Basics

A route matches a request and hands it to a function that returns a response.

Async React

A unified mental model for bridging the gap between the client and server.

Streamed components

Streamed components deliver the page in flight, rendering layout shells instantly while data-heavy sections load progressively. This partial UI strategy ensures the user sees a functional page immediately, with content filling the gaps as it arrives.

Server Runtime
// actions.ts
export const saveData = async (text: string) => {
await db.save(text);
};
Save Data

RPC over RSC

React Server Components (RSC) enable a unified loop where buttons trigger server functions directly, bypassing traditional API layers. This Remote Procedure Call (RPC) pattern treats the client and server as a single execution environment, simplifying data flow and logic.

Server Runtime
People you follow
View

Fake speed until you make speed

Optimistic updates provide instant UI feedback, while Transitions mask latency with fluid motion. For unavoidable delays, Suspense replaces jarring blank states with structured skeleton fallbacks, ensuring a smooth, predictable, and continuous experience.

Realtime

useSyncedState is a drop-in replacement for useState that synchronizes state across all connected clients in real-time.

-const [count, setCount] = useState(0);
+const [count, setCount] = useSyncedState(0, 'global-count');

Transform any local state into a globally synchronized, bi-directional data stream. When you call useSyncedState, it persists the state on your server automatically. Your server can push data down to the clients, or the clients can push data up to the server; all without writing a single WebSocket handler.

YOUR SESSION: ...
LIVE
0
Syncing to Cloudflare KV

Try it: The activity bar below shows multiple users interacting with our website and updates in real-time. Open this page in multiple tabs to see how state is synced from client → server → client.

SECTION 10 Interactions
SECTION 20 Interactions
SECTION 30 Interactions
SECTION 40 Interactions
SECTION 50 Interactions
SECTION 60 Interactions
SECTION 70 Interactions
SECTION 80 Interactions
SECTION 90 Interactions
SECTION 100 Interactions
SECTION 110 Interactions
SECTION 120 Interactions
SECTION 130 Interactions
SECTION 140 Interactions
SECTION 150 Interactions
SECTION 160 Interactions
SECTION 170 Interactions
SECTION 180 Interactions
SECTION 190 Interactions
SECTION 200 Interactions
SECTION 210 Interactions
SECTION 220 Interactions
SECTION 230 Interactions
SECTION 240 Interactions
SECTION 250 Interactions
SECTION 260 Interactions
SECTION 270 Interactions
SECTION 280 Interactions
SECTION 290 Interactions
SECTION 300 Interactions
SECTION 310 Interactions
SECTION 320 Interactions
SECTION 330 Interactions
SECTION 340 Interactions
SECTION 350 Interactions
SECTION 360 Interactions
SECTION 370 Interactions
SECTION 380 Interactions
SECTION 390 Interactions
SECTION 400 Interactions
SECTION 410 Interactions
SECTION 420 Interactions
SECTION 430 Interactions
SECTION 440 Interactions
SECTION 450 Interactions
SECTION 460 Interactions
SECTION 470 Interactions
SECTION 480 Interactions
SECTION 490 Interactions
SECTION 500 Interactions
SECTION 510 Interactions
SECTION 520 Interactions
SECTION 530 Interactions
SECTION 540 Interactions
SECTION 550 Interactions
SECTION 560 Interactions
SECTION 570 Interactions
SECTION 580 Interactions
SECTION 590 Interactions
SECTION 600 Interactions
SECTION 610 Interactions
SECTION 620 Interactions
SECTION 630 Interactions
SECTION 640 Interactions
SECTION 650 Interactions
SECTION 660 Interactions
SECTION 670 Interactions
SECTION 680 Interactions
SECTION 690 Interactions
SECTION 700 Interactions
SECTION 710 Interactions
SECTION 720 Interactions
SECTION 730 Interactions
SECTION 740 Interactions
SECTION 750 Interactions
SECTION 760 Interactions
SECTION 770 Interactions
SECTION 780 Interactions
SECTION 790 Interactions
SECTION 800 Interactions
Realtime HeatmapTracks time spent on sections + clicks. Peaks are focus areas. Based on 0 clicks and 0s of scrolling.
You
Others

Latest from the Blog

Read about how we build RedwoodSDK and help teams ship high-velocity software on Cloudflare.

A simple framework for humans. Server-first React, running on the Cloudflare platform. Simple to build. Easy to maintain. RedwoodSDK begins as a Vite plugin that unlocks SSR, React Server Components, Server Functions, and realtime features. Its standards-based router, with support for middleware and interruptors, gives you fine-grained control over every request and response. With built-in access to Cloudflare Workers, D1 (Database), R2 (Storage), Queues, AI, and full local emulation via Miniflare, development feels just like production.

Copyright © 2026 RedwoodJS Inc. All rights reserved.