Introduction
Chevalier (knight in French) is a small, file-routed Deno meta-framework that renders with Preact and ships islands, not bundles.
It keeps Hono for the HTTP layer and brings a Preact view layer. A page with no islands ships zero client JavaScript. Adding an island never grows a page that doesn't use it.
// 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 this page ships */}
</main>
);
}Features
- File-based routing.
routes/index.tsx→/,blog/[slug].tsx→/blog/:slug,docs/[...rest].tsxcatch-all. Familiar conventions, no config. - Per-page islands. Each page ships only the JS for the islands it actually rendered. No islands, no
<script>. An island is declared by path, never a wrapper in your code. - Split hot-reload. Islands hot-update in place with state preserved (Preact Fast Refresh). Route and layout edits force a full reload.
- Hono all the way down. The HTTP layer stays Hono. Any route file can
export const appto serve any method, as a Hono sub-app. - Tailwind v4. Scaffolds with Tailwind wired for dev and production — utility classes work in pages and islands out of the box.
- Deno-native. JSR package, Vite dev server, no
package.json.
Alternatives
Chevalier is inspired by these. Reach for them if they fit better.
- HonoX. The closest shape. File routing and islands on Hono, with its own view layer instead of Preact.
- Fresh. The Deno-native standard. Islands, file routing, and zero client JS by default, rendered with Preact.
Stability
Chevalier is pre-1.0; the API can change between releases. Every release is recorded in the changelog, which also states the stability policy. Pin an exact version and read the entry before upgrading.