Building websites
like it's 1997.

A Bun-native web framework that trusts the platform. File-based routing, zero build steps, HTML that works, JavaScript that ships.

The web platform is enough.

Stop fighting your framework. Start shipping.

Zero Config

The file is the route. Drop about.phtml in your pages directory, get /about. No router setup, no config file, no thinking.

🌐

Web Platform First

HTML forms, HTTP verbs, browser APIs. index97 doesn't invent new abstractions — it makes the ones you already know work beautifully.

🐇

Bun Native

SQLite, password hashing, markdown rendering, file serving, WebSockets — all built in. Zero extra dependencies to manage.

🔥

Hot Reload

SSE-based HMR that re-stamps CSS without a page reload. See your changes instantly — inspired by Bret Victor's "seeing space."

📐

Layouts & Slots

Named slots with default values. Layout data providers. Per-directory layouts. Everything composes cleanly without magic.

Just JavaScript

ES modules, async handlers, no transpilation step. Export a GET function, return an object, done. It's that simple.

Drop a file. Get a route.

pages/ _layout.html index.phtml about.phtml blog/ index.js index.phtml [slug].js [slug].phtml public/ style.css
// blog/[slug].js
import { getPost } from './_db.js'

export async function GET(req) {
  const post = getPost(req.params.slug)
  if (!post) return new Response('', { status: 404 })
  return { post }
}
<!-- blog/[slug].phtml -->
<h1>{{post.title}}</h1>
<p>{{post.body}}</p>
<a href="/index97/blog">← Back</a>

Start building in seconds.

No front-end application templates to clone. Just Bun and a folder.