Why index97 exists.

Every framework is a theory about what building for the web should feel like. This is mine.

The web platform is enough

At some point, the web development community collectively decided that HTML forms are bad, HTTP verbs are inconvenient, and the browser's built-in capabilities aren't good enough. So we built abstractions on top of abstractions to compensate.

index97 disagrees. HTML forms are good. HTTP semantics are meaningful. CSS is powerful. The browser is capable. The web platform has earned your trust — give it a chance before reaching for an abstraction.

Rule of thumb: If a browser can do it natively, index97 makes it easy. If a browser can't do it, index97 doesn't pretend it can.

The file is the unit of deployment

In 1997, you uploaded files. Each file was a page. The URL matched the file path. Everyone understood it immediately.

index97 restores that mental model. about.phtml is /about. blog/[slug].js is /blog/:slug. You never need to open a router config to understand where a URL goes — just look at the files.

Convention over configuration

Good defaults eliminate decisions. index97 establishes clear conventions so you spend time building features, not setting up infrastructure:

  • Files starting with _ are private (layouts, auth helpers, database modules)
  • Files wrapped in [brackets] are dynamic route parameters
  • _layout.html wraps everything in its directory and below
  • An index file maps to the directory root
  • A .js file with the same name as a .phtml is its data source

These conventions are obvious once you see them, and invisible once you know them.

Zero abstraction layers

index97 adds as little as possible between you and the platform. A request comes in as a standard Request object. You return a standard Response — or a plain object that gets merged with a template. No middleware chains to understand. No request lifecycle to memorize.

When something goes wrong, the stack trace points at your code, not at three layers of framework internals.

Explicit over magic

When data flows into a template, you see it. When a layout is applied, you know which file it came from. When a partial is included, the syntax makes it obvious. index97 doesn't do things behind your back.

The @ sigil for passing parent data to partials, the _method form override, the {{{triple braces}}} for raw HTML — every feature is intentional and visible.

Simplicity as a feature

Complexity has a cost. Every abstraction you add is something future-you or your teammates need to understand. index97 is deliberately small. You can read the entire source in an afternoon. You can understand what it does without a guide.

Simple systems are predictable. Predictable systems are reliable. Reliable systems ship.

Immediate feedback — Bret Victor's "seeing spaces"

The best creative tools show you what you're making while you're making it. index97's hot reload is SSE-based and file-aware: CSS changes re-stamp without a page reload, preserving your scroll position and application state. You see your design change as you type.

This isn't just developer experience polish — it changes how you think. When feedback is immediate, you experiment more. When you experiment more, you build better things.

The 1997 spirit

1997 was a specific moment on the web. Geocities. Hit counters. Guestbooks. Under construction GIFs. It was messy and chaotic and wonderful. Anyone could build anything. You didn't need a CS degree or a $10,000 laptop or a team of engineers. You needed Notepad and an FTP client.

index97 isn't nostalgic for the aesthetic — it's nostalgic for the accessibility. For the feeling that the web belongs to everyone. That you can have an idea in the morning and show it to people by afternoon.

I want that feeling back. I think index97 makes it possible again.

The goal: index97 should feel like you're working with the web, not around it. Every feature should make you feel more capable, not more dependent.