0.4.0

potpie-ai/potpie0.4.0Aug 31, 2026by github-actions[bot]

AI Summary

This major release introduces WebDriver BiDi support, new Web APIs like URLPattern and navigator.geolocation, and adds screenshot and PDF dump capabilities. It significantly changes resource loading defaults and introduces an initial ad blocker.

Key Highlights

  • WebDriver BiDi support with protocol selection via CLI
  • Screenshot support (`--dump png`) and PDF support (`--dump pdf`)
  • New Web APIs: URLPattern, navigator.geolocation, WorkerNavigator
  • Iframes and workers no longer load by default (use `--load-resources` flags)

Breaking Changes

  • Iframes and workers no longer load by default
  • Deprecated flags: `--disable_subframes`, `--disable_workers`, `--enable_external_stylesheets`, `--log-filter-scopes`
  • Comma-separated list values changed (e.g., `--adblock-lists a,b` -> multiple flags)

New Features

  • Screenshot support (`--dump png`, `screenshot` tool)
  • PDF support (`--dump pdf`, `Page.printToPDF`)
  • Ad blocker: EasyList parsing (initial)
  • `--load-resources` with `image` parameter
  • `--http-header` to send headers on every HTTP request
  • `--http-version` flag
  • Optional HTTP rate limit
  • exa search engine support

Full Release Notes

## Breaking changes

Iframes and workers no longer load by default. This makes resource loading
consistent: nothing loads unless you ask for it.

- Restore the old behavior with `--load-resources iframe` and `--load-resources worker`.
- External stylesheets stay off by default too: use `--load-resources stylesheet`.

Deprecated flags (they still work, but now print a warning):

- `--disable_subframes` → iframes are off by default; use `--load-resources iframe` to turn them on.
- `--disable_workers` → workers are off by default; use `--load-resources worker` to turn them on.
- `--enable_external_stylesheets` → use `--load-resources stylesheet`.
- `--log-filter-scopes` → renamed to `--log-filter`.
- Comma-separated list values (e.g. `--adblock-lists a,b`) → pass the option multiple times instead (`--adblock-lists a --adblock-lists b`). Affects `--strip-mode`, `--adblock-lists`, `--block-cidrs`, `--block-urls`.

## Protocols
- WebDriver BiDi support (with a `[classic]` WebDriver start); protocol selection via CLI; both CDP and BiDi can be served on the same port
- WebDriver: better keyboard and mouse handling

## New Web APIs
- `URLPattern`
- `navigator.geolocation` + `Emulation.setGeolocationOverride`
- `WorkerNavigator`
- `canvas.toDataURL` / `toBlob` (returns a 1x1 PNG)
- `HTMLElement.draggable` IDL attribute
- Many element getters/setters added and reworked; improved XPath support

## New features
- Screenshot support (`--dump png`, `screenshot` tool): renders the page's markdown
- PDF support (`--dump pdf`, `Page.printToPDF`): renders the page's markdown
- Ad blocker: EasyList parsing (initial)
- `--load-resources` with an `image` parameter (mimics image fetches)
- `--http-header` to send headers on every HTTP request
- `--http-version 1.1` / `auto` flag
- Optional HTTP rate limit
- `exa` search engine support; `Keenable` engine with a keyless option

## Web API behavior / fixes
- `searchParams` keeps a linked `URL` in sync; `URLSearchParams` iterator and percent-escape fixes
- `FormData` encoding
- `FileReader` is now asynchronous with proper text decoding
- Blob / File conformance; correct content-type for blobs; `application/octet-stream` MIME
- XHR: sync requests, Blob response type
- Edit-key support in `input`/`textarea`; improved hover events
- Prevent `click()` from triggering `click()`
- Re-parse `element.style` when the `style` attribute changes
- Promise-returning operations reject (not throw) on a bad receiver
- Reject XML documents that are not well-formed
- `DOMParser` captures the owning frame for the correct URL
- Handle immediate `meta refresh` navigation

## Rendering / CSS
- `clientHeight`/`clientWidth` return the viewport for the body
- `device-width` / `device-height` media features
- Compare visibility and CSS keyword values case-insensitively
- Reuse storage for updated property values
- Markdown dump separates flex and grid items; skips hidden elements

## HTTP / Networking
- Strip `Authorization` on cross-origin redirects
- Send `Sec-Ch-Ua-Full-Version-List` header
- Better `robots.txt` status handling
- Fix WebSocket data send on a small buffer
- Guarantee a single-outcome callback contract for `Transfer`

## CDP (Chrome DevTools Protocol)
- Answer unknown methods with `-32601`, like Chrome
- Enforce `Network.enable` limits
- Accept the emulation and setup calls drivers send at context creation
- Pass more `Runtime` methods through to the inspector; fill all `DOM.getBoxModel` quads
- `obeyRobots` added to `LP.configureCDP`

## MCP / tools
- Negotiate the protocol version on initialize; enforce HTTP conditions; close the connection after `keep_alive=false`
- Add title and annotations to `tools/list`; logfmt is now a config default
- Add `maxBytes` and `strip` to the `html` tool; `--selector` / `--max-bytes` for `fetch`
- Interactive/links/markdown: skip hidden elements, take roles and names from the AXNode, dedup links by href

## Agent
- List all agent providers and gateway examples in the README
- Fix agent history in JS mode

## Stability / memory
- Disconnect runaway mutation observers; drop async module completions after termination
- Fix double-release and other edge-case memory issues
- Fix UAF when a `PerformanceObserver` disconnects in its callback
- Fix arena leak on page shutdown with live animations
- Several crash fixes: null deref on cross-context `ReadableStream`, unsafe element cast, label click
- `Node.flags` for lookup short-circuit (perf)

## Build
- Simplify `build.zig`; pin `dev_fast` to the host glibc; use an orderfile on Linux CI builds
- `-Ddev_fast` speeds up Linux debug builds: shared V8 + Zig's self-hosted backend (instead of LLVM)