
Hey everyone, Suchintan from Skyvern (YC S23). We run browser automation for AI agents at scale, and we're launching Rustwright: Playwright on an in-process Rust CDP engine. The engine consumes 70% less memory than Playwright, and is 2.55x faster to boot.
We built this to improve Skyvern’s memory footprint, and thought this would be independently valuable to the broader community
The whole idea fits in two lines:
playwright-python: your code ──pipe──► Node driver (separate process) ──CDP──► Chromium
rustwright: your code ────────────────── raw CDP ─────────────────────► Chromium
Removing the driver changes three things:
__playwright__binding__ globals, no Runtime.enable on the default path (the well-known console-serialization leak). The claim is deliberately narrow: no Playwright-specific automation fingerprint, not "undetectable"from rustwright.sync_api import sync_playwright.Clicks and typing go through real CDP input events, not synthetic DOM calls, and cross-origin iframes auto-attach with frame_locator() routing across origins.playwright-python pipes every call through a bundled Node driver process. Rustwright drives Chromium over raw Chrome DevTools Protocol from a Rust core, an async CDP client on Tokio (WebSocket, plus opt-in Unix-pipe transport), exposed in-process through thin PyO3 bindings for Python and napi-rs bindings for Node.
Status: alpha, Chromium-only
Want to give it a try? Change one line of code!
pip install rustwright
- from playwright.sync_api import sync_playwright
+ from rustwright.sync_api import sync_playwright
⭐ Give it a try here and let us know what you think: https://github.com/Skyvern-AI/rustwright