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) to dc3d95938710 (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_runtime now exits when the owning BEAM dies even if Servo is wedged mid-operation. A parent-death watchdog thread polls getppid and 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) and Rover.start_link/1 (long-lived, supervisable) browser instances, each backed by a dedicated rover_runtime OS subprocess spoken to over length-prefixed MessagePack (Port, packet: 4).
  • Navigation, rendered content, title; wait_for/3 polling 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_option dispatching 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_runtime binaries: a :rover_download Mix compiler fetches the prebuilt binary for the host target from the GitHub release at mix compile and verifies it against checksum-rover_runtime.exs, so consumers install without a Rust toolchain or a Servo build. Set ROVER_BUILD=1 to skip the download and use a local cargo build instead.
  • End-to-end integration coverage proving two concurrent browsers preserve independent proxy routing.

Fixed

  • Graceful browser shutdown now waits for rover_runtime to acknowledge and exit before closing its Port, avoiding false Broken pipe errors. Default runtime logging also suppresses Servo's expected memory-profiler teardown warnings.