[05]

Breezely's pivot: from DOM scraper to full browser automation

Breezely started as a Chrome extension that could scrape DOM elements and trigger actions on a page. Simple, local, no backend.

The kind of thing you build in a weekend.

Then someone asked: "Can it log into my CRM and update 200 records?"

That question changed everything.

The original architecture

The first version was Manifest V3 Chrome extension only. Content scripts read the DOM, background service worker coordinated actions, a popup gave you a UI to define what you wanted to do.

It worked for simple things: fill this form, click this button, extract this text. But it had hard limits — it couldn't handle multi-tab flows, it couldn't run unattended, and it couldn't do anything that required a real browser with persistent state.

The pivot decision

We realised there were two distinct products hiding inside the original idea:

  • A lightweight extension for in-browser automation (what we had)
  • A cloud browser that could run complex, multi-step, autonomous workflows

They needed different architectures. We built both.

The cloud browser — Canvas — runs Playwright on Google Cloud Run. You stream the browser frame back over WebRTC. You control it through a chat interface. The extension — Breeze — handles the local, real-time, page-specific stuff.

The architectural decisions

WebRTC for streaming, not WebSocket. WebSocket would have worked but the latency was noticeable. WebRTC's peer-to-peer frame delivery made Canvas feel like you were actually controlling a browser, not watching a recording of one.

Playwright over Puppeteer. Better cross-browser support, better handling of modern web apps, better waiting strategies. The extra startup time is worth it.

Firestore onSnapshot for run logs. Instead of polling a REST endpoint for automation status, the frontend subscribes to a Firestore document. When the Cloud Run job updates the run state, the UI updates instantly. One less polling loop, one less thing to manage.

The monetisation question

Browser automation is genuinely hard to price. Power users need it constantly. Casual users need it occasionally. We ended up with three tiers: a free extension-only plan, a Canvas plan with cloud browser minutes, and a Pro plan with BYOK (bring your own API key) for users who want to use their own Gemini quota.

The BYOK option was important. It removes our API cost from the equation for power users, and it signals trust — we're not hiding what's happening under the hood.

Where it is now

Breezely is the most technically ambitious thing I've built. It touches browser internals, WebRTC, cloud infrastructure, AI, and UX in ways that each individually are hard. Together they're interesting.

The Google Solution Challenge submission is coming. The alignment with the Google stack wasn't accidental.