Blitz compared with this engine #
Blitz (https://github.com/DioxusLabs/blitz) read at commit 17de049 (2026-10-18), from
source, its README and its issue tracker; nothing of it was built or run. Blitz paths are
relative to its repository root. Claims marked inferred were reasoned, not read.
Side by side #
| Area | Blitz | This engine |
|---|---|---|
| DOM | blitz-dom: node arena, events, forms, accessibility (packages/blitz-dom/src/node/, events/) |
crates/dom (style.rs, node.rs, mutable.rs); a styled document is immutable (roadmap.md → "Realtime performance") |
| Style | Stylo 0.22; blitz-dom/src/stylo.rs implements selectors::Element and RecalcStyle; stylo_taffy TaffyStyloStyle maps computed values to Taffy styles |
Stylo =0.21.0, pinned with selectors 0.40 and html5ever 0.39 (Cargo.toml); glue adapted from Blitz (crates/dom/src/style.rs, style_data.rs); computed.rs reads properties as enums |
| Layout | Taffy (flexbox, grid, block, calc) plus hand-written inline (layout/inline.rs), tables (layout/table.rs) and replaced elements; floats behind the non-default floats feature (blitz-dom/Cargo.toml) |
Hand-written walk (crates/layout/src/fragment.rs Resolvers, FormattingContext Block / Inline / FixedTable) plus 15 generated functions in crates/layout/src/generated/ |
| Text | Parley 0.12: shaping, line breaking, bidi (stylo_to_parley.rs) |
No text layout; docs/text-metrics.md: line breaking can be voted on, proportional-font advances cannot (0 of 104 unanimous) |
| Paint | blitz-paint to anyrender: Vello (GPU or CPU), Skia, SVG |
crates/layout/src/bin/paint.rs: flat rectangles to PNG |
| Network | blitz-net (reqwest, HTTP cache, data URIs) |
None |
| Script | blitz-vibey-script on Boa 0.22, runs Preact (tests/preact.rs) |
None; linked subsystem (roadmap.md → "Layering", docs/js-engine-choice.md) |
| Embedding | Winit shell, Dioxus Native, browser app, WebAssembly (HOWTO_WASM.md) |
crates/webengine lay_out(), a C ABI (webengine_layout), WebAssembly |
Establishing correctness #
-
Blitz runs WPT
cssandsvgon every pull request and push (.github/workflows/wpt.yml,cargo run -rp wpt css svg), diffs againstmainand publisheswptreport.json. Its runner (wpt/runner/src/test_runners/) handles reftests (Vello renders at 800×600, compared with WPT's fuzzy tolerance,ref_test.rsprocess_ref_test),checkLayouttests (data-expected-*anddata-offset-*checked natively without script,attr_test.rs), testharness tests through Boa, and crash tests. Published scores (blitz.is/status/wpt, commit17de049):Scope Interop score Tests passing css overall 54.44% 52.57% (18492 of 35171) css-flexbox 86.31% 83.76% CSS2 73.71% 73.58% (4686 of 6368) css-text 71.04% 70.33% css-tables 58.74% 52.16% css-grid 56.66% 55.00% -
This engine measures per-box geometry in Chromium, Firefox and WebKit, takes the majority, and compares at 1/60 px (
roadmap.md→ "Verification strategy", "Geometry mapping"); WPT supplies inputs, never expected outputs (roadmap.md→ "Decisions"). Current numbers (docs/geometry-verification.md→ "Current numbers"): recipe corpus 227 of 227, held-out WPT normal-flow pages 7 of 7 (only 7 of 1056 pages have no text), grammar corpus 61 of 164. Generated functions on their own corpora, for example floats 109 of 109 and absolute positioning 82 of 108 (docs/generated-functions.md).
Coverage #
| Feature | Blitz | This engine |
|---|---|---|
| Block | Taffy compute_block_layout |
Width, margin, height and percentage generated functions |
| Inline and text | Parley; direction block-level only |
Atomic inlines at font-size: 0 only (generated/inline_atomic.rs) |
| Floats | Supported behind a feature flag | Placement generated (generated/float.rs), structure hand-written |
| Positioning | static, relative, absolute, fixed; sticky in progress | Relative, absolute, containing block (fixed included); fit-content, max-content and mixed calc() reach generated functions as Unresolved (docs/feature-to-function-design.md) |
| Flex | Taffy | None; after text in roadmap.md → "Next" |
| Grid | Mostly; no subgrid (taffy#468) | None |
| Tables | Emulated on Taffy grid (table.rs impl taffy::LayoutGridContainer for TableTreeWrapper) |
Fixed layout only |
| Other | Writing modes partial; transforms and paint effects | 2D transforms, stacking order, overflow, aspect-ratio, box generation as generated functions |
Performance and size #
Blitz publishes no performance or size figures (issues #255 "Tracking: Optimizations"
and #286 "Excessive Memory Usage" carry none); its lockfile holds 986 packages against
328 here. This engine: 8.25 MB stripped shared library, Stylo and its dependencies 56%,
layout plus dom 1.9%; the HTML standard's rendering.html lays out in 10.0 ms; the
227 recipe documents take 139 ms, nearly all Stylo setup (roadmap.md → "Substrate
rework"). Inferred: Stylo decides binary size in both, so leaving out generated
functions saves at most about 1%.
Worth taking #
- Blitz's WPT runner pattern as a second, reported score. Its native
checkLayoutcheck turns WPT pages withdata-expected-*attributes into geometry assertions without script, which could grow the held-out exam well past 7 pages and give a number comparable with Blitz's. Used as a reported score only, never for admission, it keeps "WPT supplies inputs, never expected outputs". Blitz also runs it on every pull request againstmain; this engine's floors (bench/fragment-floor.sh,bench/generated-scores.sh) cover only its own corpora. The reported score now exists, not yet run per change:docs/wpt-checklayout.md. - Parley for text shaping. Shaping cannot be scored by a three-browser vote
(
docs/text-metrics.md), so it is a linked subsystem in the class of HarfBuzz and ICU (roadmap.md→ "Layering"). Parley gives the line-breaking generated function real advances; Blitz already tests Parley against WPT (docs/parley.mdin Blitz). Taken: Parley 0.12 is linked for advance widths (crates/layout/src/text.rs), and its widths are compared with the browsers' in this repository'sdocs/parley.md. Not yet taken: line breaking and bidi through Parley, and calling it from layout. - Taffy as a further check for flex and grid, consulted where the browser vote is
split or missing before batches are drawn, never as engine code (
roadmap.md→ "Decisions" rejects Blitz's physical-coordinatef32layout with no computed/used split). Risk: Taffy's own errors would pass as agreed answers. Built as a report, not a tie-break (docs/taffy-check.md): Taffy 0.15.0 matches the browsers' unanimous answer on 98.3% of 13,514 flex and grid measurements, and sides with the pair on 87.8% of the 2–1 ones; only 7 of 653 pages split, so it is not consulted by the vote.
Also of note: Blitz's move to Stylo 0.22 is the migration guide for this engine's next
Stylo upgrade (docs/stylo-risk.md plans one release behind Blitz); emulating tables on
grid reaches 52% of css-tables cheaply; Blitz ships floats and writing modes behind
feature flags until they are good enough.
Deliberate differences #
Generated, specification-literal functions with provenance records instead of hand-written layout; live browsers as the oracle instead of reference images; layout verified without rendering. Blitz's scope is HTML and CSS for applications with browser features opt-in (its README → "Goals").
Risks #
- Coverage. Blitz renders Wikipedia and Old Reddit today; this engine passes 7 WPT pages and has no text, flex or grid. The gap between the recipe and grammar corpora (227 of 227 against 61 of 164) points at generated functions fitted to their corpora.
- Paint. Blitz's reftests check painting; the geometry vote never does.
- Stylo glue. The glue is adapted from Blitz's files, so a large Blitz refactor of
stylo.rsraises this engine's upgrade cost (inferred).