Blitsen

Pre-alpha · Linux x64 only

Blitsen

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.

sh
npm install -D blitsen

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.

The boundary, published as capability tiers →

There is no sandbox by default

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.
RuntimeDiskIdle CPU Idle memory (PSS)
Electron339.4 MB0.2%284.3 MB
Tauri4.7 MB<0.1%191.9 MB
Blitsen38.8 MB0.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 MB Standalone 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 ms Median frame cost against a 16.7 ms budget, with the windowed export sustaining 60 fps. M3 evidence →
6 apps Written 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 rendered by Blitsen
Shadcn Admin (MIT), unmodified, rendered without a browser engine. The empty chart panel is Recharts SVG — tracked upstream.
Pong running in Blitsen
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.

Specification

What Blitsen is meant to be, and how it is built.

The boundary

Blitsen renders less of the web than a browser does. This is where that line is drawn.

Using it

Getting an application in, and an executable out.

Decisions and evidence

Milestones are declared on measurements. These are the measurements.