Every gstack specialist — CEO, CSO, QA Lead, Senior Designer, SRE, Spec Partner, and 13 others — joins your Google Meet, Zoom, or Teams as a real voice bot with its own 3D avatar. Stdlib-only Python on the server, vanilla JS on the client, your Claude Code session as the brain. Open source. MIT.
Built on top of garrytan/gstack (the slash-command persona library, by Garry Tan, President & CEO of YC) and AgentCall (the meeting-bot platform). Huge thanks to Garry for shipping the personas — see Thanks Garry at the bottom.
curl -fsSL https://raw.githubusercontent.com/pattern-ai-labs/gstack-joins-meeting/main/install | bashThat clones the repo to ~/gstack-joins-meeting and registers it as a Claude Code skill at ~/.claude/skills/gstack-joins-meeting/. Then set your AgentCall key:
export AGENTCALL_API_KEY="ak_ac_..."That's it. Nothing to build, no requirements.txt, no Postgres. Open Claude Code and say:
"Bring the CEO into this meeting: https://meet.google.com/abc-defg-hij"
The CEO bot joins the call (~30s for avatar mode), introduces itself, listens, and replies in voice as you talk. Your Claude session is the brain — see SKILL.md for the brain-loop.
Or open the dashboard manually:
python3 ~/gstack-joins-meeting/server.py
# → http://localhost:8765 — paste Meet URL, pick specialists, dispatch| id | Name | Role | Voice |
|---|---|---|---|
office-hours |
YC Office Hours | YC Office Hours partner | am_michael |
plan-ceo-review |
CEO | CEO | am_adam |
plan-eng-review |
Eng Manager | Engineering Manager | bm_george |
plan-design-review |
Senior Designer | Senior Designer | af_sarah |
plan-devex-review |
DX Lead | Developer Experience Lead | bf_emma |
design-consultation |
Design Partner | Design Partner | bf_isabella |
design-shotgun |
Design Explorer | Design Explorer | af_nicole |
design-html |
Design Engineer | Design Engineer | am_michael |
review |
Staff Engineer | Staff Engineer | bm_lewis |
investigate |
Debugger | Debugger | am_adam |
design-review |
Designer Who Codes | Designer Who Codes | af_bella |
devex-review |
DX Tester | Developer Experience Tester | bf_emma |
qa |
QA Lead | QA Lead | af_sarah |
cso |
CSO | Chief Security Officer | am_michael |
ship |
Release Engineer | Release Engineer | bm_george |
land-and-deploy |
Deploy Engineer | Deploy Engineer | bm_lewis |
canary |
SRE | Site Reliability Engineer | am_adam |
retro |
Retro Facilitator | Retrospective Facilitator | bm_george |
spec |
Spec Partner | Spec Authoring Partner | bf_isabella |
Each id maps 1:1 to an upstream gstack slash command (tracked against v1.47.0.0). The six built-in team presets — Founding, Design, Build & Review, QA & Ship, DX, Retro — live in data/teams.json.
┌─────────────────────────────────────────────────────────────┐
│ YOUR LAPTOP │
│ │
│ ┌──────────────┐ │
│ │ Claude Code │ Monitor /tmp/gstack-intelligence/inbox │
│ │ session │◄────────────────────────────────────────┐│
│ │ (the BRAIN) │ Write replies → outbox/<id>.jsonl ││
│ └──────┬───────┘ ││
│ │ ││
│ ┌──────▼─────────┐ HTTP /dispatch ┌───────────────┐ ││
│ │ server.py ├────────────────────►│ specialist_ │ ││
│ │ :8765 dash │ │ runner.py │ ││
│ └────────────────┘ │ (per bot) │ ││
│ └────────┬──────┘ ││
│ │ ││
│ bash launch- ││
│ visual.sh ││
│ ▼ ││
│ ┌────────────────┐││
│ │ vendor/bridge- │││
│ │ visual.py │││
│ └────────┬───────┘││
└───────────────────────────────────────────────────┼────────┘│
│ │
AgentCall │ │
WebSocket ▼ │
┌──────────────────┐│
│ meet.google │┘
│ .com │
└──────────────────┘
Three things to internalize:
- The bots have no LLM.
vendor/bridge.pyandvendor/bridge-visual.pyare stdin/stdout shims around AgentCall's WebSocket. They emit events (call.bot_ready,user.message,tts.done) and accept commands (tts.speak,send_chat,leave). All decision-making is done by you (Claude) via the intelligence bus. - The intelligence bus is two files.
/tmp/gstack-intelligence-$(id -u)/inbox.jsonlcollects user transcripts.outbox/<id>.jsonlis where you append{"text":"…"}lines that get spoken by that specific bot. server.pyis the dispatcher. A 700-line stdlib HTTP server. No framework. No build step. The dashboard atlocalhost:8765is one HTML file (index.html) readingdata/specialists.json+data/teams.jsonas the single source of truth.
See SKILL.md for the mandatory brain-loop (monitor inbox → reply in character → recall). See ARCHITECTURE.md for the full data flow.
gstack-joins-meeting/
├── README.md ← you are here
├── SKILL.md ← brain-loop instructions for Claude
├── CLAUDE.md ← project-level Claude instructions
├── ARCHITECTURE.md ← data flow + design decisions
├── CONTRIBUTING.md ← how to add a specialist / mode
├── SECURITY.md ← threat model + 9 findings (all addressed)
│
├── install ← one-line installer
├── server.py ← dashboard + /dispatch + /recall (stdlib HTTP)
├── specialist_runner.py ← per-specialist runtime (one process per bot)
├── index.html ← dashboard UI
├── specialists.js ← AUTO-GENERATED from data/specialists.json on boot
├── data/ ← canonical JSON: specialists, teams
├── avatars/ ← per-specialist DiceBear character SVGs + glyph fallback
├── avatar-page/ ← bot's video feed (rendered by AgentCall headless browser)
├── vendor/ ← vendored AgentCall bridges (with patches)
├── scripts/ ← launch.sh, launch-visual.sh, kill-session.sh
├── bin/ ← brain-status.sh diagnostic
│
└── hosted/ ← OPTIONAL: multi-tenant wrapper for self-hosting a SaaS
variant. Most installers can ignore this entirely.
See hosted/README.md.
The hosted/ subtree is only for maintainers / operators. If you just want gstack specialists in your meetings, you never touch it.
| Mode | What the bot has | Latency |
|---|---|---|
avatar (default) |
Voice + 3D character avatar (DiceBear lorelei) | ~30s join, voice + visual |
audio |
Voice only, no avatar tile | ~10s join, voice only |
Avatar mode tunnels a local python -m http.server on :3000 (serving avatar-page/) through AgentCall's WebSocket relay so each bot's video tile is a name-keyed SVG character.
The common failure modes, in roughly the order you'll hit them:
- Bot joined but is silent. AudioContext on AgentCall's headless Chrome starts in
suspendedstate. We patch.resume()inavatar-page/agentcall-audio.js. If you've forked, double-check that patch is intact. Audio mode skips this whole path — trymode: "audio"if avatar audio is failing. - Bot greeted but never spoke again. No Claude session is monitoring
inbox.jsonl. The bots have no LLM — seeSKILL.mdfor the brain-loop. Runbin/brain-status.shto check. - Two bots talking over each other. The cross-bot speech lock at
/tmp/gstack-intelligence-*/speaking.lockshould prevent this. If you see overlap, the watchdog releases a stale lock after 12s.bash scripts/kill-session.sh sessions/session-<ts>/is the hard reset. /dispatchreturns 200 but no bot. Checksessions/session-<latest>/orchestrator.log. AgentCall key issues show up as 401/403 on the first request.- Recall doesn't take.
bash scripts/kill-session.sh sessions/session-<ts>/is the hard reset — appends{"command":"leave"}to every cmds file, then SIGTERM/SIGKILL.
Pattern AI Labs runs a hosted demo at the URL in the repo description — paste a Meet URL, get a quick taste, no install required. If you like it, come back and run the 60-second install above so it uses your own Claude session + your own AgentCall key.
(Want to host your own SaaS variant of gstack? See hosted/HOSTING.md.)
This project would not exist without Garry Tan — President & CEO of Y Combinator — open-sourcing gstack. Every specialist on this page (the way they ask questions, what they refuse to soften, the rhythm of their feedback) is his work. This repo just bridged it to a meeting tile.
Thanks also for everything you do for the early-stage tech ecosystem — the founders you fund, the tools you ship, the public conversations you host. This is one developer's way of saying it back.
If you ship something on top of this, tell us what you broke. PRs welcome — see CONTRIBUTING.md.
MIT. Same as upstream gstack and AgentCall.
- garrytan/gstack — the specialist personas. MIT.
- AgentCall — the meeting-bot platform. Commercial; free tier covers prototyping.
