Open-source meeting transcription API for Google Meet, Microsoft Teams & Zoom. Auto-join bots, real-time WebSocket transcripts, MCP server for AI agents. Self-host or use hosted SaaS.
pip install vexaVexa
Open-source, self-hosted meeting bot & transcription API.
A bot joins your Google Meet, Microsoft Teams, Zoom, and Jitsi calls and streams speaker-attributed transcripts in real time through an API you host β then feeds sandboxed agents that build a Markdown knowledge base your team owns. Self-hosted, Apache-2.0, air-gap-ready.
vexa.ai still runs the 0.10.6.13 line β it will host 0.12.
Why Vexa
Every meeting-AI tool you can buy sends your conversations to their cloud and rents you access back. Vexa inverts that: run the stack yourself, point it at your own models, own what your meetings become.
No one else has all three:
Vexa is in the meeting. A real bot joins Meet, Teams, Zoom, and Jitsi and streams speaker-attributed transcripts live. That bot fleet is the genuinely hard part β every "chat with your docs" tool starts after a transcript exists. Vexa produces it.
Your knowledge is files you own. Meetings compile into Markdown in a git repo β portable, diffable, greppable. Knowledge as code.
Agents work it, safely. Sandboxed coding agents read and write that repo like developers β isolated ephemeral containers, no egress, thousands in parallel, on Docker or your Kubernetes.
Only here for the transcription API? It's a complete standalone product β send a bot, read the stream, ignore the agent lane entirely.
Table of contents
- Quickstart
- How it works
- The agentic runtime
- Agents & your workspace
- The Terminal: AI-augmented meetings
- How-to recipes
- Deployment options
- Deploy & configure
- How Vexa is different
- For regulated enterprises
- API reference
- Status & roadmap
- Community & contributing
- License
β‘ Quickstart
Self-host the whole stack on one host, then explore it in the Terminal or drive it over the API. Linux (Ubuntu 24.04) is the production target; a Mac with Docker Desktop works fine for a local evaluation β everything runs in containers either way.
Prerequisites β make, Docker engine β₯ v26 (make all checks), and transcription: a free token at
vexa.ai/account, or self-host the (GPU) transcription unit for a fully
air-gapped setup. Without transcription, bots still join and record β they just produce no text
(make all warns when the credentials block in .env is empty).
Build machine: The full stack (
make all) requires at least 8 vCPUs and 16 GB RAM. A smaller box can runmake lite(the single-container all-in-one image) butmake all(Docker Compose) will likely fail or timeout.make liteis the lighter path for resource-constrained hosts.
git clone https://github.com/Vexa-ai/vexa.git && cd vexa
make all # full Docker Compose stack β seeds .env, builds, prints your API key + URLs
make bot # build the meeting bot from source (required before a bot can join)
When make all finishes it prints your key and URLs:
Terminal UI : http://localhost:13000 # the web workbench
API gateway : http://localhost:18056 # the API
API key : vxa_β¦
Explore in the Terminal (the fast path)
The Terminal is the way to see what Vexa can do. Open http://localhost:13000 β you're
already signed in to a self-host account. From the
workbench you can, with no curl:
- Send a bot β paste a Meet / Zoom / Teams / Jitsi URL; a bot joins as a participant.
- Watch the transcript stream in live, speaker-attributed, draft-then-confirmed.
- Chat with your workspace β ask an agent that has every captured meeting as context, and watch it commit what you decide.
Or drive it over the API
export API_KEY=vxa_...
export API_BASE=http://localhost:18056
# WIN 1 β send a bot into a live call, then read the transcript as it streams
curl -X POST "$API_BASE/bots" \
-H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
-d '{"platform":"google_meet","native_meeting_id":"abc-defg-hij","bot_name":"Vexa"}'
curl -H "X-API-Key: $API_KEY" "$API_BASE/transcripts/google_meet/abc-defg-hij"
# WIN 2 β ask an agent that has your whole workspace as context (answer streams back as SSE)
curl -N -X POST "$API_BASE/agent/chat" \
-H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
-d '{"prompt":"What did we decide in my last meeting?"}'
platform is google_meet Β· teams Β· zoom Β· jitsi; native_meeting_id is the code from the join URL. The
agent reply streams as Server-Sent Events β message-delta frames carry the text, commit frames mark
anything it recorded into your workspace.
π§© How it works
One gateway, two domains β Meetings (capture) and Agents (work the knowledge) β both running on the same runtime: the engine that spawns every bot and every agent in its own sandboxed container.
A bot and an agent are the same runtime.v1 workload β isolated, ephemeral, reaped on idle β so the
machinery already proven by thousands of meeting bots is exactly what runs your agents. Every arrow stays
inside your network.
βοΈ The agentic runtime
A CLI coding agent is just a process on Linux. The runtime makes that a multi-tenant, sandboxed execution layer safe to point at real business data β the same engine that already spawns Vexa's meeting bots in production.
- Isolated. Every dispatch gets its own container: no egress except brokered tools, and only its granted workspaces exist in its filesystem β enforced by the substrate, not by the agent. Agents never run in the control plane.
- Ephemeral. A container lives while it works and is reaped on idle; continuity is a session file in the workspace. Sub-second starts, thousands in parallel.
- Orchestration-agnostic. One
runtime.v1lifecycle, pluggable substrate β the same dispatch runs identically across:
Backend (RUNTIME_BACKEND) |
A workload is⦠| State |
|---|---|---|
docker (default) |
its own container via the Docker socket β brought up with make all |
β Shipped (open core) |
process |
a child process, no Docker socket required | β Available |
k8s |
a bare Pod (kubectl run --restart=Never), scheduled across a cluster |
β
Lifecycle + per-mount workspace isolation; Helm chart in deploy/helm |
Same control plane, same worker β only how the container is created changes. One laptop to a Kubernetes/OpenShift cluster, inside your walls.
π§ Agents & your workspace
Capture is the front door; agents make the knowledge compound. Every meeting compiles into
your workspace β a git repo of Markdown (an Open Knowledge Format
kg/ bundle) that agents (Claude Code, Codex, β¦) read and write like developers work a codebase.
This is Andrej Karpathy's LLM Wiki pattern, run as a team service. The idea: don't RAG over raw documents β where the model rediscovers everything from scratch on every question β have agents compile sources into structured, interlinked markdown entity pages (people, companies, projects, decisions) so knowledge compounds. Vexa builds that wiki for you from the richest source there is: your meetings. Each call is ingested into entity pages; agents keep them current between calls; every answer starts from what your team already knows β on your own servers.
Agents work any workspace; a meeting is just one trigger of four β chat, schedule (cron), event (e.g. incoming email), finished meeting. Meetings themselves are scheduled work: connect your calendar (ICS) and planned meetings appear with attendees β bots auto-join, agents prepare before the call and process after it.
- Multiplayer. Team-shared, attributed workspaces β not one person's private notes.
- Automated. The bot captures the call; the transcript compiles itself in.
- Safe by design. Agents are untrusted and enforce nothing themselves. You, in chat, write directly (git is the undo); untrusted input β an email, a web page β runs propose-only: the agent suggests, a human approves, trusted code applies. Irreversible effects are always gated.
Status (honest): capture, transcription, and speaker attribution are production; the agent dispatch core is built and proven live end-to-end. What's still landing is tracked in Status.
π₯οΈ The Terminal: AI-augmented meetings
0.12 ships a new Terminal UI built to put the backend's scale β thousands of bots and agents β to work on your actual week. It opens on your meetings: coming up, live now, to review.
An agent in your meeting, with your knowledge. Open a live call: the transcript streams speaker-attributed, and the agent has the live conversation and your workspace in context. Ask mid-call "what did we promise them last time?" β or research a person, company, or contract the moment it comes up, grounded in your wiki.
Knowledge built on meetings β and between them. Every planned meeting gets an agent that prepares the brief before (who's coming, history, open threads β it interviews you for what it can't know) and processes the transcript after. Arrive prepared, leave with the wiki updated.
Sharing. Invite colleagues into a workspace β same wiki, attributed. Share a meeting with its attendees β they get the real-time feed, not a recording link after the fact.
Collaborative, AI-augmented meetings. Prep a shared workspace together; during the call, humans edit the brief while agents stream the transcript in and work the knowledge β one room, human and AI participants on the same files.
π How-to recipes
Each is a complete path to one outcome over the Agent API. Full guides at docs.vexa.ai.
π¬ Chat with your workspace β ask an agent that has every meeting, email, and note as context; trusted chat can also record a decision (a git commit).
curl -N -X POST "$API_BASE/agent/chat" -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
-d '{"prompt":"Brief me on the Acme account: every meeting, the open decisions, and the next step."}'
π Brief me every morning β an unattended agent on a cron schedule that commits to your workspace.
curl -X POST "$API_BASE/agent/routines" -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
-d '{"name":"Morning brief","cron":"0 8 * * 1-5",
"prompt":"Brief me from overnight activity β new meetings, decisions, follow-ups due. Write brief/today.md.",
"run_now":true}'
π Report after every meeting β dispatch a one-shot agent when a call ends (or a routine that sweeps recent meetings).
curl -X POST "$API_BASE/agent/invocations" -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
-d '{"runner":"claude-code","workspaces":[{"id":"u_jane","mode":"rw"}],"trigger":"scheduled",
"start":{"entrypoint":{"inline":"Write a report for the meeting that just ended: summary, decisions, action items with owners."}}}'
π§ Triage incoming email (safely) β an event-triggered agent that gets the mailbox read-only and can only propose actions as cards; a human approves before anything is written or sent.
curl -X POST "$API_BASE/agent/events" -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
-d '{"name":"email.received","source":{"uri":"mailbox://u_jane/INBOX/AB12CD"},
"plan":{"prompt":"Triage this email into tasks; propose a record for each action item and a draft reply."}}'
Live-meeting copilot β cards for people, decisions, and action items during the call (
POST /agent/meeting/startβ streamGET /agent/meeting/stream) β is on the roadmap; see Status.
π Deployment options
Two ways to run Vexa, one codebase:
1. Personal / dev β Docker on your Mac, Linux, or Windows machine.
Single container (make lite β the all-in-one Vexa Lite image) or the full Compose stack
(make all). Reuse your Claude subscription: workers run the official claude CLI against
your own Pro/Max credential, which is a covered, credit-metered use under Anthropic's terms for a
personal deployment β your subscription, your turns, your machine. See
Model credentials & licensing for the exact
terms mapping (Anthropic's Agent SDK plan-usage article
is the primary source). You get the full service β bots, transcripts, agents, Terminal β on the
subscription you already pay for.
2. Cloud β Helm on Kubernetes / OpenShift, scalable to thousands of users.
The chart in deploy/helm deploys the same control plane with
RUNTIME_BACKEND=k8s: every bot and every agent is its own Kubernetes workload (a bare Pod
per dispatch), so capacity is your cluster's scheduler, not a bigger box β built multi-tenant and
multiuser from the start. One compliance rule when you go multiuser: other users' turns must run
on an API key (Commercial Terms), never a personal subscription credential β the
licensing page spells out the boundary, and
Settings β Models enforces per-user/global credential resolution. K8s backend status is tracked
honestly in Status.
π Deploy & configure
make all brings up the full stack via Docker Compose on one Linux host β each service in its own
container, bound to loopback:
| Service | Role |
|---|---|
gateway :18056 |
the one front door β auth, scopes, routing |
terminal :13000 |
the web workbench (proxies /ws β gateway) |
| meeting-api | bots, transcripts, recordings |
| agent-api | the agent control plane β dispatch, chat, routines, events |
| runtime | spawns bot + agent containers on demand |
| admin-api Β· redis Β· postgres Β· minio | keys Β· bus + scheduler Β· metadata Β· object storage (recordings + workspaces) |
- Runtime backend β
RUNTIME_BACKEND=docker(default) ork8s(a Pod per dispatch). - Transcription is a separate GPU unit β
make allruns GPU-free; stand up the STT service (faster-whisper, OpenAI-compatible) fromdeploy/transcriptionon any GPU box and point.envat it. Or use a free hosted token at vexa.ai/account while testing. - Bring your own inference β point the agent at your own LLM endpoint; no inference leaves the network.
- Air-gapped β everything in-VPC, zero egress β the posture the regulated verticals require.
- Targets β
make allΒ·make bot(build the bot image from source β required, not pulled) Β·make liteΒ·make up/make downΒ·make help. Expose the Terminal via a TLS reverse proxy for production; full guide in the docs.
π How Vexa is different
The crowded "AI second brain / self-hosted knowledge base" space is full of excellent tools for reasoning over documents you already have. None of them join a live meeting β they consume transcripts other tools produced. That's the whole point: capture is the moat, and it sits upstream of where a document-RAG tool's architecture even starts.
Against the tools developers actually weigh for meeting capture:
| Capability | Vexa | Hosted APIs (e.g. Recall.ai) | DIY (Whisper + your own bot) |
|---|---|---|---|
| Self-hosted / own your data | β | β their cloud | β |
| Real-time transcript API | β | β | π‘ build it |
| Joins Meet + Teams + Zoom + Jitsi | β | π‘ varies | β enormous effort |
| Speaker attribution | β | β | π‘ build it |
| Knowledge as files you own | β | β | π‘ build it |
| Agents over your workspace | β | β | β |
| Open source | β Apache-2.0 | β | β |
Vexa is the one combination the others don't offer: a permissively-licensed (Apache-2.0) meeting-bot-API server that is self-hosted Γ real-time Γ multi-platform Γ knowledge-you-own. And it's complementary to the document-RAG and "second brain" tools β feed them Vexa's clean, attributed transcripts and let them do what they're good at.
The full field β including Attendee (the other open-source meeting-bot API) and the local-notetaker tools β is mapped honestly, trade-offs and all, in How Vexa compares.
π¦ For regulated enterprises
For banks, healthcare, government, and anyone in a regulated industry, the meeting-AI question isn't "which cloud" β it's "how do we get this without a cloud." Vexa is air-gapped meeting intelligence β the sovereign alternative to Microsoft Copilot β built for exactly that buyer.
You don't compete with a notes app here β you replace Microsoft 365 Copilot and Zoom AI Companion on the axes they structurally can't move:
| Microsoft 365 Copilot / Zoom AI Companion | Vexa | |
|---|---|---|
| Deployment | Vendor cloud only | Your cloud, your VPC, or fully air-gapped |
| Models | Vendor-hosted, fixed | Bring your own β local or hosted LLMs |
| Commercial model | Rented, per-seat subscription | Owned β Apache-2.0, no per-seat tax |
| Adaptable | Generic; no custom vocabulary; vendor roadmap queue | Your engineers extend it directly β domain vocabulary, underserved languages, custom workflows |
| Meeting platforms | Teams-only / Zoom-only | Meet + Teams + Zoom + Jitsi |
| Data control | Transits the vendor's cloud | Never leaves your perimeter |
| Extensibility | Closed black box | Open source, API-first |
What that means in practice:
- Air-gapped β fully offline, your infrastructure, your models. Nothing phones home.
- Adaptive β your engineers implement requirements directly: domain vocabulary, underserved languages, custom workflows. No vendor feature queue.
- Owned, not rented β deploy once, extend without asking permission. No per-seat tax.
- Scales inside your walls β thousands of isolated agents in parallel on Docker or your Kubernetes/OpenShift cluster.
Evaluate it for your org β the artifacts a security review asks for, in this repo:
| Artifact | What it answers |
|---|---|
architecture.calm.json |
machine-readable architecture (FINOS CALM) β every service and data flow, drift-gated in CI |
SECURITY.md |
how to report a vulnerability |
security-insights.yml |
OpenSSF Security Insights manifest |
license-exceptions.json |
license gating: Category-A permissive deps, exceptions explicit |
LICENSE |
Apache-2.0 |
Full review page: Security & compliance in the docs.
Regulated banks and Fortune-500s run Vexa fully air-gapped on their own OpenShift and local LLMs today.
π‘ API reference
Two APIs behind the gateway, authenticated with X-API-Key. Base URL: http://localhost:18056
(self-host) or https://api.cloud.vexa.ai (hosted).
Meetings API β capture; usable standalone:
| Method | Endpoint | Description |
|---|---|---|
POST |
/bots |
Send a bot into a meeting (platform, native_meeting_id, bot_name, language, task) |
GET |
/transcripts/{platform}/{native_meeting_id} |
Fetch the real-time transcript (poll while live) |
GET |
/bots/status |
List running bots |
DELETE |
/bots/{platform}/{native_meeting_id} |
Stop / remove the bot |
GET |
/meetings Β· /recordings |
List meetings; list recordings (audio in your own storage) |
Agent API β the control plane, under the /agent/* prefix (identity is derived from your key, server-side):
| Method | Endpoint | Description |
|---|---|---|
POST |
/agent/chat |
Chat over your workspace β streams SSE (message-delta, tool-call, commit, done, error) |
POST |
/agent/invocations |
Dispatch a one-shot agent (e.g. a post-meeting report) |
POST |
/agent/routines |
Create a scheduled (cron) agent routine |
POST |
/agent/events |
Fire an integration event that dispatches an agent (e.g. email triage) |
GET |
/agent/workspace/tree Β· /agent/workspace/file |
Browse and read your Markdown workspace |
platform β google_meet Β· teams Β· zoom Β· jitsi. Full reference: docs.vexa.ai.
v0.12 note: live bot-control β
PUT /bots/{β¦}/config(change language/task mid-call) andPOST /bots/{β¦}/speak(TTS into the call) β plus the live-meeting copilot (/agent/meeting/*) and WebSocket streaming are not yet wired in the open-core stack and return404today. Send-a-bot, stop, status, transcripts, recordings, agent chat, routines, and events are live.
πΊοΈ Status & roadmap
Honest state of the 0.12 line (mirrors the status page β never aspirational):
| Capability | State |
|---|---|
| Bot joins Meet / Teams / Zoom | β Production |
| Bot joins Jitsi Meet (meet.jit.si + self-hosted) | π Built & offline-proven; live validation pending |
| Real-time transcription (Whisper) + speaker attribution | β Production |
| Redis transcript streaming | β Production |
| Recordings to your own object storage (MinIO) | β Available |
| Runtime β Docker backend (container per workload) | β Production |
| Agent chat / routines / events over your workspace | β Built & proven live |
Workspace β git Markdown / OKF kg/ bundle |
π‘ core proven; bucket-backed store landing |
| Runtime β Kubernetes backend (Pod per dispatch) | β
Lifecycle + per-mount isolation; Helm in deploy/helm |
| Live-meeting copilot (cards as the call runs) | π΅ Next |
| Calendar sync (ICS) Β· planned meetings Β· scheduled auto-join | β Production |
| Shared workspaces & shared meetings (invites, real-time feed) | β Built & proven live |
| Agent chat during a live meeting (live transcript + workspace in context) | β Built & proven live |
| WebSocket transcript multiplex | π΅ Planned (poll today) |
| At-rest encryption (workspace Β· transcript Β· tokens) | π΅ Planned |
| Mid-call bot config / speak | π΅ Returns 404 in open-core |
β Production Β· π‘ In progress Β· π΅ Planned
π€ Community & contributing
- Docs β docs.vexa.ai
- Discord β discord.gg/Ga9duGkVz9
- Roadmap β the board, grouped by contributor lane, with milestones as the version gates.
- Contributing β how delivery works: prepared issues with acceptance tables that guarantee merge, and human validation credited as a first-class contribution (one page, law and how-to together).
- Issues & PRs β welcome. See
SECURITY.mdto report vulnerabilities.
Vexa is built in the open. If you self-host it, extend it, or run it air-gapped somewhere interesting, we'd love to hear about it.
π License
Apache-2.0. Own it, run it, fork it, ship it. It's an investment, not a rental.