Skip to content
React SSR Framework

Lightweight React SSR

SSR, streaming, file-based routing, and built-in state management. Powered by Vite 7. Everything you need to build fast React apps, nothing you don't.

Everything you need.
Nothing you don't.

Familiar patterns from Next.js and Remix, without the complexity. A focused SSR framework that stays out of your way.

Streaming

Progressive loading, out of the box

defer() and <Await> stream data through React Suspense boundaries. No full-page spinners.

Routing

File-based, convention-driven

page.tsx, layout.tsx, head.tsx, loader.ts — patterns you already know.

State

Built-in store with SSR sync

defineStore() with Immer mutations and automatic server/client serialization. Zero extra deps.

No RSC

Regular React components

Standard components with data loaders. No mental model split between server and client.

Portable

Standard Express + Vite

No framework lock-in. Your server is Express, your build is Vite. Everything stays portable.

SSG

Static generation, per route

Export config = { render: 'static' } on any page. Zero-config static generation.

Simple by design

A streaming page with data loading — in 20 lines. No magic, no hidden abstractions.

app/home/page.tsx
import { defer } from '@paretojs/core'
import { Await, useLoaderData } from '@paretojs/core/client'
import { Suspense } from 'react'

export const loader = async () => {
  return defer({
    posts: fetchPosts(),
  })
}

export default function Home() {
  const { posts } = useLoaderData()

  return (
    <Suspense fallback={<PostsSkeleton />}>
      <Await resolve={posts}>
        {(data) => <PostList posts={data} />}
      </Await>
    </Suspense>
  )
}

Start building.

Get a streaming React app running in under 5 minutes. No boilerplate, no ceremony.