Back to rankings

Vexa-ai/vexa

Pythonvexa.ai

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.

google-meetmeeting-assistantmeeting-minutesmeeting-notesms-teamsnotetakerzoomms-teams-app
Star Growth
Stars
2.6k
Forks
389
Weekly Growth
β€”
Issues
135
1k2k
Feb 2025Jul 2025Jan 2026Jul 2026
ArtifactsPyPIpip install vexa
README
Vexa logo

Vexa

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.

License: Apache 2.0 Version Self-hosted Discord

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:

  1. 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.

  2. Your knowledge is files you own. Meetings compile into Markdown in a git repo β€” portable, diffable, greppable. Knowledge as code.

  3. 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

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 run make lite (the single-container all-in-one image) but make all (Docker Compose) will likely fail or timeout. make lite is 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.

One API gateway routes to two domains β€” Meetings and Agents β€” both running on one runtime that spawns each bot and agent in its own sandboxed container on Docker, Kubernetes, or Process.

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.v1 lifecycle, 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 β†’ stream GET /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) or k8s (a Pod per dispatch).
  • Transcription is a separate GPU unit β€” make all runs GPU-free; stand up the STT service (faster-whisper, OpenAI-compatible) from deploy/transcription on any GPU box and point .env at 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) and POST /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 return 404 today. 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.md to 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.