OpenUtter - Demo
OpenUtter is a headless Google Meet bot for OpenClaw. It can join meetings, capture live captions into a transcript, and take on-demand screenshots.
GitHub: https://github.com/sumansid/openutter
npx openutterThis installs the OpenUtter skill into:
~/.openclaw/skills/openutterFor example, on a Linux host running OpenClaw as the openclaw user, that path
would usually be:
/home/openclaw/.openclaw/skills/openutter/By default, OpenUtter installs into that shared OpenClaw skills directory no
matter which folder you run npx openutter from.
If you want to install into a specific location instead, use --target-dir:
npx openutter --target-dir ./skills/openutterThat is useful if you want a repo-local/workspace-local install instead of the
default shared install under ~/.openclaw/skills/openutter.
During install, OpenUtter also tries to:
- install Chromium via Playwright
- verify Chromium can actually launch
- auto-install Linux runtime dependencies when supported and running as root
If Linux system dependencies are missing and OpenUtter cannot install them automatically, it prints the exact command to run.
If you ever want to install Chromium manually, you can still run:
npx playwright-core install chromiumAt that point, OpenUtter is ready for guest joins. Google account auth is
optional and only needed if you want to join with --auth instead of waiting
in the guest lobby.
npx openutter join <meet-url> --anon --bot-name "OpenUtter Bot"
npx openutter join <meet-url> --auth
npx openutter join <meet-url> --auth --headed
npx openutter auth
npx openutter transcript
npx openutter transcript --last 20
npx openutter screenshot- Joins a Google Meet call as a guest or authenticated user.
- Enables Google Meet live captions.
- Captures captions in real time via DOM observation.
- Writes a deduplicated transcript to disk.
- Supports on-demand screenshots.
Authentication is optional.
By default, OpenUtter can join as a guest with:
npx openutter join <meet-url> --anon --bot-name "Your Bot Name"Guest mode works, and OpenUtter retries the join flow up to 3 times when Meet
blocks or drops the request. But authentication is the best way to make sure
the bot gets admitted reliably, because it joins as your signed-in Google
account with --auth instead of waiting in the guest lobby for host approval.
To save a Google session for authenticated joins:
npx openutter authThis opens a browser window. Sign in to Google, then press Enter in the terminal. Your session is saved to:
~/.openutter/auth.jsonAfter that, you can join with:
npx openutter join <meet-url> --authGuest mode:
npx openutter join https://meet.google.com/abc-defg-hij --anon --bot-name "My Bot"Authenticated mode:
npx openutter join https://meet.google.com/abc-defg-hij --authHeaded mode for debugging:
npx openutter join https://meet.google.com/abc-defg-hij --auth --headedThis opens the Chromium window instead of running fully headless, which is useful if you need to debug login, admission, or caption issues.
Common options:
--headedshows the browser for debugging--duration 30mauto-leaves after a duration--channel <channel>sends status updates through OpenClaw--target <id>sets the target chat for those updates--verboseprints live caption activity
Read the latest transcript:
npx openutter transcriptRead only the latest lines:
npx openutter transcript --last 20Transcripts are saved under:
~/.openclaw/workspace/openutter/transcripts/<meeting-id>.txtOpenUtter uses the Google Meet meeting ID as the transcript filename. For
example, joining https://meet.google.com/abc-defg-hij saves captions to:
~/.openclaw/workspace/openutter/transcripts/abc-defg-hij.txtExample format:
[14:30:05] Alice: Hey everyone, let's get started
[14:30:12] Bob: Sounds good, I have the updates ready
[14:30:25] Alice: Great, go ahead
Request an on-demand screenshot from a running meeting:
npx openutter screenshot~/.openutter/auth.jsonsaved Google session~/.openutter/auth-meta.jsonsaved login metadata~/.openutter/chrome-profile/persistent Chromium profile~/.openclaw/workspace/openutter/transcripts/transcript output~/.openclaw/workspace/openutter/on-demand-screenshot.pngscreenshot output~/.openclaw/workspace/openutter/debug-join-failed.pngjoin failure screenshot~/.openclaw/workspace/openutter/debug-admit-failed.pngadmit failure screenshot
- If Chromium is missing, run
npx playwright-core install chromium. - If guest join is stuck, ask the host to admit your bot by name.
- If captions are empty, retry with
--headed --verboseto verify captions were enabled. - If your Google session expires, run
npx openutter authagain.
This repo can publish directly to npm from GitHub Actions.
- Bump
package.jsonto the new version. - Commit and push to
main. - Create and push a matching tag like
v0.1.1. - GitHub Actions publishes that exact version to npm.
The workflow validates that the git tag matches package.json.