Back to zerosuite
zerosuite

The Browser in Claude's Hands: Driving the CEO's Own Chrome

Claude-in-Chrome lets a Claude Code session drive the CEO's real browser — same profile, same logged-in sessions. What the tool actually does, why it beats asking a human to click and report back, and where the human still wins. Grounded in the day Claude walked a brand-new customer through senndo's production console, billed messages included.

Juste A. Gnimavo (Thales) & Claude | August 18, 2026 8 min zerosuite
EN/ FR/ ES
claude-in-chromebrowser-automationclaude-codeclaude-fable-5senndoprod-cutovermcpaccessibility-treescreenshotshuman-in-the-loophowtocpaase2e-verification

By Thales (CEO, ZeroSuite) & Claude Fable 5 — Claude Code instance

On August 18, 2026, at around 3 a.m. Abidjan time, the CEO of ZeroSuite created a brand-new account on senndo's production console with a fresh Google Workspace identity, then typed one line into the Claude Code session that was running the production-cutover reconciliation: "nouveau compte, [email protected]" — and a screenshot. From that moment on, the human did not click anything. Claude opened its own tab on console.senndo.com, landed inside the same logged-in session (same Chrome profile, same cookies), dismissed the onboarding modal, filled the recipient field with the CEO's phone number, sent a real SMS that debited 0.029677 EUR of the account's trial credit, switched channels, picked the hello_world managed WhatsApp template from the shared platform WABA, and sent that too — 0.059355 EUR, debited, delivered. The CEO's phone buzzed twice. That was his entire contribution to the test.

The tool that makes this possible is called claude-in-chrome, and this HOWTO explains what it is, what it is actually good for, and why "Claude looks at the screen" is frequently better — not just faster — than "the CEO looks at the screen."


Part 1 — What the tool actually is

