Blueprint · Proof-of-Concept

Jenny & Domino live in a shared Zoom.

Two AI teammates and a room full of humans, all working on the same live screen — across miles, on laptops and phones. The agent is the constant hand; people take turns on top.

🖥️ Playwright = the hands 📹 Zoom = the room 🔊 Real voice in the call 👥 Humans take turns

✓ PROVEN 07.26 — a live instance of this architecture ran end-to-end: Jenny drove Omar's real Whimsical board and streamed it to his phone (the same Playwright-hands + phone-stream, minus Zoom, one human in the loop). See the live Whimsical co-view test writeup →

Plain English

What this is

Picture a normal Zoom meeting. One of the "people" on the call is a computer we own — the VM. It's driving a browser, and it screen-shares that browser into the meeting so everyone sees it. The agent (Jenny) is always driving that browser underneath — those are her hands. When a human wants to grab the wheel, Zoom lets them ask for remote control and take a turn. And when Jenny talks, her voice comes out of the VM and into the Zoom microphone, so everyone on the call actually hears her speak. Add a second VM and you've got Domino in the same room too — two AI teammates plus the people.

The workflow

How it's wired

Follow the arrows top to bottom: the agent's hands stay connected at the automation layer the whole time; Zoom is the shared room on top; humans take turns holding control; the agent's voice is piped into the call's microphone.

One VM · One Zoom room · Two AI teammates · Many humans
The VM — Jenny's machine
🤖 Playwright

Drives the browser on the VM. This is the agent's hands — always connected, no matter who else is touching the screen.

🌐 Browser window

The logged-in Chrome the agent is working in. This exact window is what gets screen-shared.

🗣️ Voice engine

Piper / fast-chat text-to-speech. The agent speaks; the audio plays out of the VM.

🔌 Virtual audio cable

VB-Cable routes that speech straight into Zoom's microphone input — so the room hears it.

screen-share the browser window  ·  pipe the voice into the mic ▼ ▼
The Zoom room — the shared space everyone sees
📹 Shared screen

Everyone on the call watches the same browser, live. The agent's marks, clicks and typing show up for all.

🎚️ Remote control (turn-based)

Zoom's Request / Give Control hands the wheel to one person at a time. They interact directly; then they hand it back.

Key idea: whoever holds the Zoom control on top, the agent still holds control underneath through Playwright. Humans take turns; the agent is the constant hand beneath them.

people join from anywhere — laptop, phone, across miles

👥 The people in the room

🧑‍💼 Omar laptop holds control
🧑‍🔧 Jack phone
🧑‍💻 Client laptop
👀 Watchers stream URL

One person holds the wheel at a time; the rest watch live and take their turn when they ask.

🤖🤖 A second AI teammate

🧠 Domino (VM3)

A second VM joins the same Zoom the identical way — its own browser, its own voice cable. Now two agents work the room alongside the humans.

📡 Watch-only multicast

A tunnelled stream URL lets many more people simply watch the session without joining the call.

agent's hands (always on)
agent's voice into the mic
shared screen & turn-based control
How turn-based control works, step by step the hand-off

"Turn-based" isn't a compromise — it's exactly how a working session hands the wheel around without collisions. The agent's Playwright layer never lets go; the Zoom control layer is what changes hands on top. Here's the full loop:

  1. Default state — the agent drives. Playwright is on the wheel continuously, working the shared browser. Everyone watches it happen live in the Zoom screen-share.
  2. A human asks for the wheel. They click Zoom's Request Remote Control. The current controller (the VM's operator, or whoever holds it) sees the request and approves it.
  3. Zoom grants that one person control. Their mouse and keyboard now drive the shared window directly — one controller at a time, enforced by Zoom itself. No second cursor appears; there's no fighting over the pointer.
  4. The agent keeps acting underneath. Even while a human holds the Zoom wheel, Playwright can still click, type and navigate at the automation layer — because it's attached to the browser process, not routed through Zoom's control. The two layers coexist.
  5. Hand it back. The human releases control (or the operator revokes it), and the wheel returns. The next person requests when it's their turn.

Why not simultaneous cursors? True multiplayer (many live cursors at once) is a fundamentally harder architecture and it isn't needed for turn-taking work — cooperative hand-off covers the real use case cleanly and ships far sooner.

The voice routing chain — TTS → VB-Cable → Zoom mic, in detail the voice path

Getting the agent's voice into the room is a plain audio-routing trick — no model call anywhere in the chain. It's the same signal path you'd use to feed any app's audio into a meeting:

  1. Text is composed by the live session (the brain), then handed to the voice engine as plain text.
  2. Piper / fast-chat TTS renders speech on the VM — the same Irish "me" voice, produced locally on CPU, no cloud.
  3. The audio is sent to a virtual output device instead of the physical speakers — VB-Cable, a virtual audio cable that presents itself to Windows as both a playback device and a recording device.
  4. Zoom's microphone is set to that virtual cable. To Zoom, the agent's speech looks exactly like a person talking into a mic — so the whole room hears it in the call, mixed with everyone else's audio.
  5. Bridge / fast-chat text runs in parallel — the same message can appear as text on the shared surface at the same time it's spoken, so nothing is lost if audio is missed.

The honest edge: this is text-to-speech, so there's a short turnaround — near-instant for quick lines, a beat longer for deep answers. Live enough to feel like a teammate, not instant like a phone call.

The pieces, one by one

Five moving parts

🖐️

The hands (always connected)

Playwright drives a real browser on the VM. That's the automation layer — the agent's hands stay on the wheel continuously, whatever happens on top.

📹

The room

The VM joins a Zoom call and screen-shares that browser window. Now the agent's screen is the meeting's shared screen.

🎚️

Taking turns

