Whoot — Semantic Branch Search
Find git branches by what they do, not what they're named. Everything runs locally: a local Ollama model summarizes each branch, embeddings are stored in an embedded LanceDB vector store, and you search by meaning from the VSCode command palette or sidebar.
No data leaves your machine.
How it works
- On activation, Whoot enumerates every non-merged branch (local + remote-tracking) in the repo.
- For each branch it collects the commits unique to the branch and a summary of changed files.
- A local LLM (default
llama3.2:3b via Ollama) produces a short summary + tags describing what the branch is trying to accomplish.
- A local embedding model (default
nomic-embed-text) embeds the summary into a vector.
- Vectors are stored locally and keyed per branch, with the branch tip as the freshness key — unchanged branches are skipped on re-index.
- Search embeds your query, does a cosine-similarity lookup scoped to the current repo, and shows ranked matches with summaries.
Prerequisites
You need a working local Ollama install and two models pulled.
- Install Ollama → https://ollama.com/download
- Start the daemon (it usually auto-starts; otherwise
ollama serve)
- Pull the default models:
ollama pull llama3.2:3b
ollama pull nomic-embed-text
Change the models in VSCode settings under Whoot — anything Ollama can serve will work, but if you swap the embedding model you must also update whoot.embedDimensions and run Whoot: Clear Index for Current Repository so the vector store can be rebuilt at the new dimension.
Usage
- Command Palette →
Whoot: Search Branches by Meaning — opens a QuickPick. Type what you want; results are ranked by semantic similarity.
- Sidebar (Activity Bar → Whoot icon) — search box, browsable list of indexed branches with their summaries, re-index button, and Ollama health indicator.
- Status bar
$(git-branch) Whoot — click to open the search QuickPick.
- GitHub Copilot Chat →
@whoot <query> — when the GitHub Copilot extension is installed, Whoot registers as a chat participant. Example: @whoot rate limiting in the API gateway. Results stream as markdown with inline Checkout and Show log links. Slash command /reindex re-indexes the repository.
Result actions: Checkout, Copy branch name, Show git log.
For origin/foo remote-tracking refs, Checkout creates a local tracking branch (git checkout -b foo origin/foo) if foo doesn't already exist locally.
Commands
| Command |
Description |
Whoot: Search Branches by Meaning |
Semantic QuickPick search |
Whoot: Re-index Current Repository |
Force a full re-index (still skips unchanged branches by tip) |
Whoot: Clear Index for Current Repository |
Drop all stored vectors for this repo |
Settings
| Setting |
Default |
Notes |
whoot.ollamaUrl |
http://localhost:11434 |
Ollama daemon URL |
whoot.chatModel |
llama3.2:3b |
Summarization model |
whoot.embedModel |
nomic-embed-text |
Embedding model |
whoot.embedDimensions |
768 |
Must match the embed model. Clear the index when changing. |
whoot.includeRemote |
true |
Index refs/remotes/* in addition to refs/heads/* |
whoot.autoIndex |
true |
Index incrementally on activation |
whoot.reindexOnCheckout |
false |
Run an incremental re-index whenever you check out a different branch |
whoot.autoFetchIntervalMinutes |
0 |
Periodically run git fetch and re-index, in minutes. 0 disables. |
whoot.maxCommitsPerBranch |
50 |
Cap on commits sampled per branch |
whoot.maxFilesPerBranch |
40 |
Cap on changed-file entries in the LLM input |
whoot.indexConcurrency |
2 |
Max parallel Ollama requests |
When does the index refresh?
By default Whoot re-indexes once on extension activation (autoIndex) and then only when you ask it to (status-bar menu, sidebar refresh, or @whoot /reindex). It does not re-index on every git event in the background. Opt in to either of these for more automatic behavior:
whoot.reindexOnCheckout — incremental re-index after every branch checkout.
whoot.autoFetchIntervalMinutes — periodic git fetch --all followed by an incremental re-index.
Known limitations
- First indexing run on a large repo can take a while (one chat + one embed per branch).
- Changing the embed model requires
Whoot: Clear Index for Current Repository because vector dimensions must match the table schema.
- Multi-root workspaces use the first folder's git repo.
- Branches with no unique commits relative to the default branch are skipped.