This is a third-party project: written and maintained by its author, not by Vexa. It is licensed AGPL-3.0-or-later, with a commercial license available for closed SaaS or proprietary embedding. File issues and feature requests on its own repo, not Vexa’s.
What it does
The bridge runs as a long-running container, not a one-shot script. It repeats one pass on an interval: list completed meetings across the platforms you configured, skip anything already done or too short to be worth summarizing, fetch the speaker-tagged transcript, summarize it through any OpenAI-compatible endpoint, and write the result into your vault. Alongside the poll it can also receive Vexa’s signedmeeting.completed webhook (see Webhooks) and process that meeting immediately instead of waiting for the next tick; the poll stays the fallback for anything the webhook misses.
Two modes
BRIDGE_MODE=note (default): one LLM call per completed meeting, written straight into a vault folder. Pick the sink with OBSIDIAN_SINK: fs writes markdown files into a bind-mounted vault directory (VAULT_DIR), mcp writes through the vault-as-MCP plugin instead. Works against any Vexa 0.12 deployment, hosted included.
BRIDGE_MODE=graph: no LLM runs in the bridge itself. Each transcript is uploaded into a Vexa agent workspace, a standing agent routine folds it into a markdown knowledge graph, entities for person, company, project, meeting, decision, and topic, all wikilinked, and the bridge pushes that workspace to git. Your vault mirrors the repo: pull it (the bridge does this itself when it can reach the vault, otherwise keep it pulled with the Obsidian Git plugin or a timer). Graph mode needs a self-hosted Vexa 0.12 stack with agent-api reachable and a Claude Code credential configured there; the hosted service and the Kubernetes deployment don’t expose /agent/* yet.
What you need
-
A Vexa API key scoped
tx(minted below) and a base URL (Authentication):Running the bridge on the same Docker network as Vexa’s gateway? Use the service name instead oflocalhost, e.g.http://gateway:8000(the stock compose file names itgateway). -
An OpenAI-compatible endpoint for summarization: a self-hosted ollama’s
/v1, or any cloud provider LiteLLM understands. -
For
BRIDGE_MODE=graphonly: a self-hosted Vexa withagent-apiup, and a private git repo to hold the workspace.
Setup
1
Mint a per-user token
Scope it The
tx, the bridge only reads meetings and transcripts:token field in the response is your VEXA_API_KEY. See Authentication for what $ADMIN / $ADMIN_TOKEN are.2
Point it at a model
Set
AI_BASE_URL to any OpenAI-compatible endpoint, a self-hosted ollama at .../v1, or a cloud provider, and set AI_MODEL in LiteLLM’s provider/model dialect: openai/qwen2.5:7b for ollama, anthropic/claude-sonnet-5 for Anthropic, and so on.3
Add the service to your compose file
Same network as Vexa’s gateway service (
gateway in the stock compose file). The repo ships a compose-snippet.yml with the full block; the shape is:4
Bind-mount a vault folder
Set
VAULT_DIR to a host folder synced into your actual vault, by Syncthing, iCloud, a git repo, whatever you already use to get files onto the machine where you read notes.5
Start it
Configuration
Events
WEBHOOK_ENABLED=true starts a small HTTP receiver in the same container; set WEBHOOK_PUBLIC_URL and the bridge calls PUT /user/webhook for you at startup. Without it, wire the two up yourself with Webhooks: point webhook_url at the bridge’s public address and select meeting.completed. Either way, deliveries are verified with the same X-Webhook-Signature scheme Vexa signs with; WEBHOOK_SECRET is the shared secret on both sides.