Skip to main content
If you keep your notes in Obsidian, you can have every completed meeting land there automatically, summarized and speaker-tagged, without writing or hosting anything of your own. obsidian-vexa-bridge is a small, always-on container that does the whole path: it watches Vexa for meetings that finish, summarizes the transcript, and writes an Obsidian note, or, in its other mode, folds the transcript into a markdown knowledge graph instead.
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 signed meeting.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 of localhost, e.g. http://gateway:8000 (the stock compose file names it gateway).
  • An OpenAI-compatible endpoint for summarization: a self-hosted ollama’s /v1, or any cloud provider LiteLLM understands.
  • For BRIDGE_MODE=graph only: a self-hosted Vexa with agent-api up, and a private git repo to hold the workspace.

Setup

1

Mint a per-user token

Scope it tx, the bridge only reads meetings and transcripts:
The 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.

Source

rennf93/obsidian-vexa-bridge is a third-party project, written and maintained by its author, not by Vexa. It’s licensed AGPL-3.0-or-later, with a commercial license available for closed SaaS or proprietary embedding.