Roadmap¶
The engine grew in phases. Phases 0 through 2.4 have shipped, and the
browserproxy remote-browser
service that was the original Phase-3 goal is live. What remains is a set of
honest levers, not a promise of a full browser. Measured fidelity is on the
Fidelity page; the phase-by-phase log with before/after numbers is
in the engine's
FIDELITY.md and
bench/REPORT.md.
Shipped¶
| Phase | What landed |
|---|---|
| 0 — Static renderer | HTML → owned DOM → real CSS cascade (specificity + inheritance) → block/inline flow → AA text/background/image paint → PNG. |
| 1 — Real box model | Floats + clear, flexbox, tables, painted borders, margin collapsing, @media width queries. |
| 1.5 — CSS breadth I | External <link> stylesheet fetch, var() custom properties, anchor click hit-map (Links). |
| 1.7 — Flex + grid | Complete flexbox and CSS grid. |
| 1.8 — Positioning | position: relative / absolute / fixed / sticky. |
| 1.9 — CSS breadth II | Modern colour (rgb()/hsl()), Tailwind variants, border-radius, dark-mode groundwork. |
| 2.0 — Decorations | Linear/radial gradients, background-image: url(), box-shadow, group opacity. |
| 2 — JavaScript | goja bound to a real DOM with fetch()/XHR. |
| 2.1 — SVG | Pure-Go SVG rasterisation (oksvg + rasterx) for <img *.svg>, data: and inline <svg>. |
| 2.2 — Dynamic render | Layout↔JS metric read-back (getBoundingClientRect, offset*, getComputedStyle) + a settle-then-render bounded-fixpoint loop; runtime-injected <script>/<style>/<link>. |
| 2.3 — Selector hack | Sibling combinators ~/+, :checked, :not() — the checkbox-hack that collapses MediaWiki dropdowns; "reduce, don't drop" for unmodelled selectors. |
| 2.4 — JS on hit-map | The RenderWithLinks path shares the JS-settled pipeline, so JS-built links land in the click hit-map. |
| Remote browser | browserproxy: a WebSocket service that renders server-side with the engine, streams frames + hit-map, forwards clicks/scrolls/keys, and guards against SSRF. Shipping. |
Real bold + italic faces replaced the earlier faux-bold synthesis along the way.
Remaining levers (honest, not promised)¶
- Fidelity residuals —
<li>list-stylemarker discs; icon-font /visually-hiddenchrome that renders as text;conic-gradient, CSSfilterandmask; SVG<filter>/<mask>/<pattern>/<text>/embedded<image>. - Performance — large computed pages (pkg.go.dev, go.dev) render slower than Chrome; that is the next big lever, and it is a speed gap, not a fidelity one.
- Interaction depth in JS — more of the CSSOM and event model, so highly interactive SPAs settle closer to their browser state.
These are diminishing-returns work: the mean windowed-SSIM across the five bench
pages is already ≈ 0.69, and example.com is at near-parity (0.954).
Non-goals (for now)¶
- Being a full standards-compliant browser. This is a renderer with an honest, growing feature set — not a Chromium replacement, and not claimed to match Chromium pixel-for-pixel.
- cgo, a bundled browser binary, or a host web view — ever. Pure Go is the whole point.