Static Site as Application Platform

Static Site as Application Platform

The Lesson

A full-featured application (quiz engine, progress persistence, scoring, results dashboards, 10 providers, 50+ exams) can be built with vanilla HTML, CSS, and ES6 modules — no framework, no build step, no server. This approach trades developer convenience (hot reload, component abstractions, state management libraries) for deployment simplicity (host anywhere, no CI/CD pipeline, no server costs) and eliminates entire categories of problems (build failures, dependency conflicts, framework version upgrades).

Context

The certification quiz site serves browser-based practice quizzes. It has:

All of this runs from static files served by any HTTP server.

What Happened

  1. The project started as a single HTML page with inline JavaScript for one Azure exam. No framework was chosen because the initial scope didn't justify one.
  2. As the application grew (quiz engine, progress tracking, results page), the code was split into ES6 modules. The browser's native import/export handled module loading without a bundler.
  3. When JSON Schema validation was needed, Ajv was imported from a CDN (esm.sh) rather than adding a build step. The vitest config aliases these CDN URLs to node_modules for testing.
  4. A design system (Atlas) was added as plain CSS files — tokens.css for variables, system.css for components. No CSS preprocessor, no CSS-in-JS.
  5. The application scaled to 10 providers, 50+ exams, 13 HTML pages, and 6 JS modules without ever introducing a build step, bundler, or framework.
  6. Deployment remained trivial throughout: push to GitHub Pages, done. No CI/CD pipeline, no environment configuration, no server provisioning.

Key Insights

Applicability

This approach works well for content-driven applications with limited interactivity per page (quiz apps, documentation sites, dashboards). It stops working when you need deep component composition, complex client-side routing, or real-time state synchronization across many components. A good heuristic: if you'd need more than ~10 JS modules or more than ~20 pages, evaluate whether a framework would reduce total complexity rather than add it.

Related Lessons