Write an app in HTML, CSS and TypeScript. Ship a native executable.
No browser included.
Blitsen hosts a JavaScript engine directly and pairs it with
Blitz's
native HTML/CSS renderer. It does not embed Chromium, and it does not use the
operating system's WebView.
A dev dependency that acts as a native export toolchain. Your project's shape,
bundler and framework are not prescribed.
Four commands
sh
npx blitsen . # open index.html in a native window
npx blitsen http://localhost:5173 # point at a running dev server
npx blitsen doctor dist # check output against the compatibility profile
npx blitsen build # one executable: runtime + application
With no directory, running and building both read the blitsen config in
package.json, run the configured build command and take its output
directory. --target builds for another platform, fetching and caching
its runtime.
What it is not
Blitsen is not a browser and does not aspire to be one. Three consequences,
none of them accidental.
It renders less of the web than a browser does
That is the trade: a renderer you ship and control, at a size that is not
absurd, against specification coverage. An application targeting Blitsen is
authored against Blitsen, not ported blind from the web.
An application is trusted native software, not an untrusted document.
No same-origin policy, no permission prompts.
It is not for third-party web content
Rendering arbitrary pages you did not write is a browser engine's job.
Use one for that.
An unimplemented API is absent
The property does not exist, so feature detection works. Never a stub that
resolves to nothing, never a silent no-op.
That is enforced rather than reviewed. The API manifest is parsed out of the
runtime source, and a test asserts every API the manifest calls absent is
genuinely undefined against a real bridge context. The
compatibility profile is generated from
the runtime rather than hand-maintained, and blitsen doctor reports
what a bundle uses that the runtime lacks before you hit it at runtime.
Measured, not estimated
Every size figure in this project comes from a measured build. The tracked
baseline lives in the repository and CI fails on growth beyond 2%.
A release-build “hello” window on Ubuntu x64 (Ryzen 9 5900X, X11), against
Electron 43.4.0 and Tauri 2.11.5.
Runtime
Disk
Idle CPU
Idle memory (PSS)
Electron
339.4 MB
0.2%
284.3 MB
Tauri
4.7 MB
<0.1%
191.9 MB
Blitsen
38.8 MB
0.1%
101.0 MB
Medians of five runs after a five-second warm-up. CPU is the whole process tree
over ten seconds, where 100% is one core; disk is the packaged app's apparent
size. Tauri's figures include its host and WebKit processes, and its disk figure
excludes the system WebKitGTK it uses. Electron ships Chromium; Blitsen ships its
renderer and JavaScript engine.
38.1 MBStandalone Pong export, down from 144.7 MB once the runtime
replaced a bundled copy of Bun. The whole download — the JavaScript engine is
statically linked, not shipped beside it.
0.809 msMedian frame cost against a 16.7 ms budget, with the
windowed export sustaining 60 fps.
M3 evidence →
6 appsWritten by other people — React, Vue 3, Svelte and the three
stock create-vite templates — rendered from their own unmodified
vite build output. All six failed when first measured.
M3b evidence →
Rendering real applications
Shadcn
Admin (MIT), unmodified, rendered without a browser engine. The empty chart
panel is Recharts SVG —
tracked
upstream.
Every frame is HTML and CSS laid out by Blitz and mutated from JavaScript — the
paddles, the ball and the scoreboard are ordinary DOM nodes. The recording comes
from the same harness the acceptance gate asserts on, so it cannot drift from
what the tests verify.
Past what a browser can answer
examples/hardware is a CPU-Z-shaped report on the machine it is running
on: processor and per-thread load, memory and swap, every mounted volume, kernel
and boot time.
None of it has a web spelling — the closest the platform comes is
navigator.hardwareConcurrency, one deliberately coarsened number. It is
read through blitsen/os,
and it is three files with no build step.
Documentation
Generated from the markdown in the repository, so it cannot drift from the source.