Zero JavaScript, by default
Static pages ship no client-side JavaScript unless a component is explicitly marked as an island.
Avalon is a full-stack JavaScript framework for islands architecture and partial hydration. Create server-rendered sites with the UI frameworks you already use, and deploy with Nitro.
bun create avalonPages render to HTML on the server. Interactive components opt into hydration individually through the island prop, and Avalon loads their JavaScript on your chosen condition. The rest of the page stays static.
Avalon's architecture is designed around the metrics that matter.
Each island compiles through its own renderer and ships as its own chunk. Mixing frameworks on one route means multiple runtimes and more total JavaScript than a single-framework page — useful when you need components from different ecosystems, not automatically a smaller bundle.
Built-in strategies for common patterns. Custom directives for everything else.
Hold the island's JavaScript until the component scrolls into view, then hydrate.
Best forCharts, carousels, anything below the fold.
Avalon builds on Nitro. The same codebase ships to Node, Bun, Deno, Cloudflare, Vercel, Netlify, AWS, and Azure.
Pages and layouts render server-side with Preact. JSX authoring, 3KB runtime, hooks API. The same component model you already know.
Instant HMR in development. Production builds with per-island code-splitting. Vite 8 environment API for SSR.
Universal server engine. API routes, middleware, edge deployment. One codebase, any JavaScript runtime.
A full-stack JavaScript framework built around islands architecture and partial hydration. Pages render as HTML on the server, interactive components hydrate as islands, and deployment runs through Nitro to supported runtimes.
Run bun create avalon, follow the quick start, and add the island prop when a component needs interactivity.
Most marketing and content pages need little or no client-side JavaScript. Hydrating only islands limits what ships to the browser and can improve Core Web Vitals compared with hydrating the entire page.
When only some of the page needs to be interactive. Mark those components as islands and the rest stays HTML, with no client JavaScript.
Beyond islands and hydration — the full toolkit.
Static pages ship no client-side JavaScript unless a component is explicitly marked as an island.
Each island hydrates independently. Static regions never load a runtime.
Use any combination in the same project.
│The filesystem is the router. No config.
HTML arrives in chunks. First byte is near-instant.
{ "id": 42, "name": "Ada" }Server endpoints alongside your pages. Full request access, typed params, any backend resource.
Modern formats, no layout shift, built-in.
Auth, redirects, logging — scoped or global.
Deploy to any Nitro target. One build, every runtime.
Zero config. One command: bun create-avalon.