services/openclaw/meeting-plugins.md

OpenClaw Meeting Plugins (Google Meet)

Covers the google-meet plugin: meeting transcript capture, talk-back setup, and gotchas hit during initial setup (2026-09-27/28).

What it does beyond transcripts

The plugin has three participation modes, chosen per-join via --mode (or defaultMode in config):

  • transcribe — observe-only. Joins, reads live captions, saves notes. No mic/camera permission grant at all (auto-clicks "Continue without microphone"). Simplest setup, no audio bridge needed.
  • agent (default) — realtime transcription hears meeting audio, routes finalized speech to the OpenClaw agent, speaks the reply via normal OpenClaw TTS. This is "my agent sits in the meeting and talks."
  • bidi — a realtime voice model (GPT-Live / Gemini Live) listens and replies directly, lowest latency, delegates deeper reasoning to the agent via openclaw_agent_consult.

Talk-back modes (agent/bidi) need a virtual audio device (BlackHole 2ch on macOS, PipeWire-Pulse on Linux) because Google's Meet API is receive-only — there's no way to "speak" into a call without a fake microphone. Camera is never used by the plugin in any mode; there's no video feature at all.

Beyond capture/talk-back, the plugin can also:

  • Create meetings via the Google Meet API (or browser fallback), with explicit access policy (OPEN/TRUSTED/RESTRICTED) for API-created rooms.
  • Dial in via Twilio as an alternative to Chrome.
  • Read Meet artifacts (attendance, recordings metadata) via OAuth.

Install/setup is the same regardless of which modes you want — mode is a per-join choice, not an install-time choice:

openclaw plugins install @openclaw/google-meet
brew install blackhole-2ch sox   # only needed for agent/bidi talk-back; skip for transcribe-only
sudo reboot                       # Homebrew's BlackHole installer needs this before macOS sees the device
openclaw googlemeet setup --transport chrome --mode transcribe
openclaw googlemeet setup --transport chrome --mode agent

Two Chromes, two participants — but check the identity

The google-meet plugin joins in the isolated openclaw Chrome profile, running as its own separate participant alongside whatever window you personally use to join the same meeting. It's not "one browser, two people" — it's genuinely two Chrome instances.

Gotcha: the openclaw profile is persistent. If it's ever been signed into your real Google account (via browser importprofile, or a manual sign-in inside that isolated window), the bot joins the meeting as you, not as a distinct guest named "OpenClaw Agent" (chrome.guestName default). To other participants it looks like you joined twice. Check with:

browser profiles   # via the browser tool; shows openclaw/user/chrome + systemProfiles available to import

To make it show up as a distinct bot participant: sign the openclaw profile out of Google (guest join) or give it its own dedicated Google account.

No wake-word / addressing in agent mode

In agent mode there's no name-trigger — it doesn't wait to be addressed. Every finalized participant transcript gets routed to the OpenClaw agent and gets a spoken reply, coalescing nearby fragments so one utterance doesn't produce several stale answers. If that's too chatty, tune plugins.entries."google-meet".config.realtime.instructions to tell the model when to actually reply vs. stay quiet — there's no separate on/off gate for "was I addressed."

Killing the terminal does NOT stop the meeting

The Gateway process (long-running background service), not your terminal, owns the actual Chrome session and capture. Ctrl+C / killing the shell that ran openclaw googlemeet join ... leaves the session active — it'll keep showing "Live capture" in the Meetings UI indefinitely.

To actually stop it:

# find the stuck session
openclaw transcripts list --json
# or via the google_meet tool: {"action": "status"}

# then stop it properly (closes the Chrome tab it opened, finalizes notes)
openclaw googlemeet leave <session-id>
# or tool: {"action": "leave", "sessionId": "meet_..."}

leave sets state to ended, closes any tab OpenClaw itself opened, and finalizes/saves the transcript summary. Read it back afterward with openclaw transcripts show <selector> or the pinned Meetings page in Control UI (/meetings, add via sidebar pencil menu → Edit pinned items).

Audio-choice-required blocker (hit 2026-09-28)

First live agent-mode join failed to reach speechReady: true. Status showed:

"manualAction": {
  "reason": "meet-audio-choice-required",
  "message": "Select BlackHole 2ch or OpenClaw Meeting Audio as both the Meet microphone and speaker, then retry."
}

Also: "audioInputRouteError": "Meet microphone device selector was not available." — Chrome granted mic/camera permission automatically, but Meet's in-call device picker never got set to BlackHole automatically, so OpenClaw muted the Meet mic defensively rather than risk unrouted audio.

Not yet resolved — next attempt: manually pick BlackHole 2ch as both mic and speaker in Meet's audio-choice prompt once per session, or check openclaw googlemeet doctor output for why the automated device-selector step didn't take. Revisit and update this note once the actual fix is confirmed.