I’m a 14-year-old builder from Pakistan. After struggling with existing browser automation tools while building AI agents, I decided to create something better.
Whelmer is a Rust-based CLI tool that gives you complete, unfiltered access to everything a browser emits — across multiple protocols and browsers.
The Problem with Existing Tools
When you connect to a browser via CDP (Chrome DevTools Protocol), the browser fires hundreds of event types across 53 domains: Network, DOM, Console, Storage, Fetch, Security, and more.
Most agent frameworks and tools do one (or more) of the following:
- Filter events aggressively
- Hide protocol differences behind high-level abstractions
- Only support Chrome CDP
- Drop events they consider “unimportant”
This creates blind spots. You miss critical signals — like how an SPA handles auth tokens in localStorage, or subtle network patterns that reveal rate limiting logic.
Multi-browser support makes it worse. Firefox uses BiDi or its own FDP. Safari has its own protocol. Most tools pretend these differences don’t exist.
What Whelmer Does Differently
Whelmer shows everything.
- Native support for CDP, BiDi, FDP, and Foxbridge (CDP-to-Firefox proxy)
- Works out of the box with Chrome, Brave, Edge, Opera, and Firefox
- A central EventBus with a 10,000-event ring buffer — nothing is dropped
- Raw NDJSON streaming for easy piping into other tools/agents
- Runtime domain management (enable/disable any of the 53 CDP domains)
- Structured JSON output for all commands
- Pure Rust static binary (~7MB) — no Node.js, no Python, no heavy dependencies
Key Features
- Multi-protocol support — One binary, consistent event model across browsers.
-
Raw event firehose — Every WebSocket message is available. Use
events --jsonand pipe tojq. -
History replay — Access the last 10k events with
events --history N. -
Powerful commands:
-
dom,eval,cookies,storage,network,screenshot,perf, etc. - All support
--jsonoutput.
-
- Pluggable architecture — Easy to extend with new protocols or handlers.
Architecture Overview
Whelmer uses a clean pipeline:
- WsConnection — Manages persistent WebSocket connection with command/response routing and timeouts.
- EventBus — Broadcast channel + ring buffer. Every event reaches every consumer.
- Display Consumer — Formats known events for terminal output.
- Agent Consumer — For raw streaming and history queries.
This decoupling means the tool never silently drops data. You decide what matters.
Why I Built It
Whelmer was created for a specific use case: reverse-engineering the web interfaces of AI model providers. When OpenAI, Google, xAI, or others update their UIs or internal APIs, agent integrations break. Whelmer lets you see exactly what changed in real time.
It is also the foundation for RynoVider — my upcoming OpenAI-compatible API wrapper that routes through actual model web UIs.
Competitor Comparison
| Tool | Protocols | Raw Events | History Buffer | Domain Toggle | Runtime |
|---|---|---|---|---|---|
| Whelmer | CDP + BiDi + FDP | Yes | 10k events | Yes (53) | Rust |
| agent-browser (Vercel) | CDP only | No | No | No | Rust+Node |
| Puppeteer | CDP only | No | No | No | Node |
Quick Start
# Install
cargo install whelmer
# Or from source
git clone https://github.com/Sumama-Jameel/Whelmer
cd Whelmer
cargo build --release
Launch your browser with remote debugging:
google-chrome --remote-debugging-port=9222
Then run:
whelmer
Future Plans
- Safari WebKit support
- Better integration as a library
- Enhanced agent-friendly features for RynoVider
Whelmer is open source under MIT. Feedback, issues, and contributions are welcome.
What’s the most painful hidden browser behavior you’ve encountered while building agents? I’d love to hear your experiences in the comments.
Top comments (0)