About
Skrapa exists because most static sites don't need a toolchain, a virtual DOM, or a hydration step. They need just markup, a few interactive bits, and plain HTML to ship.
All too often I wanted to spin up a simple static site and found the usual stack (Vite + React + TypeScript + a pile of config) to be total overkill. I didn't need client-side routing or a runtime in the browser. I just wanted to write some markup, get a few interactive bits, and ship plain HTML.
Skrapa is the result. It keeps the one thing I actually missed (writing layout as JSX in TypeScript) and throws out the rest. Pages compile to static HTML at build time with their client JS bundled into standalone files, so there's no framework and no runtime in the browser. A dev server with live reload keeps the feedback loop tight while you work.
I built it for myself and still use it daily: my personal site, Sordle, throwaway prototypes, quick dashboards, and one-off reports. If you've ever wanted a static page without booting up an entire toolchain to get there, it might suit you too.
What it does
- A custom JSX runtime that renders to HTML strings at build time
- File-based routing: every
src/**/index.tsxthat exportsPagebecomes a route - A dev server with live reload over WebSocket on every file change
- An assets directory copied straight through to the output
- A built-in bundler that resolves each
client.tsrequire graph into one standalone file, and bundles Skrapa itself the same way
All of it ships as a single script with no dependencies, importing nothing but Node builtins. npx fetches it on demand, so it never becomes a dependency of the site it builds. The one thing it doesn't do itself is compile TypeScript, which it hands to your local tsc.
For the full mechanics (the HTML shell, the Page type, client script and stylesheet resolution), see the docs.