The JustHTML Methodology

This is not a framework

No package to install. No CLI. No config file. No npm. This is a methodology — a way of building web apps that uses the platform directly. The tools are HTML, CSS, and JavaScript. They came with the browser. You already have everything you need.

Why now is the right time for this

React, Vue, Svelte, Angular, Next.js — every one of them is a JavaScript framework. And JavaScript is exactly what every browser has always understood natively. Frameworks were never magic. They were scaffolding — tools to help large teams produce consistent JavaScript at scale.

Here's what changed: AI coding assistants write that same JavaScript directly. The same event handlers, the same DOM updates, the same fetch calls — with no framework in between. You describe what you want. Your AI writes vanilla JavaScript that drops straight into an HTML file and runs immediately. No virtual DOM. No build step. No 800-package install.

Frameworks solved a team-scale problem. AI solves it differently. And for solo developers and small teams, it solves it better.

The stack

Three things. That's it.

  • A backend server — any language. C#, Rust, Python, Go, PHP, Node (even). Its only job: read HTML files, assemble them, serve the result.
  • HTML files — your layout, your partials, your page content. Not JSX. Not .vue. Just HTML.
  • A browser — which you already have.

The backend language is irrelevant. The pattern is identical in every language: one layout file, a handful of placeholder tokens, and a function that reads files and calls replace(). That's the entire engine. You can write one in an afternoon.

How the template engine works

A template is a string with placeholders. Your server reads an HTML file, replaces the placeholders with real values, and sends the result. This is how the web worked before virtual DOMs were invented. It still works. It works great.

wwwroot/
├── layout.html        ← full page shell with {{HEADER}}, {{CONTENT}}, {{FOOTER}}
├── header.html        ← shared nav — change once, updates everywhere
├── footer.html        ← shared footer
└── pages/
    ├── index.html     ← home page content only
    ├── about.html     ← about page content only
    └── 404.html       ← not found page

Page files contain only their inner content. The layout wraps them automatically. Add a page by dropping a file in the folder — no routes to register, no config to touch.

This site is built exactly this way. The engine is about 20 lines of C#.

See a full working example with code →

Components, state, and routing — without a framework

Components are CSS classes and partial HTML files. A .card class on a <div> is a component. A header.html file included by your server is a component. JavaScript modules attached to [data-component] attributes are components. You don't need React to have components — you need consistent naming.

State lives on the DOM. data- attributes hold UI state — open, closed, loading, selected. element.dataset.value reads it. element.dataset.value = 'new' writes it. For anything more complex, ask whether a server round-trip would actually be cleaner. It usually is.

Routing is your backend's job. A GET to /about returns the about page. A POST to /contact processes a form. This is how HTTP was designed. Client-side routing exists as a workaround for apps that don't want to make server requests — but if you have a server, use it. URLs are free.

Build tools — you don't need them. CSS custom properties replace SCSS variables. ES modules handle imports natively. fetch() handles AJAX. Minification belongs at the CDN or reverse proxy layer, not in your development workflow.

AI and this methodology

This is where things get interesting.

AI coding assistants default to what's common — React, npm, Vite — because that's what most training data contains. One instruction changes that. At the start of every session:

"We are building with vanilla HTML, CSS, and JavaScript. No npm. No React. No frontend build tools. The backend is [language] and serves HTML from template files. Use the browser's native APIs only."

AI tools are obedient. They write exactly what you describe. Ask for a live search, a modal, a form validator, a dynamic table — you get clean vanilla JavaScript that drops straight into your wwwroot folder and runs immediately. Same functionality. Same look and feel. None of the framework weight.

The CLAUDE.md file included with BasicSiteServer encodes these instructions permanently, so you never have to repeat them. Every session starts with the same clean contract.

Get started with a working server

BasicSiteServer is a production-ready starter kit that implements everything on this page — in C# and in Rust. Same architecture, same wwwroot structure, same layout engine. Both editions included in one download.

Get Basic Site Server →

Or walk through the template engine in detail first:

HTML Templating: The Backend Doesn't Matter →

Learn