Meetmate
Bring your own AI agent into Google Meet, Zoom & Discord voice channels — as a real voice participant.
Meetmate does exactly one thing: it gives your AI agent a seat in your meeting. It joins as a participant with a face and a voice — you call its name, it answers; you ask for something, it gets it done. We kept the scope that small on purpose, and polished that one thing relentlessly.
Quick start
What you need: Node.js ≥ 26 · an Attendee account (Meet/Zoom) or a Discord bot token (Discord — no Attendee, no tunnel) · Soniox (or Deepgram) for speech-to-text · a TTS provider (Fish Audio, ElevenLabs, or OpenAI-compatible) · an LLM endpoint (OpenClaw Gateway or any OpenAI-compatible) · usually ngrok or Tailscale for Meet/Zoom · and Google Meet will ask you to admit the bot. The third-party services may cost money.
In an empty folder:
npm install meetmate
npx meetmate init # the wizard collects your API keys, voice ID, and LLM endpoint — and tells you where to get each
npx meetmate start # starts the server and prints the settings-UI URL
Open the printed URL — it's the settings UI, not the dashboard yet. If anything required is still empty (or you skipped init entirely — the server still starts, just in setup mode), a banner tells you what's missing; fill it in, save, and restart. One exception can't be filled in from the browser: the LLM connection values (gateway URL/token or the OpenAI-compatible key) are environment-only — the init wizard writes them to .env for you, so if you skipped it, add them there. Once it's loaded, open the dashboard at the same host's /, paste a Meet or Zoom URL, and click Join — here's what that screen looks like. Approve the bot's "Ask to join" request in Meet — then call its wake word and start talking. (For Discord there's no URL: pick the Discord transport on the same dashboard and enter the server and voice-channel IDs — the setup guide's Discord section covers creating the bot first.) ngrok/Tailscale and the Meet admission step stay manual; the wizard's closing message and the Setup guide walk you through them.
What it does
- It's a participant, not a notetaker. Your agent shows up in the participant grid with its own avatar, listens to the room, and speaks — with wake-word detection and barge-in (talk over it and it stops; Meet/Zoom — barge-in is not part of the Discord path).
- It's your agent. Connect the agent you already use — with its memory, personality, and skills — via OpenClaw Gateway. The same "them" your team already knows walks into the room, so no two Meetmates sound alike. (No gateway? Any OpenAI-compatible endpoint works too, as a simpler baseline: plain LLM, built-in persona — see LLM providers.)
- Ask it things, right there. "Summarize where we landed and post it to the channel." Heavy work is delegated to a background session automatically, so the agent stays in the conversation while the task runs.
- Ordinary is the point. No push-to-talk, no special commands, no awkward silences. You talk to it the way you talk to a colleague — that this feels unremarkable is the product.
- Works where you meet, runs where you work. Google Meet, Zoom, and Discord voice channels on the meeting side; Windows, macOS, and Linux on the server side. A config file, your API keys, one command — add a custom avatar if you like.
What it looks like
One screen, one job: get your agent into the room. This is the dashboard, at / — once setup is done, it's one click away from the settings UI (the screen npx meetmate start actually prints the URL for). (Its labels are Japanese today; the captions below tell you what each step does.)
-
Start. Once setup is done, this is what greets you at
/. The big field takes a meeting; Join stays disabled until it has one. -
Paste an invite. A bare Meet/Zoom URL works — but so does a whole calendar invite, pasted as-is. Meetmate extracts the meeting URL for you (the green "検出済み" line) and enables Join.
-
Join and wait at the door. A session card appears the moment you click — the elapsed timer starts right away, next to the WS status and your agent's name. The bot spins up (🔄 起動中...), asks Meet for admission, and the WS status flips to connected once it's in the room.
-
Admit it in Meet. The one manual step, on your side of the call — approve the bot's "Ask to join" request like any other guest. Then call its wake word and start talking.
The Setup guide walks through the same flow with more detail, from API keys to first hello.
Where the bot runs. The Meet/Zoom bot runs on Attendee cloud by default; you can switch to a self-hosted Attendee (its own URL, key and lip-sync offset) in the settings UI — see Choosing where the bot runs for the resource numbers, the 15 fps ceiling and the Attendee licence note.
Configure from the browser. Every day-to-day setting lives behind that same settings UI — vendor keys, the wake word, the greeting, voice presets, connection tests — organized into tabs, with per-field notes on whether a change applies live or needs a restart. There's no repo to clone or JSON to hand-edit; only connection values like the gateway URL/token (and a couple of generated tokens) stay in .env as environment values.
See the settings reference for the full tab-by-tab breakdown.
What a meeting feels like
From the moment you call its name to the moment it leaves:
- You say its wake word — it comes alive and listens.
- It greets the room once when it joins, then stays quiet until you address it.
- Mid-meeting, talk to it like a colleague: ask it a question, have it look something up, ask it to drop a note in Slack, or hand it a task to track.
- Say goodbye and it signs off with a short farewell before leaving the call.
- After the call, if you've connected Slack, a summary and any captured action items are already waiting there.
A quick exchange, mid-meeting:
You: "Meetmate, can you check what changed in the pricing doc since Monday?"
Meetmate: [soft voice] Got it, checking now.
...a few seconds later...
Meetmate: [warm] Two changes — the annual discount moved to 15%, and a new
enterprise tier was added. Want me to post the diff to the channel?
Current status
Want the avatar to move? Two experiments already ship: a frame-swap lip-sync avatar that animates six PNGs in time with speech (v8.4.0), and a 2.5D-rig proof of concept. The static image stays the default — the frame-swap avatar section of the setup guide shows how to try the frame-swap one (it needs Fish Audio TTS and a public HTTPS origin); the rig PoC has no user docs yet.
Platform notes
What you need
The init wizard collects the API keys, the voice ID, and the LLM endpoint for you; ngrok/Tailscale and the Meet admission step remain manual. This table is the reference for what each item is and when it applies.
Enter keys through the init wizard or the settings UI — vendor keys (Soniox / Deepgram / Fish Audio / ElevenLabs / OpenAI-compatible TTS / Attendee / Slack) are stored in config.json (created with permissions 0600), while LLM connection values (gateway URL/token and the OpenAI-compatible LLM key) live in .env. Do not commit either file, screenshots of secrets, or shared config files with live credentials.
If you connect a tool-capable OpenAI-compatible gateway, keep that route local and trusted. Meetmate's trust opt-in is intended only for a trusted meeting with a trusted local gateway; external or untrusted meetings remain unsupported for that mode.
From source (for contributors)
git clone [email protected]:caty-ai/meetmate.git
cd meetmate
npm install
cp .env.example .env && cp config.json.example config.json # then fill in the keys
npm start
Why we built this
Meetings are where humans actually collaborate — decisions, nuance, tone, the "oh wait, one more thing" moments. If your AI agent lives only in a chat box, it misses all of that.
We believe agents should sit where their humans sit. Not as a transcription bot at the edge of the call, but as a colleague in the grid: present, addressable, useful. And because it's your agent — with its own memory and character — the difference is between "an AI joined the call" and "she joined the call."
Meetmate is deliberately a small tool. It doesn't try to run your meeting, score your calls, or replace your calendar. It puts your agent in the room. Everything else is up to the two of you.
How it works
%%{init: {'theme':'base', 'themeVariables': {
'primaryColor': '#EEEBFB', 'primaryTextColor': '#10131A', 'primaryBorderColor': '#7C3AED',
'secondaryColor': '#F1F3F7', 'secondaryTextColor': '#10131A', 'secondaryBorderColor': '#E2E5EC',
'mainBkg': '#F1F3F7', 'nodeBorder': '#E2E5EC', 'lineColor': '#7C3AED',
'textColor': '#10131A', 'edgeLabelBackground': '#FFFFFF',
'fontFamily': '-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica, Arial, sans-serif'
}}}%%
flowchart LR
M["Google Meet / Zoom"] -->|meeting audio| S["Speech to text"]
S --> W{"Wake word?"}
W -->|yes| L["Your agent<br/>(OpenClaw Gateway or<br/>OpenAI-compatible LLM)"]
L --> T["Text to speech"]
T -->|agent's voice| M
L -.->|heavy tasks| B["Background delegation"]
One agent = one server instance.
Multiple agents? Run one Meetmate instance per agent (see the setup guide’s second-instance section). Let meet-floor-hub arbitrate who speaks. In-meeting agent switching inside one instance is not supported.
The server bridges meeting audio into a speech pipeline (speech-to-text → your agent's LLM → text-to-speech) and streams the reply back into the call — fast enough to feel like conversation.
Full engineering detail — architecture, module map, providers, audio specs — lives in docs/TECHNICAL.md.
Configuration
Entry points for the most common tweaks. The full reference is docs/operations.md.
Disconnecting cloud arbitration removes saved installation credentials, but cannot remove a HUB_TOKEN supplied by the operating-system environment.
Something not working? See Troubleshooting.
Documentation
ℹ️ Some documents under
docs/are currently in Japanese; the reference tables and command snippets are language-neutral.
Project status
- Releases: See GitHub Releases for published versions.
- In progress: npm distribution and public release track (#3 / #4)
Contributing
Issues and PRs welcome — see CONTRIBUTING.md. We use an issue-first flow and Conventional Commits.
Acknowledgments
Meetmate stands on excellent services and OSS: Attendee (meeting bot infrastructure), Soniox (real-time STT), Fish Audio (expressive TTS), OpenClaw Gateway (agent infrastructure — SOUL / memory / skills / tools), and the OpenAI-compatible LLM ecosystem.