Alpha

The native-first framework for modern web apps.

A high-performance, zero-VDOM framework that compiles JSX to native DOM. Built with signals and standard Web Components.

$npm create @opentf/web@latest my-app

How an update propagates

No virtual tree, no reconciliation pass. A change writes only to the DOM nodes bound to it.

Cart.jsx — preview
qty
price
subtotal
tax
total
coupon
Live DOM
Qty2
Price$9.00
Subtotal$18.00
Tax (10%)$1.80
Total$19.80
Coupon

Runtime performance

Our runtime against the React, Solid and Svelte 5 libraries. Median ms over 3 pooled runs, 4× throttled; lower is better.

Operationotfwreactsolidsvelte
create 1,000 rows261.1274.1244.3257.6
create 10,000 rows2627.83338.62542.22548.8
append 1,000 to 1,000295.8286.1270.1267.4
update every 10th (1k)91.893.8108.992.5
swap 2 rows (1k)33246.431.131.3
select row (1k)26.127.33029
remove row (1k)40.439.937.536.1
clear 10,000 rows178.6260.9164165.3

Bold beats the ~8.3 ms timing resolution; the rest are ties. Method & caveats →

Build cost

Building a static site, not serving one — against Astro, Next.js, TanStack Start and Vite. Peak memory and wall time; lower is better.

Metricotfwastronexttanstackvite
Peak build memory (MB)1404161226510260
Build time (s)0.31.23.820.8

The columns do not represent equal work. Method & caveats →

Capabilities & roadmap

What ships today, and what is planned next.

Client Rendering (CSR)Supported

Compiler-driven SPA engine.

Core
Zero-VDOM updatesSupported

Direct DOM operations, no diff.

Core
Reactive macrosSupported

$state, $derived, $effect, $context on fine-grained signals.

Core
Refs & exposeSupported

$ref to elements; imperative $expose.

Core
Context APISupported

Scoped DI with createContext, ContextProvider, and $context — no prop drilling.

Core
PortalSupported

Render a subtree into another DOM target; context resolves across the boundary.

Core
File-based routerSupported

Directory routing with client-side navigation.

Routing
Nested layoutsSupported

Persistent UI across route changes.

Routing
Route guardsSupported

Protect routes with custom logic + redirects.

Routing
Code splittingSupported

Per-route lazy chunks in `otfw build`; dev compiles a route on first visit.

Routing
Route prefetchPlanned

Preload route chunks on hover or when a link enters the viewport.

Routing
Static generation (SSG)Supported

Pre-render routes to HTML at build time.

Rendering
MDXSupported

MDX pages and components; docs theme included.

Rendering
Server rendering (SSR)Supported

Per-request HTML via otfw serve — the same render path as SSG.

Rendering
HydrationSupported

First paint adopts the server DOM — pages, layouts, lists, conditionals, and islands with rich props.

Rendering
create-web scaffolderSupported

App, Docs, or Library templates — JS/TS, auto-install, npm-pinned deps.

Tooling & DX
Dev server + reload on savePartial

On-demand per-route compile. Edits under app/ rebuild and trigger a full-page refresh — not module-level HMR.

Tooling & DX
Module-level HMRPlanned

Hot-swap changed modules in place without reloading the tab.

Tooling & DX
Dev error overlaySupported

In-browser error reporting during dev.

Tooling & DX
Testing librarySupported

Component testing utilities.

Tooling & DX
TypeScript / TSXBeta

Scaffold .tsx projects with tsconfig and macro typings; full editor tooling in progress.

Tooling & DX
Devtools extensionPlanned

Component, state, and network inspection.

Tooling & DX
Tailwind CSSSupported

Compiled by the toolchain — no extra config.

Styling
Scoped CSS ModulesSupported

Component-scoped class names.

Styling
MiddlewareSupported

app/_middleware.js gates pages, API routes, loader data, and SSR — context.locals shared downstream.

Full-stack
Cookie helpersSupported

getCookie / setCookie / deleteCookie on @opentf/web/server — RFC 6265 helpers for middleware, API routes, and loaders.

Full-stack
Reactive formsBeta

@opentf/web-form — porting to the new runtime.

Full-stack
API routesSupported

File-based route.js / route.ts endpoints — standard Request/Response and dynamic params.

Full-stack
Data fetchingSupported

Route loaders (loader.js → router.data across SSR/SSG/SPA) + client-side resource(); queries and actions planned.

Full-stack
InternationalizationBeta

@opentf/web-i18n — URL-prefix locale routing, ICU messages, and Intl formatters (Phase 1).

Full-stack
Accessibility helpersPlanned

ARIA helpers and a11y defaults.

Full-stack

Start building

Scaffold a project and follow the guides from an empty directory to a compiled app.