Zoom's Request / Give Remote Control lets a human take the wheel for a turn — one controller at a time — then hand it back. The agent keeps working underneath.

🔊

The voice

Text-to-speech plays out of the VM and is routed into Zoom's mic via a virtual audio cable. Everyone on the call hears the agent speak live. Bridge / fast-chat text runs in parallel.

🤖

A second teammate

Domino (VM3) joins the very same Zoom in the very same way. Two AI teammates plus the humans, all in one room, across miles and devices.

📡

Watch-only crowd

A tunnelled stream URL lets many more people just watch the working session, without needing a seat in the call.

Straight talk

The honest limits

We show these plainly rather than hide them — a blueprint you can trust is one that names its own edges.

⚠️ What this is not, yet

  • Control is turn-based, not simultaneous. One controller at a time — cooperative hand-off, not many cursors at once. True simultaneous multiplayer (multiple live cursors) is a different, much harder architecture — and it isn't needed for turn-taking work.
  • The voice has turnaround. It's text-to-speech with a short delay — near-real-time for quick exchanges, longer for deep answers. Live enough to feel like a teammate; not instant like a phone call.
  • Metering-clean by design. Zoom, Playwright, and audio routing are pure plumbing — no model calls. The live interactive session is the brain. This is never a headless per-user bot; there's always a human-driven session in the loop.
Honesty box

What's proven vs what to build

✓ Proven — already works
  • Playwright driving a real browser on the VM
  • Cloudflare tunnels for public, shareable URLs
  • Logged-in profiles — the browser is signed in and ready
  • Cobrowse anti-throttle keeping the shared view smooth
  • Piper voice — the text-to-speech engine
  • Zoom itself — screen-share and remote control are standard features
⚙ To build — the new wiring
  • connectOverCDP attach — hook the automation onto the exact browser being shared
  • Page.startScreencast stream — the watch-only broadcast feed
  • VB-Cable voice routing — pipe the agent's speech into Zoom's mic
  • The VM-joins-Zoom seat — the machine takes a seat in the call and shares its window
The proven-vs-to-build component list, part by part every piece

The whole point of this blueprint is that most of it already runs. Here's each component, what it does in this system, and whether it's proven today or still to be wired:

✓ Proven — already works
  • Playwright driving a real browser on the VM — the agent's hands; used daily.
  • Cloudflare tunnels — public, shareable URLs already in production.
  • Logged-in profiles — the browser is signed in and ready, no re-auth per session.
  • Cobrowse anti-throttle — Chrome flags that keep the shared view rendering smoothly even when unfocused.
  • Piper voice — the text-to-speech engine, already the agent's live voice.
  • Zoom itself — screen-share and remote control are standard, shipped Zoom features.
⚙ To build — the new wiring
  • connectOverCDP attach — point Playwright at the exact Chrome instance being screen-shared, so hands and shared view are the same browser.
  • Page.startScreencast stream — tap Chrome's DevTools screencast to produce the watch-only broadcast feed for the crowd.
  • VB-Cable voice routing — install and route Piper's output into Zoom's mic input.
  • The VM-joins-Zoom seat — automate the machine taking a seat in the call and starting the window share.

The takeaway: the risky, unproven surface is small and well-bounded — four pieces of wiring on top of a stack that already works. Nothing here needs a new model, a new voice, or a research breakthrough.

The recommended first step

Prove it in three moves

Start small and provable, then widen. Each rung adds exactly one new thing so nothing gets muddy.

1 Prove with Omar

The VM joins a Zoom, shares the Playwright browser, and the agent's voice is routed into the call's mic. Omar takes Zoom remote-control to interact — while the agent keeps acting via Playwright underneath. One human, one agent, one room.

2 Add Jack — hand-off

Jack joins from another device. Now practise the turn hand-off: Omar gives control, Jack takes a turn, hands it back. The agent's hands never leave the wheel underneath.

3 Add Domino

A second VM (Domino / VM3) joins the same Zoom identically. Two AI teammates plus the humans, all working the same live screen across miles.

Why this order: each rung is a single new risk. Prove the seat + voice + underneath-control with one trusted person first; only then add a second human and a second agent. Nothing ships until the rung below it is real.

The 3-rung POC in detail — what to build and prove on each step by step

Each rung isolates exactly one new risk, so when something breaks you know precisely which piece to fix. Here's what each rung actually builds, and the concrete thing that has to be true before climbing to the next.

  1. Rung 1 — Prove with Omar (seat + voice + underneath-control). Build the VM-joins-Zoom seat, the window screen-share, and the VB-Cable voice route. The test: the VM is in a Zoom, the shared browser is visible to Omar, Omar takes Zoom remote-control and interacts, and while he does, Playwright still acts on the same browser underneath. Proven when: Omar hears the agent speak in-call and sees the agent keep working even while he holds the wheel.
  2. Rung 2 — Add Jack (the turn hand-off). No new plumbing — this rung stresses the control hand-off with a second, remote human. Omar gives control, Jack (on another device, across miles) takes a turn, then hands it back. Proven when: control passes cleanly between two people with no lockups, and the agent's hands never leave the wheel during the swaps.
  3. Rung 3 — Add Domino (the second agent). A second VM (VM3) joins the same Zoom identically — its own browser, its own voice cable. Proven when: two AI teammates plus the humans are all working the same live screen at once, each agent speaking into the room, without the two automation layers interfering.

The discipline: nothing on rung 2 gets touched until rung 1 is genuinely real, and rung 3 waits on rung 2. One new risk at a time keeps every failure legible.

The one-line version

One machine takes a seat in a Zoom, shares its screen, speaks in the room — and the agent is the constant hand beneath everyone's turns.

Pure plumbing on proven parts. Humans take turns on top; Jenny and Domino work underneath; anyone can watch. That's the proof-of-concept.