
Ships islands,
not bundles.
Chevalier is a small, file-routed Deno meta-framework that renders with Preact. A page with no islands ships zero client JavaScript.
$
deno run -Ar jsr:@chevalier/init my-app// app/routes/index.tsx → GET /
import Counter from "../islands/counter.tsx";
export default function Home() {
return (
<main>
<h1>Chevalier</h1>
<Counter start={3} /> {/* the only JS shipped */}
</main>
);
}File-based routing
routes/index.tsx → /, blog/[slug].tsx → /blog/:slug, docs/[...rest].tsx catch-all. Familiar conventions, no config.
Per-page islands
Each page ships only the JS for the islands it actually rendered. No islands, no <script>.
Split hot-reload
Islands hot-update in place with state preserved. Route and layout edits force a full reload.
Hono all the way down
The HTTP layer stays Hono. Any route file can export const app to serve any method, as a sub-app.
Tailwind v4
Scaffolds with Tailwind wired for dev and production — utility classes work in pages and islands.
Deno-native
JSR package, Vite dev server, no package.json.