You know Next.js. You know file-based routing, layouts, loaders, SSR. You probably also know the pain: server components vs client components, the "use client" dance, mysterious hydration errors, and a 233 KB client bundle before you write a single line of app code.
What you give up
Transparency matters. Here's what Pareto doesn't have:
Server components — No RSC, no"use client". This is by design: the loader pattern is simpler and covers 95% of use cases.
Image optimization — No<Image>component with automatic resizing. Use standard<img>with a CDN.
ISR / Static generation — Pareto is SSR-only. NogenerateStaticParams(), no build-time rendering. If you need static pages, pair with a static site generator.
Middleware — No edge middleware concept. Use Express middleware inconfigureServer()instead.
Vercel integration — No one-click deploy. You deploy a standard Node.js server.
Ecosystem size — Smaller community, fewer examples. You're early.
If you're building a content-heavy marketing site with ISR, Next.js is still the right call. If you're building a data-driven app where performance and simplicity matter, Pareto is worth the switch.
Migration checklist
npx create-pareto@latest my-app— scaffold a new project- Move your routes from
app/— file structure is nearly identical - Extract
asyncserver components intoloader.ts+ standard component - Replace
"use client"directives — they're not needed, just delete them - Move
generateMetadatatohead.tsxcomponents - Replace
loading.tsxwithdefer()+<Await>for streaming - Replace
next/linkwithLinkfrom@paretojs/core
- Move Webpack config to
configureVite()inpareto.config.ts
- Deploy as a standard Node.js server
npx create-pareto@latest my-app
cd my-app && npm install && npm run dev
SOCIAL SHARE CARD GENERATOR