Bun-Powered Performance
Built from the ground up for Bun's runtime, leveraging its blazing-fast bundler, server, and native TypeScript support.
Built on Bun for speed, simplicity, and developer experience
Create a new EreoJS project:
bunx create-ereo@latest my-app
cd my-app
bun devNew to EreoJS? Follow the Getting Started guide to build your first app.
Coming from another framework? Jump to the migration guide for Next.js, Remix, or Express.
Looking for a specific topic? Browse the Guides for practical how-to articles or the API Reference for detailed API docs.
Want to understand the architecture? Read the Core Concepts to learn how EreoJS works under the hood.
EreoJS combines the best ideas from modern React frameworks while staying true to web standards and keeping things simple:
| Feature | EreoJS | Next.js | Remix |
|---|---|---|---|
| Runtime | Bun | Node | Node/Bun |
| Bundler | Bun | Webpack/Turbopack | esbuild |
| Islands | Native | Manual | Manual |
| Data Loading | Loaders | Server Components | Loaders |
| Caching | Tag-based | ISR/Cache | Manual |
| Forms | Progressive | Client-only | Progressive |
// app/routes/posts/[id].tsx
import { createLoader, createAction } from '@ereo/data'
export const config = {
render: 'ssr',
cache: { tags: ['posts'] }
}
export const loader = createLoader(async ({ params }) => {
const post = await db.posts.find(params.id)
return { post }
})
export const action = createAction(async ({ request }) => {
const formData = await request.formData()
await db.posts.update(formData.get('id'), {
title: formData.get('title')
})
return { success: true }
})
export default function Post({ loaderData }) {
const { post } = loaderData
return (
<article>
<h1>{post.title}</h1>
<p>{post.content}</p>
</article>
)
}