All notable changes to Rover are documented here. The format follows Keep a Changelog, and the project aims to adhere to Semantic Versioning against Rover's own Elixir API (not Servo's).
The ## [Unreleased] section is rolled into a dated, versioned heading by
scripts/release.exs (just release) when a release is cut.
[Unreleased]
0.1.2 - 2026-10-11
Changed
- Update Servo from
683eab21c0b6(2026-08-23) todc3d95938710(2026-10-11, Servo 0.7), and refresh the runtime's Rust dependency lockfile. - Upgrade SpiderMonkey to 153.3 ESR and inherit CSS/text module imports, CSS Grid and form selector fixes, timer cleanup, and HTTP connection limits.
- JavaScript evaluation now works on documents with restrictive Content Security Policy, through Servo's embedder evaluation API.
- Update compatible Elixir dependencies, including Telemetry, Bandit, Plug, and ExDoc.
Fixed
- Navigation waits for a fresh load-completion event, avoiding intermittent empty titles and reads of the previous or incomplete document. Redirects and repeated navigation to the same URL now wait for the destination document; fragment changes continue to work without waiting for a new document load.
- Keep each browser's temporary storage profile alive for its lifetime, avoiding Servo's ClientStorage SQLite initialization failures.
- Release tooling keeps the Rust runtime version and lockfile in sync with the Elixir package version.
0.1.1 - 2026-08-27
Fixed
rover_runtimenow exits when the owning BEAM dies even if Servo is wedged mid-operation. A parent-death watchdog thread pollsgetppidand hard-exits once re-parented; previously all exit paths (Shutdown frame, stdin EOF, stdout write failure) required the main thread to be back in the wire read loop, so a wedged engine left orphaned runtimes spinning at full CPU indefinitely after the BEAM was gone.
0.1.0 - 2026-08-23
Initial release. Drive the Servo web engine from Elixir — one OS process per browser, with per-instance proxy config, cookies, JS evaluation, and input automation.
Added
Rover.fetch/2(one-shot) andRover.start_link/1(long-lived, supervisable) browser instances, each backed by a dedicatedrover_runtimeOS subprocess spoken to over length-prefixed MessagePack (Port,packet: 4).- Navigation, rendered content, title;
wait_for/3polling for JS-rendered nodes. - JavaScript evaluation (
evaluate/2) round-tripping strings, numbers, arrays, and maps. - Text/attribute extraction (
get_text,get_texts,get_attribute). - Real input automation:
click,fill,hover,select_optiondispatching genuine DOM events. - PNG/JPEG screenshots (
screenshot/2). - Cookie management via Servo's
SiteDataManager(get_cookies,set_cookie,clear_*). - Per-instance proxy routing — the point of Rover.
- Precompiled
rover_runtimebinaries: a:rover_downloadMix compiler fetches the prebuilt binary for the host target from the GitHub release atmix compileand verifies it againstchecksum-rover_runtime.exs, so consumers install without a Rust toolchain or a Servo build. SetROVER_BUILD=1to skip the download and use a localcargobuild instead. - End-to-end integration coverage proving two concurrent browsers preserve independent proxy routing.
Fixed
- Graceful browser shutdown now waits for
rover_runtimeto acknowledge and exit before closing its Port, avoiding falseBroken pipeerrors. Default runtime logging also suppresses Servo's expected memory-profiler teardown warnings.