v0.2.4 — localStorage persistence, robots.txt by default, 30+ engine fixes
v0.2.4 ships 30+ fixes landed since v0.2.3 — the biggest batch yet. Everything below is verified by the hosted instance and covered by tests in-repo.
Highlights
- localStorage survives restarts — per-origin storage is flushed to disk and reloaded on boot (upstream obscura#629). Sessions, consent banners, and login hints now persist across process restarts.
- robots.txt compliance on by default — RFC 9309 parser, honored on every autonomous fetch path (
/fetch,/screenshot,/download,/click,/eval, body-grab).AGINXBROWSER_RESPECT_ROBOTS=0to opt out. - Session recording & replay — interactive sessions record every action and can export a runnable curl replay script (
session_export). - MCP session semantics — new
session_listtool;Mcp-Session-Iddual semantics (join existing / spawn new) documented. - One-line installer hardened — release-asset mirror fallback, writable-bindir detection, docker hint for linux/arm64. Pin with
VERSION=v0.2.4.
Benchmark vs headless Chrome
Real-page tier reporting added (/bench):
| metric | aginxbrowser (auto) | headless Chrome |
|---|---|---|
| page load | 532 ms | 4053 ms |
| memory / page | 227 MB | 2.1 GB |
Chrome in the same region also hard-failed 12.5% of pages on CN routing; aginxbrowser 0%.
Rendering engine (diting)
getComputedStylenow reads the full stylesheet cascade, not just inline styles — and returns a whole-object snapshot (obscura#738 trap + perf).- Hit-testing follows paint order, so
z-indexstacking is respected byelementFromPoint(obscura#738). transform: translate(...)is computed into geometry (obscura#740).- Float layout: zones follow document order, same-side floats form a rail, Vector 2022 grid scaffold — float displacement no longer escapes grid containers; navboxes land at the bottom where they belong.
matchMediaevaluates against the live viewport.
CDP / automation
dispatchMouseEventemits the pointer pair before the mouse pair (obscura#739).Input.insertTextimplemented (obscura#577).- Box-model/quads emit integer coordinates (obscura#576).
objectIdlookups: JSON literals resolve honestly; number remote objects spelled like Chrome (obscura#541).setExtraHTTPHeadersfans out to the stealth transport (obscura#571).- Enter in a textarea splices the newline at the caret.
- Pending JS navigation drained on click/eval surfaces (obscura#618).
- srcset: prefetch the selection winner only, not every candidate (obscura#667/#662 class).
Network / stealth
- Implicit env-proxy matcher pinned off:
HTTP_PROXY/HTTPS_PROXY/ALL_PROXYno longer silently hijack engine traffic —AGINXBROWSER_PROXYis the only proxy knob (obscura#491). - One source of truth for the User-Agent across HTTP transports and the in-page JS persona (obscura#481).
fetch/XHRresponse bodies and robots.txt streams are size-capped (obscura#581 OOM).
Housekeeping
- Compiler-flagged dead code swept; import-map prefix-match
never_loopfixed. - README catches up with the engine registry (diting modules).
- Docker verify strips the leading
vfrom the image tag.
Full changelog: v0.2.3...v0.2.4