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.
Progressive loading, out of the box
defer() and <Await> stream data through React Suspense boundaries. No full-page spinners.
File-based, convention-driven
page.tsx, layout.tsx, head.tsx, loader.ts — patterns you already know.
Built-in store with SSR sync
defineStore() with Immer mutations and automatic server/client serialization. Zero extra deps.
Regular React components
Standard components with data loaders. No mental model split between server and client.
Standard Express + Vite
No framework lock-in. Your server is Express, your build is Vite. Everything stays portable.
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.
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.