Fluixi compiles your JSX to fine-grained DOM updates on a TC39-Signals core — then gives you SSR, streaming, SSG, server functions, routing, DI and i18n in one coherent stack.
npm create fluixi@latestfunction Counter() {
const [count, setCount] = createSignal(0);
const doubled = createMemo(() => count() * 2);
return (
<button onClick={() => setCount(c => c + 1)}>
{count()} · {doubled()}
</button>
);
}One framework, from the signal graph to the edge.
A TC39-Signals graph updates exactly the DOM that changed — no virtual DOM, no diffing, no re-renders.
JSX compiles straight to imperative DOM calls. You ship the work, not a runtime that re-discovers it.
Request-scoped server rendering with web-stream output and seamless hydration — isolated per request.
Set `prerender` and `fluixi build` crawls your routes to static HTML — this very page is SSG.
Routes from the filesystem, nested layouts, lazy loading, data loaders — with a framework-agnostic core.
`"use server"` turns a function into a typed RPC; forms get progressive-enhancement actions.
Drop a handler in `src/api/**` for `/api/*`; a middleware chain runs before every render.
Angular-style dependency injection, built-in typed i18n, and an HTTP interceptor pipeline.
Partial hydration for mostly-static pages, and an edge-safe server that runs on Workers, Deno and Bun.
One command scaffolds an SPA or an SSR app, in JSX or JSX-free html`` templates. Both compile to the same fine-grained DOM calls, so you can even mix them in one file.
--jsx or --html · --spa or --ssrjsx in tsconfig — plain .ts files@fluixi/ts-plugin, wired in for younpm create fluixi@latestimport { html } from "@fluixi/core";
// No JSX, no tsconfig changes — plain .ts, same compiled output.
function Counter() {
const [count, setCount] = createSignal(0);
return html`
<button @click=${() => setCount(c => c + 1)}>
count: ${count()}
</button>
`;
}Mark a function "use server" and the compiler strips its body from the browser, leaving a typed RPC stub. Secrets, database calls and your API keys never ship to the client.
/api/*// runs only on the server — the body is stripped from the client bundle
async function getUser(id: string) {
"use server";
return db.users.find(id); // secrets stay server-side
}
// call it from anywhere like a normal async function:
const user = await getUser("42");The Fluixi Playground compiles JSX in your browser and renders the live dependency graph — watch state, memos, stores and effects light up as they propagate.
Try the Playground →