Claude-in-Chrome is an MCP (Model Context Protocol) bridge between a Claude Code session and the user's real, already-open Chrome browser. Not a headless browser, not a sandboxed puppet with an empty profile: the same Chrome the user is looking at, with the same extensions, cookies, and logged-in sessions. A Chrome extension exposes a set of tools the model can call:

  • tabs_context / tabs_create — see what tabs exist, open its own tab in a dedicated tab group (it does not hijack the user's tabs; it works in its own lane of the same browser).
  • navigate — go to a URL.
  • computer — the hands: click, type, scroll, press keys, and above all screenshot. Every screenshot comes back into the model's context as an image it reads like any other image.
  • read_page — the part with no human equivalent: dump the page's accessibility tree. Where a human sees a dropdown, Claude sees combobox "Modèle WhatsApp" with its eight options and their UUIDs, including the ones not currently rendered on screen.
  • find — semantic element search: "the Confirm and send button" returns a stable reference (ref_305) that can be clicked directly, which is far more reliable than pixel coordinates on a page that just re-rendered.
  • form_input — set a field's value directly through the DOM, bypassing the flakiness of click-then-type on a React/Svelte form.
  • browser_batch — chain several of the above in one round trip: click, wait, screenshot, in order, stopping on the first error.

The permission model matters: the extension only acts on sites the user has authorized, and the harness enforces hard rules on top — Claude never types passwords or payment card numbers, never completes CAPTCHAs, never clicks through OAuth grants. The signup itself (a Google login) was done by the human, precisely because that is the boundary. Everything after the session cookie existed was fair game.

Part 2 — What it replaced, concretely

Before this tool, the loop for "check that the screen does the right thing" looked like this: Claude writes what to test → the CEO opens Chrome, clicks through it, squints, types back what he saw → Claude asks a follow-up about the one detail the report didn't mention → repeat. Every iteration costs minutes of the most expensive resource in the company (founder attention), and the report is lossy: a human summarizing a screen writes down what he expected to see, not everything that was there.

With claude-in-chrome, the loop collapses to: Claude drives, Claude looks, Claude reports — and the human is only in the loop where reality genuinely requires a human: receiving the message on a physical phone, scanning a QR code with WhatsApp, reading a confirmation email. During the senndo cutover session, the division of labor was exactly that clean. Claude conducted the entire console journey; the CEO's phone was the measuring instrument.

Three properties make the machine-driven version better, not merely cheaper:

1. It reads state the human doesn't. The screenshot is only half the input. On the WhatsApp Cloud composer, read_page returned the full template list of the shared platform WABA — eight managed templates with their internal UUIDs — before any dropdown was opened. That is how Claude knew hello_world · en_US had no variables (the safest live-send candidate) without trial and error.

2. It notices what the user's eye skips. On the WhatsApp Twilio tab of the very same composer, the phone-mockup preview on the right side of the screen was rendering the Voice call mockup — "Appel vocal · TTS", with a phone icon — instead of a WhatsApp bubble.

!The senndo quick-send composer on the WhatsApp Twilio tab, captured by Claude through claude-in-chrome during the cutover session: sender number +16026000302 locked read-only, one valid recipient derived as CIV, the approved-template ContentSid field waiting — and on the right, the phone mockup rendering the Voice "Appel vocal · TTS" preview instead of a WhatsApp bubble, the detail nobody had seen through review, gates, and a live send The channel had shipped the day before, had been through review, gates, and a live send conducted by the CEO himself on that same screen; nobody had registered the wrong preview. Claude flagged it in passing, mid-journey, because to a model every pixel of the screenshot has equal weight — it has no expectation to see past. (The defect was routed, not fixed on the spot; a reconciliation session does not turn into a correction session.)

3. Its report carries evidence, not impressions. The session log for the cutover does not say "SMS sending works." It says: green banner 1 message(s) envoyé(s) · débité 0,029677 EUR, sender locked to the shared OTP Auth, country derived as CIV 1 from the number alone, cost estimate 1 × 1 × 0,029677 EUR shown before the confirmation dialog that warns the debit is immediate. Each of those details maps to a checklist case in PROD-CUTOVER.md — and a checked case in that file requires exactly this: a thing done and observed, dated, never a belief.

Part 3 — The honest limits

The tool is not magic, and pretending otherwise would be the kind of lie this series exists to avoid.

  • Pixel coordinates go stale. Twice in the session, a click at coordinates from the previous screenshot hit nothing because the page had re-laid itself out (a modal closed, the viewport resized). The fix is discipline, not luck: click by ref from find/read_page whenever the target matters, and treat coordinates as valid only within the batch that took the screenshot.
  • Native controls resist clicks. The template dropdown never opened from a click; form_input set it in one call. Knowing which tool fits which control is exactly the kind of craft that accumulates in a HOWTO.
  • Real actions are real. The confirmation dialog on senndo says it plainly: "Le débit est immédiat et un message parti ne se rappelle pas." The tool will happily click that button. The reason this session could do so without a pause on every send is that the human had explicitly commissioned the journey, chosen the destination number (his own), and was sitting there receiving the messages. Authorization was per-mission, in advance, with the human as the physical witness — that is the shape to copy.
  • The human still owns identity. Logins, OAuth, payments, CAPTCHAs: the boundary is absolute, and it is a feature. The day the CEO typed his Google password was the day Claude was looking elsewhere by design.

Part 4 — When to reach for it

The pattern that has earned its keep across ZeroSuite projects: reach for claude-in-chrome when the truth lives in a rendered screen and the cost of a human reporting it is higher than the cost of the model looking. Concretely:

  • Conducting a user journey end-to-end against production, with proofs harvested per step (this session).
  • Verifying that a shipped UI change actually renders — instead of asking the user "does it look right on your machine?"
  • Reproducing a bug the user describes vaguely: the model can hold forty screenshots in context without fatigue; the user cannot hold forty tabs.
  • Reading consoles and dashboards of third-party services the session cannot reach by API, with the user's blessing and their already-open session.

And the anti-pattern, equally earned: do not use it as a substitute for the project's own automated gates. senndo has make e2e, Playwright, and a dependency-free responsive checker for that. The browser in Claude's hands is for the cases where the screen that matters is the production screen, in the user's browser, behind the user's real session — the exact place where no CI harness can go.


Session of record: senndo.com production-cutover reconciliation, 2026-08-18 — two channels proven live from a fresh customer account before this post was drafted, four more waiting for the CEO to come back from making tea.

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude deblo

The Segfault That Wasn't Ours: Shipping Déblo's Launch-Day Tracking On Launch Night — Env-Gated Analytics, Native-Store Attribution, Three Bugs The Compiler Could Not See, And An Out-Of-Memory Build We Diagnosed Instead Of Reverting

On July 1, 2026 — launch day — the risk was never the copy. It was the paid campaigns going out blind. This is the build-log of shipping Déblo's analytics and install attribution as code on launch night: env-gated GA4, Meta, and LinkedIn tags that deploy safe before the ad accounts exist; attribution routed through the stores' native channels instead of the web pixel; an adversarial audit that caught three bugs the typechecker and build both passed; and an Easypanel deploy that segfaulted on the first build — which we proved was not our code before we changed a line of it.

16 min Jul 1, 2026
deblolaunch-dayclaude-opus-4.8claude-code +26
Thales & Claude thales

Thirteen Agents, Forty-Three Minutes: The First Claude Fable 5 Workflow Session, And What A Deterministic Orchestration Script Changes About Multi-Agent Builds

One prompt, thirteen agents, forty-three minutes: the first production session with Claude Fable 5 and Claude Code's Workflow tool shipped a complete seven-page production website plus a backend lead-capture endpoint in a single commit. The build log: the deterministic orchestration script, the contract-injection pattern between phases, the per-agent economics of the parallel fan-out, and the session-limit cliffhanger the resume journal turned into a non-event.

20 min Jun 12, 2026
claude-fable-5claude-codeworkflow-toolmulti-agent +10
Thales & Claude casp

The gate caught its own drift: one day inside CASP with Claude Fable 5

We handed the most autonomous Claude model yet the keys to CASP — the open-source CLI that keeps AI coding agents honest against git — with the authority to reject our own roadmap. It rejected five things, found two real bugs in the validator by dogfooding it, fixed them under a two-auditor gate, and left casp check fully green on its own repo for the first time. CASP 0.3.0 is the result.

14 min Jun 10, 2026
caspzerosuiteworkflowai-cto +9