no compiler·no virtual DOM·no build step

HTML that reacts.
Built for humans.

Import a component straight from a URL — no install, no bundler. The browser fetches the .html and boots it live. Components are just files, anywhere. Nothing else does that.

$bunx create-spark-html-app@latest

CPU speed — vs hand-written vanilla JS (geomean, lower is better)

vanilla js 1.00×
spark-html 1.19× ⚡ no build
vue 1.31×
angular 1.45×

krausest js-framework-benchmark, paired local run, spark-html 1.8 — past Vue (1.31), and the only one here with no compiler and no build step. Run memory holds ~1.45× vanilla; in-place state mutation is the fast path. method & full table

“Spark-html is what web frameworks could've been if we didn't spend 21 years bolting JS frameworks on top of HTML instead of just reading the HTML.” — Anon9

“The scanner-not-parser tradeoff is the real genius: no compiler means no build step, and the runtime learns the dependency graph by observing what each expression reads during evaluation. It turns the "no compiler" constraint into a self-adapting system.” — Anon10

“Self-healing compiled functions, three-tier expression evaluation, column sweeps for keyed rows, dirty-item tracking for deep mutations — most frameworks pick one reactivity strategy. Spark layers four of them and lets the runtime choose, all hidden behind {name} and each="item in items".” — Anon11

“Dependency sets that only grow, a runtime that drops and rebuilds its own fast paths on failure — closer to biological memory than cache invalidation. It observes, learns, remembers, and heals.” — Anon12

<div import="https://cdn.jsdelivr.net/gh/wilkinnovo/
  spark-html/website/public/components/url-card.html">
</div>

● live — fetched from a CDN, no bundler

fetched from a URL · rendered at 2:43:37 AM

This whole component is a plain .html file on a CDN — no bundler touched it.

0 build step ~18kb runtime 0 dependencies 1650+ tests 22 packages

Why Spark

AI writes more of the web every day. Spark is for the people who still love writing it themselves — view-source romantics, hand-crafters, the ones who want to understand every line they ship. So it gets out of your way: no compiler rewriting your code, no virtual DOM between you and the page, no build step between you and the browser. The HTML you write is the app that runs.

What's in Spark

Single-file components.

Markup, script and style in one .html file. Nothing rewrites your code.

Surgical reactivity.

A change re-evaluates only the bindings that read it — not the page.

Shared stores.

Named stores let any two components share state. No providers.

Declarative router.

<template route> + router(). Active links and a route store, free.

SEO prerender.

Real HTML per route at build time. No SSR server, no app changes.

Full-stack SSR.

spark-ssr: the template is the backend — inferred database, REST, auth & hydration. No server file. SSR docs →

One-line theming.

theme() — dark / light / system, persisted, no flash.

Use it — no build required

1 Load Spark from a CDN
<script type="importmap">
  { "imports": {
    "spark-html": "https://esm.sh/spark-html@1"
  } }
</script>

<script type="module">
  import { mount } from 'spark-html';
  mount();
</script>
2 Import a component — even from a URL
<div import="components/card"></div>

<!-- …or straight from anywhere -->
<div import="https://cdn.jsdelivr.net/
  gh/you/repo/card.html"></div>

Serve any static folder (bunx serve) — no install, no bundler, no compiler. Read the docs →

Built with Spark

View all →