Installation
Effuse applications can target the browser only or ship as full-stack applications with SSR and server APIs.
Requirements
Node.js 22 or later, or a current Bun release for the Bun server adapter
pnpm 10 or later
TypeScript 5.9 or later
Create the package set
Install only the capabilities your application uses:
pnpm add @effuse/core @effuse/router
pnpm add @effuse/store @effuse/query @effuse/i18n @effuse/ink @effuse/use
pnpm add @effuse/server
pnpm add -D @effuse/cli @effuse/compiler typescript
@effuse/server belongs in server entry points. Do not import it from browser
components. Portable server contracts such as route definitions, middleware,
request schemas, and caches are exported by @effuse/core.
Scripts
{
"scripts": {
"dev": "effuse dev",
"build": "effuse build",
"typecheck": "effuse typecheck",
"manifest": "effuse manifest"
}
}
Browser entry
// src/main.tsx
import { createApp } from '@effuse/core';
import { installRouter } from '@effuse/router';
import { App } from './App';
import { router } from './router';
installRouter(router);
createApp(App).mount('#app');
// src/App.tsx
import { define } from '@effuse/core';
import { RouterView } from '@effuse/router';
export const App = define({
template: () => <RouterView />,
});
Router
// src/router.ts
import { createRouter, createWebHistory, defineRoutes } from '@effuse/router';
import { HomePage } from './pages/Home';
const routes = defineRoutes([
{ path: '/', name: 'home', component: HomePage },
] as const);
export const router = createRouter({
history: createWebHistory(),
routes,
});
Full-stack entry
Add routes under src/server/api and use an Effuse build preset:
pnpm effuse build --preset node
# or
pnpm effuse build --preset bun
The CLI also accepts vercel, netlify, and cloudflare build presets. Check
the generated output and adapter capability matrix before deployment because
provider runtime support can differ from the Node and Bun reference adapters.
TypeScript
Use the automatic JSX runtime:
{
"compilerOptions": {
"jsx": "react-jsx",
"jsxImportSource": "@effuse/core",
"moduleResolution": "Bundler",
"strict": true
}
}
Keep browser code on @effuse/core or @effuse/core/client. Server entries may
use @effuse/core/server when an explicit server-only boundary is useful.
Next Steps