bibleCode21230 downloadsTransform raw memos into structured notes (meeting minutes, 1:1s, daily) using Claude. Works with Claude Code subscription or Anthropic API key.
한국어 README: README.ko.md
Transform raw memos into structured notes using Claude. Works with your existing Claude Code login (Pro/Max) or with an Anthropic API key.
You scribble fragmented notes during a meeting or a quick thought. You want them turned into proper meeting minutes, a 1:1 summary, a decision record, or your own template — without leaving Obsidian and without copy-pasting into a chat.
ExcaVelo takes:
and produces a clean, structured note via Claude. The memo body is preserved by default.
console.anthropic.com. Pay-per-token. Works on mobile.[!context] callout scaffold.ExcaVelo splits the prompt into three parts:
| Part | Source | Purpose | When does it change? |
|---|---|---|---|
| User context (always-on) | Settings -> "Default context" | Long-lived facts about you / your team / your work | Rarely |
| Note-specific context | A [!context] callout anywhere in the active note |
Facts tied to this single note (participants, date, topic, ...) | Per note |
| Memo body | Everything in the active note outside the [!context] callout |
The content ExcaVelo will rewrite | Per note |
Only the memo body is rewritten. Anything inside [!context] is background — the LLM reads it but does not transform it.
Example:
> [!context]
> Today is a 1:1 with Park, infra team senior.
> Topic: migration risk assessment.
- migration phases — risk
- A: blue-green, B: incremental
- Park prefers B (simpler rollback)
- need a decision by Tuesday
The two lines inside the callout become the note-specific context. The four bullets below become the memo body. The "Default context" you set in Settings is always prepended on top of both.
If a note has no [!context] callout, the entire note becomes the memo body. The Default context from Settings still applies.
Tip: if you only want to transform part of a long note, select that region in the editor before running Transform — selection wins over the full note body.
If writing the [!context] callout by hand each time is tedious, use ExcaVelo: New note from template (command palette). It creates a fresh note with the callout scaffold and a placeholder body, so you only fill in the blanks and start writing.
Two more callouts attach source material to a transform. The memo stays the authoritative record; these fill in what it omits.
[!stt] links speech-to-text transcript files (meeting recordings):
> [!stt] [[2026-07-04 meeting recording]]
The meeting templates use the transcript to recover details, figures, and decisions your memo skipped — recognition errors and small talk are handled by built-in prompt rules, and the memo wins on conflict.
[!git] names local git repositories whose commit history feeds the
transform (desktop only):
> [!git] C:/git/project-a
> D:/git/project-b since:2026-06-26
One path per line; optional since: / until: (ISO dates, today, 7d).
Work counts as done when it lands on the default branch, never when it is merely committed on a branch. ExcaVelo walks the default branch and reports what arrived there, one section per landing — dated by the day it landed, not the day it was written. Work sitting on a branch that has not landed is not reported at all. Merge, squash, and rebase workflows all work; nothing needs configuring.
If you paste branch lines (branch-name subject, straight from git output)
into the memo, ExcaVelo reports exactly the landings carrying those branch
names — ideal for one-branch-per-issue teams. The work-report and work-log
templates are built for this input.
Branch names only survive into history when a team merges with merge commits. Where they don't — squash and rebase workflows — ExcaVelo confirms each pasted branch against the default branch instead, by three checks in order: a landing whose message names it (so a branch deleted after merging still counts), every commit subject of the branch resolving to exactly one landing, or the branch already being part of the base's history.
A branch none of the three confirms is reported nowhere. That is deliberate: a squash can rewrite the subjects it absorbed, leaving no evidence to follow, and naming work as shipped on a guess is worse than leaving it out. Landings that carry no branch name are still reported alongside — bounded to the last 7 days unless you set a window — so the work itself is not lost, only its attribution. Branches you pasted are matched however old their landing is.
Templates are plain markdown files under excaVelo/templates/ in your vault.
Edit them, add new ones, share them. The format is documented in
docs/templates-format.md. Eight starter templates
are copied in on first run:
meeting — cross-team/external meeting: purpose, key points, confirmed decisions, implications, action itemstask-meeting — internal working meeting: key points by topic with technical detail, decisions, open questionswork-report — narrative work report / release notes from git history plus memowork-log — dated work-history changelog from git commits, written for non-developer readers1on1 — complete 1:1 record by topic, decisions, watch itemsdaily-memo — highlights, grouped notes, actions, open questionsdecision-record — ADR-style recordbrainstorm — clustered themes, strong candidates, next stepsOutputs are preservation-first: everything in your memo survives into the
result (templates restructure, they do not summarize away content), except
where a template explicitly says it selects — the cross-team meeting
template does. Each template can also pin a model via model frontmatter,
and Settings has a model picker per provider.
The plugin spawns your installed claude CLI as a subprocess. Auth lives in
Claude Code (claude login), so the plugin never sees a key. Works with personal
Claude Pro accounts and with team-shared Claude Max accounts.
Requires: Claude Code installed and logged in. Desktop only — on mobile, ExcaVelo transparently falls back to the Anthropic API key path (a one-time notice tells you).
A note on Anthropic terms: spawning your own logged-in claude CLI is
mechanically the same as running it yourself in a terminal. ExcaVelo does not
redistribute any Anthropic licence and stores no Anthropic credentials. Using
Claude Code as a backend for another tool is not a documented use case in
Anthropic's product docs — use the CLI path knowing that, or pick the API key
path instead.
Standard pattern. Get a key at console.anthropic.com, paste into settings.
Pay-per-token billing — separate from any Claude.ai subscription. Works on
mobile and desktop.
For OpenAI itself, or any local / hosted server that speaks the OpenAI Chat Completions shape (Ollama, LM Studio, Groq, Together, OpenRouter, vLLM, Fireworks, Mistral, ...).
data.json inside your Obsidian
plugin folder. It is never sent anywhere except to the provider you configured.If your vault includes an excavelo.json at root, the plugin enables smart
defaults — output paths and frontmatter that match the structure of Karpathy-style
LLM Wiki vaults (raw/, wiki/sources/). See
docs/architecture.md for the config schema.
pnpm install
pnpm dev # esbuild watch
pnpm build # production build
Uses pnpm (declared in packageManager). If you don't have it: npm i -g pnpm or corepack enable.
Symlink (or copy) the build output (main.js, manifest.json, styles.css)
into a test vault's .obsidian/plugins/excavelo/ to try it.
Architecture overview: docs/architecture.md.
Provider implementation notes: docs/adapters.md.
Template format: docs/templates-format.md.
Developer spec: CLAUDE.md.
MIT. See LICENSE.