Single-file components.
Markup, script and style in one .html file. Nothing rewrites your code.
no compiler·no virtual DOM·no build step
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.
The component is the file. Save counter.html and the browser runs it byte-for-byte — reactive, scoped, untouched. Nothing else does that.
npx create-spark-html-app
<div import="https://cdn.jsdelivr.net/gh/wilkinnovo/
spark/website/public/components/url-card.html">
</div>
● live — fetched from a CDN, no bundler
This whole component is a plain .html file on a CDN — no bundler touched it.
<h2>Count: {count}</h2> <button onclick={inc}>+1</button> <script> let count = 0; function inc() { count++; } </script>
● live — the actual component
What's in Spark
Markup, script and style in one .html file. Nothing rewrites your code.
A change re-evaluates only the bindings that read it — not the page.
Named stores let any two components share state. No providers.
<template route> + router(). Active links and a route store, free.
Real HTML per route at build time. No SSR server, no app changes.
theme() — dark / light / system, persisted, no flash.
Use it — no build required
<script type="importmap"> { "imports": { "spark-html": "https://esm.sh/spark-html@0.22" } } </script> <script type="module"> import { mount } from 'spark-html'; mount(); </script>
<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 (npx serve) — no npm, no bundler, no compiler. Read the docs →
Built with Spark
View all →