MEASURED

Performance

Numbers, not adjectives. Every figure on this site is enforced by a test in the repository — a gate that fails the build if it ever stops being true — so the docs can quote it without re-measuring. And the things no benchmark measures are listed too.

The size gates

GATE (ENFORCED IN CI)MEASUREDBUDGET
compiled counter app, all-in (bundle + min + gzip)1982 B≤ 2048 B — the 2 KB promise, measured the way frameworks quote size
runtime minus the template parser, bundled2520 B≤ 2560 B
no-build app, parser included4020 B≤ 4096 B
compiled bytes ÷ hand-written vanilla bytes1.090≤ 1.10 — the identity benchmark

The last row is the point of the project: compiled output costs under 10% more than the DOM code a person would write by hand. Headroom is small on purpose — the next feature touching the runtime has to pay for itself in architecture, not bytes.

DOM-work parity

A second gate matters more than bytes. The test suite proves AmoJS emits exactly the DOM mutations a hand-written vanilla app does — on create, update, churn, toggle, append, prepend, remove and clear — by recording mutation order, not just counts. Writing a signal with the value it already had produces zero DOM work. List moves are minimal: a swap costs 2 moves, a reverse n−1, a rotate 1.

Against the nearest neighbour

Lit shares the technique — tagged templates, no build required, cloned templates with positional paths — so the comparison isolates the update model. When one of five bindings changes, AmoJS evaluates one expression and Lit evaluates five (it re-runs the template function and dirty-checks every part); on churn, zero versus five; when all five change, five versus five, a genuine tie. DOM mutations tie in every row — Lit's per-part comparison is good. For the same app (a card, five bindings, a listener, a keyed list), AmoJS ships 2336 bytes to Lit's 6890, with Lit measured bare, in its smallest configuration.

Where it is slower

On pure reactive-graph micro-benchmarks the signal core sits roughly 6× behind alien-signals and Vue's Vapor reactivity. That is invisible behind real DOM work, and it is true; their linked-list core is the known option if a rewrite ever pays.

What the numbers do not measure

Ecosystem, tooling maturity, production hardening, vendor buy-in — all of which the established frameworks have and this does not. Being the fastest is not the goal: the differentiator is the authoring surface — standard .js that runs with no build, twelve names, no class, decorator, JSX or file format, and output you can eject and keep.