Chevalier mascot

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.