Introduction
vexp is a local-first context engine with session memory that reduces token consumption by 65–70% for any AI coding agent. Instead of passing entire files to the model, vexp analyzes your codebase with tree-sitter, builds an AST dependency graph, and returns only the relevant pivot nodes plus compact skeletons of supporting files. It also remembers what the agent explored, decided, and learned — across sessions, linked to the code graph.
The VS Code extension is the primary distribution. A standalone CLI (npm install -g vexp-cli) and a direct binary mode (vexp-core mcp --workspace .) are also available for terminal-only workflows. The extension is fully self-contained: the Rust daemon (vexp-core) and the MCP server (vexp-mcp) are bundled inside the package — no external dependencies required.
How it works
Index
tree-sitter parses your source files and builds a SQLite graph in .vexp/index.db (local, gitignored). A manifest.json with per-file content hashes is committed to git — teammates rebuild incrementally from the manifest in seconds.
Traverse
Given a natural-language task description, vexp identifies the most relevant pivot nodes via semantic search + graph traversal, ranking by centrality and relevance score.
Capsule
Pivot files are returned in full; supporting files are skeletonized (signatures + docstrings only). The result fits in the configured token budget — typically 8 000 tokens.
Installation
vexp is available as a VS Code extension (for VS Code, Cursor, Windsurf, and any Electron fork) or as a standalone CLI for terminal-only workflows. Both include the same Rust daemon and MCP server — choose the distribution that fits your setup.
Install from the Extensions panel
Open the Extensions panel (Ctrl+Shift+X / ⌘⇧X), search for vexp, and click Install. The same steps apply in Cursor and Windsurf — both expose the standard VS Code Extensions panel.
npm install, or manual setup are required after installation.Platform support
| Platform | Architecture | Binary target |
|---|---|---|
| Linux | x64 | x86_64-unknown-linux-musl |
| Linux | arm64 | aarch64-unknown-linux-musl |
| macOS | x64 (Intel) | x86_64-apple-darwin |
| macOS | arm64 (Apple Silicon) | aarch64-apple-darwin |
| Windows | x64 | x86_64-pc-windows-gnu |
First Run
The extension activates automatically when you open a workspace containing source files in any of its 30 supported languages. On first activation it:
- Selects and verifies the correct native binary for your platform.
- Starts the
vexp-coreRust daemon. - Starts the
vexp-mcpMCP server on port 7821. - Checks for an existing
.vexp/manifest.jsonin the git root. - If the manifest exists → runs an incremental rebuild from the manifest (usually under 5 s).
If not → runs a full background index (progress bar visible in the status bar).
Workspace setup command
Run the setup command from the Command Palette to configure AI agents automatically. vexp detects which agents are present in your workspace and writes the appropriate config files.
> vexp: Setup Workspace
This generates agent-specific configuration files (e.g. .claude/CLAUDE.md, .cursor/rules, .windsurf/rules) that instruct the agent to call run_pipeline before any code modification.
Status bar
The vexp status bar item is always visible at the bottom of the editor window:
◈ vexp: 34.8k nodes | ⟳ indexing...
◈ vexp: 34.8k nodes | ✓ ready
◈ vexp: error — click for details
Git hooks
On first run, vexp offers to install lightweight git hooks for .vexp/manifest.json conflict resolution and incremental sync. Hooks use # --- vexp start/end --- markers so they safely coexist with existing hooks (husky, lint-staged, etc.) without overwriting them. A VS Code notification lets you approve or decline. The merge driver is a simple binary invocation — it does not depend on Node or npm.
Configuration
All settings are accessible via File → Preferences → Settings (search for vexp) or directly in your settings.json.
| Setting | Type | Default | Description |
|---|---|---|---|
vexp.enabled | boolean | true | Enable or disable the extension entirely. |
vexp.maxContextTokens | number | 8000 | Maximum tokens per context capsule. Increase for larger models (e.g. 16000 for Claude Opus). |
vexp.skeletonDetail | "minimal" | "standard" | "detailed" | "standard" | Default skeleton detail level for supporting files. minimal ≈5%, standard ≈15%, detailed ≈30% of original token count. |
vexp.autoCommitIndex | boolean | true | Automatically include .vexp/manifest.json in git commits. |
vexp.gitHooksInstall | boolean | true | Install git merge driver for manifest.json conflict resolution on first run. |
vexp.multiRepo.enabled | boolean | true | Enable multi-repo workspace support (cross-repo graph queries). |
vexp.multiRepo.workspaceConfig | string | ".vexp/workspace.json" | Path to the workspace configuration file for multi-repo setups. |
vexp.mcpPort | number | 7821 | HTTP port for the MCP server. Change if 7821 conflicts with another service. |
vexp.logLevel | "error" | "warn" | "info" | "debug" | "warn" | Log verbosity for the vexp daemon. Set to "debug" when troubleshooting. |
vexp.telemetry.enabled | boolean | false | Opt in to anonymous usage telemetry (token savings %, latency averages). No code content is ever sent. |
Example settings.json
{ "vexp.maxContextTokens": 16000, "vexp.skeletonDetail": "detailed", "vexp.autoCommitIndex": true, "vexp.logLevel": "warn" }
Commands
All commands are available from the Command Palette (Ctrl+Shift+P / ⌘⇧P). Type vexp to filter.
vexp: Setup WorkspaceDetects installed AI agents and writes agent-specific MCP configuration files. Run this once after installing the extension in a new project.vexp: Generate Context Capsule for Current TaskOpens an input dialog where you describe your current task. vexp returns the most relevant code in a compact, token-efficient capsule.vexp: Show Impact Graph for Symbol at CursorAnalyzes the symbol under the cursor and shows all callers, importers, and transitive dependents. Useful before refactoring exported functions.vexp: Show File SkeletonGenerates and displays a skeleton of the current file — function signatures, class declarations, and type definitions without implementation bodies.vexp: Setup Multi-Repo WorkspaceInteractive wizard to configure a multi-repository workspace. Creates .vexp/workspace.json and configures cross-repo indexing.vexp: Force Re-indexDiscards the current index and runs a full re-index of all workspace files. Use when the incremental index appears out of sync.vexp: Configure WorkspaceOpens the workspace configuration UI where you can adjust index settings, excluded paths, and language preferences.vexp: Show Index StatusDisplays current index statistics: file count, node count, edge count, last indexed commit, and daemon uptime.vexp: Activate License KeyOpens an input box where you paste a JWT license key (from your email or the checkout success page). Activates your Pro or Team plan and displays a confirmation with your plan and email.vexp: Show License StatusShows your current plan (Free, Pro, Team, or Expired), node usage count, and license expiry date. Includes an Upgrade button (if free) or Renew button (if expired) that opens vexp.dev/#pricing.Supported Languages
vexp uses tree-sitter grammars bundled directly in the binary — no downloads at runtime.
| Language | Extensions | Coverage | Status |
|---|---|---|---|
| TypeScript | .ts | Full | v1.0 |
| JavaScript | .js, .mjs, .cjs | Full | v1.0 |
| TSX / JSX | .tsx, .jsx | Full | v1.0 |
| Python | .py | Full | v1.0 |
| Go | .go | Full | v1.0 |
| Rust | .rs | Full | v1.0 |
| Java | .java | Full | v1.1 |
| C# | .cs | Full | v1.1 |
| C | .c, .h | Full | v1.1 |
| C++ | .cpp, .hpp, .cc | Full | v1.1 |
| Ruby | .rb | Full | v1.1 |
| Bash | .sh | Full | v1.1 |
| Kotlin | .kt, .kts | Full | v1.2.30 |
| Scala | .scala | Full | v1.2.30 |
| Swift | .swift | Full | v1.2.30 |
| Dart | .dart | Full | v1.2.30 |
| PHP | .php | Full | v1.2.30 |
| Elixir | .ex, .exs | Full | v1.2.30 |
| Haskell | .hs | Full | v1.2.30 |
| OCaml | .ml, .mli | Full | v1.2.30 |
| Lua | .lua | Full | v1.2.30 |
| R | .r, .R | Full | v1.2.30 |
| Zig | .zig | Full | v1.2.30 |
| HCL / Terraform | .tf, .hcl | Full | v1.2.30 |
| Objective-C | .m, .h | Full | v1.2.30 |
| Dockerfile | Dockerfile | Full | v1.2.30 |
| Clojure | .clj, .cljs | Full | v1.2.30 |
| F# | .fs, .fsx | Full | v1.2.30 |
Supported Agents
When you run vexp: Setup Workspace, the extension scans for known AI agents in your workspace and automatically writes or patches their configuration files to register vexp as an MCP server.
| Agent | Config file generated | Transport |
|---|---|---|
| Claude Code | .claude/CLAUDE.md | stdio |
| Cursor | .cursor/rules | HTTP/SSE |
| Windsurf | .windsurf/rules | HTTP/SSE |
| GitHub Copilot | .vscode/mcp.json (patch) | HTTP/SSE |
| Continue.dev | .continue/config.json (patch) | HTTP/SSE |
| Augment | .augment/guidelines.md | HTTP/SSE |
| Zed | .zed/settings.json (patch) | stdio |
| Codex | AGENTS.md | stdio |
| Opencode | AGENTS.md | stdio |
| Kilo Code | .kilocode/rules.md | HTTP/SSE |
| Kiro | .kiro/steering/vexp.md | HTTP/SSE |
| Antigravity | .antigravity/rules.md | HTTP/SSE |
http://localhost:7821. Any MCP-compatible agent can connect using the standard HTTP + SSE transport.Manual configuration
vexp auto-configures your agents when you run vexp: Setup Workspace (VS Code) or vexp setup (CLI). If auto-detection doesn't work, you can create configuration files manually.
Finding the MCP server path
Every manual configuration requires the path to the MCP server bundled inside the extension. The path follows this pattern:
# VS Code ls ~/.vscode/extensions/vexp.vexp-vscode-*/dist/mcp-server.cjs # Cursor ls ~/.cursor/extensions/vexp.vexp-vscode-*/dist/mcp-server.cjs # Windsurf ls ~/.windsurf/extensions/vexp.vexp-vscode-*/dist/mcp-server.cjs
Copy the full path returned — you'll use it as <path> in the examples below. On Windows, replace ~ with %USERPROFILE%.
Claude Code
Claude Code uses a global config at ~/.claude.json with stdio transport.
{
"mcpServers": {
"vexp": {
"command": "node",
"args": ["<path>/mcp-server.cjs"]
}
}
}Cursor
Create .cursor/mcp.json in your project root.
{
"mcpServers": {
"vexp": {
"command": "node",
"args": ["<path>/mcp-server.cjs"]
}
}
}Windsurf
Create .windsurf/mcp.json in your project root. The alwaysAllow array pre-approves all vexp tools (they are read-only).
{
"mcpServers": {
"vexp": {
"command": "node",
"args": ["<path>/mcp-server.cjs"],
"alwaysAllow": [
"run_pipeline", "get_context_capsule",
"get_impact_graph", "search_logic_flow",
"get_skeleton", "index_status",
"workspace_setup", "submit_lsp_edges",
"get_session_context", "search_memory",
"save_observation"
]
}
}
}GitHub Copilot
Create .vscode/mcp.json in your project root. Note: VS Code uses the servers key (not mcpServers) and requires "type": "stdio".
{
"servers": {
"vexp": {
"type": "stdio",
"command": "node",
"args": ["<path>/mcp-server.cjs"]
}
}
}Zed
Add to .zed/settings.json in your project root.
{
"context_servers": {
"vexp": {
"command": {
"path": "node",
"args": ["<path>/mcp-server.cjs"]
}
}
}
}Continue.dev
Merge the following into .continue/config.json.
{
"mcpServers": [
{
"name": "vexp",
"command": "node",
"args": ["<path>/mcp-server.cjs"],
"type": "stdio"
}
]
}Other agents
Augment, Kilo Code, Kiro, Codex, Opencode, and Antigravity use markdown rules files (e.g. .augment/guidelines.md, .kiro/steering/vexp.md). These are generated automatically by vexp: Setup Workspace and instruct the agent to use vexp MCP tools. For these agents, the MCP connection happens via the HTTP endpoint at http://localhost:7821 — no additional JSON config is needed.
http://localhost:7821. The port is configurable via vexp.mcpPort (VS Code) or --port flag (CLI).MCP Tools
vexp exposes 11 MCP tools. Your AI agent calls them automatically based on the instructions in the generated config file. You can also call them directly from the Command Palette for debugging.
run_pipeline first before any code modification. It combines context search, impact analysis, and memory recall into a single call with auto-intent detection.Primary Tool
Single-call pipeline that combines context search, impact analysis, and memory recall. Auto-detects intent (debug/modify/refactor/explore) from the task description. Returns compressed results with full file content for pivot files. ~60% fewer context tokens vs multi-call workflow.
Parameters
taskstringNatural-language description of the current task.preset"auto"|"explore"|"debug"|"modify"|"refactor"= "auto"Analysis preset. Auto-detects from task keywords.max_tokensnumber= 10000Total token budget for pipeline output.include_testsboolean= falseInclude test files (auto-enabled for debug preset).include_file_contentboolean= trueInclude full file content for pivot files.observationstringAuto-save an observation after the pipeline completes.reposstring[]= allRepo aliases to query (multi-repo only).Specialized Tools
Returns the most relevant code for a given task — pivot files in full, supporting files as skeletons. Automatically includes relevant memories from previous sessions. Use this before any code change.
Parameters
querystringNatural-language description of the current task.reposstring[]= allLimit query to specific repo aliases (multi-repo only).max_tokensnumber= 8000Token budget for the capsule.pivot_depthnumber= 2Graph traversal depth from pivot nodes.include_testsboolean= falseInclude test files in the capsule.skeleton_detail"minimal"|"standard"|"detailed"= "standard"Detail level for supporting file skeletons.Shows all code that would break or be affected if a symbol changes. Use before refactoring exported functions or changing public APIs.
Parameters
symbol_fqnstringFully qualified name, e.g. src/auth/auth.ts::validateToken.depthnumber= 5Maximum traversal depth.cross_repoboolean= trueInclude cross-repo dependents.format"list"|"tree"|"mermaid"= "tree"Output format.Finds execution paths between two symbols — how data or control flows from A to B through the call graph.
Parameters
startstringFQN of the start symbol.endstringFQN of the end symbol.max_pathsnumber= 3Maximum number of paths to return.cross_repoboolean= trueAllow cross-repo traversal.Returns token-efficient skeletons of one or more files — signatures, class declarations, and type definitions without implementation bodies (70–90% token reduction).
Parameters
filesArray<{repo?: string; path: string}>Files to skeletonize.detail"minimal"|"standard"|"detailed"= "standard"Skeleton detail level.Returns current index statistics: file count, node count, edge count, daemon uptime, and indexing progress.
Special onboarding tool. Detects installed agents, generates config files, and returns a workspace.json template. Typically called once at project setup.
Submits type-resolved call edges captured from the VS Code Language Server. Supplements static analysis with runtime type information for higher-confidence call graphs.
Parameters
edgesArray<{caller: string, callee: string}>Array of caller/callee FQN pairs from the language server.Session Memory Tools (Free Tier)
The following 3 tools are available on all plans, including Starter. They provide session memory linked to the code dependency graph.
Returns observations from the current and optionally previous sessions, with stale flags and chronological ordering. Use this to see what the agent has explored and decided.
Parameters
include_previousboolean= falseInclude observations from previous sessions.max_resultsnumber= 50Maximum observations to return.Cross-session hybrid search combining text relevance, semantic similarity, recency, and code-graph proximity. Each result includes a 'why' field explaining how it was ranked — no black box.
Parameters
querystringNatural-language search query.max_resultsnumber= 10Maximum results to return.Manually persist insights, decisions, or errors with optional symbol linking via FQN resolution. Linked observations are auto-flagged stale when the code changes.
Parameters
contentstringThe observation text to save.type"insight"|"decision"|"error"|"manual"= "manual"Observation type for categorization.linked_symbolsstring[]Optional FQNs to link the observation to code symbols.run_pipeline's observation parameter to save insights in the same call — it avoids an extra tool call roundtrip.Session Memory
vexp automatically captures what the agent explores, decides, and learns — across sessions, across repos, linked to the code dependency graph. When code changes, linked memories are marked stale automatically. Both run_pipeline and get_context_capsule auto-surface relevant memories from previous sessions.
Auto-capture
Every MCP tool call (except index_status, workspace_setup, and save_observation) is automatically recorded as a compact observation. Per-tool extraction captures the most relevant data: get_context_capsule records intent + pivots + file paths, get_impact_graph records the symbol FQN, and so on.
Capsule memory auto-surfacing
get_context_capsule automatically includes relevant memories from previous sessions — no extra tool calls needed. Memories are ranked using a multi-signal scoring formula combining text relevance, semantic similarity, recency, and code-graph proximity — with a staleness penalty for outdated observations.
Passive file change detection
vexp passively monitors every file change in real time via a file watcher. When a change is detected, vexp computes AST-level structural diffs — not just "file modified" but exactly which symbols changed and how:
| Change type | Meaning |
|---|---|
| Added | New symbol in the file |
| Removed | Symbol deleted |
| Renamed | Symbol renamed (detected automatically) |
| SignatureChanged | Function signature changed |
| BodyChanged | Implementation changed |
| VisibilityChanged | Export/private toggled |
A background process automatically correlates file changes with recent agent activity and generates observations linked to the affected code symbols.
Anti-pattern detection
vexp automatically detects common agent anti-patterns and generates error-type observations:
- Dead-end exploration — a symbol is added then removed in the same session, indicating wasted effort.
- File thrashing — a file is modified repeatedly in quick succession, suggesting the agent is stuck in a loop.
Progressive nudge system
vexp gently reminds agents to use save_observation for important decisions. The nudge intensity decreases over time: a full explanation on the first tool call, a brief one-liner every 5 calls, and it self-disables entirely once the agent cooperates (calls save_observation at least once in the session).
Staleness detection
Observations linked to code symbols via save_observation are automatically marked stale when those symbols change during incremental sync. Stale observations are penalized in search ranking but not deleted — the reasoning may still be valid even if the code changed.
Progressive disclosure
Observations are returned at 3 detail levels depending on the context:
| Level | Tokens | Used in |
|---|---|---|
| L1 Headline | ~20 | Capsule auto-inject (memories section) |
| L2 Standard | ~50 | search_memory default, get_session_context |
| L3 Full | ~100 | When max_results ≤ 5 |
Session lifecycle
Each MCP connection gets a unique session ID. vexp auto-creates sessions on first request and detects the agent from environment variables (Claude Code, Cursor, Windsurf, Copilot, etc.).
Sessions inactive for more than 2 hours are compressed by a background task: unique file paths, node IDs, type distribution, and key terms are extracted into a structural summary. Ephemeral tool_call observations are deleted after compression; insight, decision, error, and manual observations are preserved permanently. Sessions older than 90 days are fully deleted.
Memory consolidation
When multiple auto-observations are semantically similar, vexp automatically merges them into a single consolidated observation. This reduces noise from repetitive agent actions while preserving information density. Manual observations (insight, decision, error) are never merged.
Project rules
When the passive observation engine detects recurring patterns in your workflow (3+ similar observations in the same scope), it auto-generates scope-aware project rule candidates. Rules are promoted to active after validation, and auto-invalidated when the relevant code changes significantly. Active rules are injected into get_context_capsule responses — your agent learns your project's conventions without manual configuration.
get_session_context, search_memory, save_observation) are available on the free Starter plan. Memory is the product showcase — it shows the unique value of vexp immediately.Git Integration
vexp stores the full index in .vexp/index.db (local, gitignored) and commits only a lightweight .vexp/manifest.json with blake3 per-file hashes. When a teammate clones the repo, vexp rebuilds the index incrementally from the manifest — typically under 5 seconds for a 5,000-file codebase.
Directory structure
repo-root/
├── src/
└── .vexp/
├── index.db ← SQLite graph (local, in .gitignore)
├── index.db-wal ← in .gitignore
├── index.db-shm ← in .gitignore
├── manifest.json ← per-file content hashes (git-tracked)
└── .gitignore ← excludes index.db and WAL filesManifest-based workflow
vexp commits only manifest.json — a lightweight JSON file containing content hashes for every source file. The full index.db is never committed to git. When you clone or pull:
manifest.jsonarrives via git.- vexp compares the manifest hashes against local files.
- Only changed files are re-indexed — unchanged files are skipped entirely.
This makes commits instant (no binary blob), clone-to-ready time under 5 seconds, and eliminates merge conflicts on large binary files.
Merge conflicts on manifest.json
manifest.json is a regular JSON file, but simultaneous edits on different branches can create conflicts. vexp installs a custom git merge driver (via .gitattributes) that automatically merges manifest.json by taking the union of all file hashes — no manual resolution needed.
Large repositories
Since only manifest.json is committed (~1 KB per 100 source files), repository bloat is never an issue regardless of codebase size. The local index.db can grow to 100+ MB for large codebases but stays out of git entirely.
Opting out of git integration
If you prefer not to commit the manifest, set vexp.autoCommitIndex to false in settings and add .vexp/manifest.json to your .gitignore. Each developer will rebuild from scratch on first open — still fast, but without incremental skip.
Multi-Repo Setup
vexp can index multiple repositories simultaneously and query across their boundaries. This is particularly useful for microservices, monorepos split across multiple git repositories, or frontend + backend pairs.
Setup wizard
Run vexp: Setup Multi-Repo Workspace from the Command Palette. The wizard creates a .vexp/workspace.json and registers each repository.
workspace.json format
{
"name": "my-project",
"version": "1",
"repos": [
{
"alias": "frontend",
"path": "/projects/my-project-frontend",
"languages": ["typescript"],
"role": "consumer"
},
{
"alias": "backend",
"path": "/projects/my-project-backend",
"languages": ["go"],
"role": "provider"
}
],
"cross_repo_links": [
{
"type": "openapi",
"source": "backend:src/api/openapi.yaml",
"consumer": "frontend:src/api/generated/"
}
]
}Cross-repo query
Once configured, MCP tools automatically traverse repository boundaries. Pass multiple repo aliases to target specific repositories:
get_context_capsule query: "Add the roles field to the user API response" repos: ["backend", "frontend"]
VS Code multi-root workspaces
vexp integrates natively with VS Code Multi-root Workspaces (.code-workspace files). When VS Code opens a multi-root workspace, vexp detects all folders, indexes them separately, and activates the cross-repo query engine automatically.
Cross-repo passive tracking
Every file change and tool call is automatically tagged with its repo_alias. The file watcher runs per-repo with a dedicated channel, and the passive correlator and staleness detection operate across repository boundaries. Observations propagate between repos — an insight discovered in the backend is surfaced when querying the frontend if the symbols are linked.
Bidirectional workspace navigation
Opening a secondary repository from a multi-repo workspace automatically loads the entire workspace context. You do not need to re-register repos or re-run the setup wizard — vexp detects the workspace configuration and activates all repos bidirectionally.
Cross-repo storage
Cross-repo relationship data is stored in a local registry shared across all workspaces on the machine. Per-repo indexes remain in each repository's .vexp/index.db (never committed to git).
Troubleshooting
Extension not activating
vexp activates when the workspace contains supported source files (.ts, .py, .go, .rs, etc.) or an existing .vexp/manifest.json.
- Ensure the workspace folder contains at least one supported source file.
- Check the VS Code Output panel: select
vexpfrom the dropdown. - Try
vexp: Force Re-indexfrom the Command Palette.
> Developer: Open Extension Logs Folder
Index not updating
- Check the status bar — if it shows
indexing…, a full re-index is already running. - Run
vexp: Show Index Statusto see the current node count and last indexed commit. - If the daemon appears stuck, restart it via
vexp: Force Re-index.
Port 7821 already in use
Since v1.2.18, vexp automatically tries alternative ports when the default is busy (up to 10 retries) and writes the actual port to .vexp/mcp.port for agent discovery. In most cases, no manual intervention is needed. If you still need to force a specific port, change it in settings:
{
"vexp.mcpPort": 7822
}.claude/CLAUDE.md) will also need to be regenerated via vexp: Setup Workspace.Binary permission denied (macOS / Linux)
On first install, the Rust binary may not be executable. The extension sets the correct permissions automatically, but if you see a permission error:
# Locate the extension folder
$ ls ~/.vscode/extensions/vexp.vexp-*/binaries/
# Make the binary executable
$ chmod +x ~/.vscode/extensions/vexp.vexp-*/binaries/vexp-core-*
macOS Gatekeeper warning
vexp binaries are signed with an Apple Developer Certificate and notarized. If Gatekeeper blocks the binary, open System Preferences → Privacy & Security and click Allow next to the vexp entry.
Daemon crashes on startup
- Set
vexp.logLevelto"debug"and restart VS Code. - Check the Output panel for
vexp daemonlogs. - On Linux: ensure
/tmpis writable (the daemon uses a Unix socket there). - On Windows: ensure the named pipe namespace is accessible (no restrictive AppContainer policy).
Multiple VS Code windows conflict
Since v1.2.18, vexp automatically shares a single daemon across all VS Code windows opened on the same workspace. The first window to start the daemon becomes the owner; subsequent windows adopt the existing daemon. If you experience connection issues across multiple windows:
- Close all VS Code windows for the workspace.
- Delete
.vexp/daemon.sockand.vexp/daemon.pidif they exist. - Reopen VS Code — the first window will start a fresh daemon.
Stale socket after crash
Since v1.2.19, vexp automatically cleans up socket, PID, and port files on shutdown. However, if the daemon was terminated with kill -9, these files may remain. vexp's hook guard detects stale sockets and falls back gracefully, but you can also clean up manually:
rm .vexp/daemon.sock .vexp/daemon.pid .vexp/mcp.port
AI agent not using vexp tools
- Verify the MCP server is running:
vexp: Show Index Status. - Re-run
vexp: Setup Workspaceto regenerate the agent config file. - For Claude Code: ensure the
.claude/CLAUDE.mdfile is in the project root and that Claude Code picks up MCP servers from that file. - For Cursor/Windsurf: check that the MCP extension is enabled in the editor settings and that the port matches
vexp.mcpPort.
vexp.mcpPort, always regenerate agent config files via vexp: Setup Workspace. Agent config files hardcode the port number.Manifest not updating
If manifest.json appears stale, run vexp: Force Re-index (VS Code) or vexp reindex (CLI) to regenerate it.
CLI-specific issues
CLI command not found after install
Ensure the npm global bin directory is in your PATH:
npm config get prefix # e.g. /usr/local
export PATH="$(npm config get prefix)/bin:$PATH"
MCP server not responding (CLI)
Check that no other process is using the default port:
lsof -i :7821
# Change the port:
vexp mcp --workspace . --http --port 7822
vexp-core binary not found (CLI)
The CLI downloads platform binaries on first install. If the download failed, force a reinstall:
npm install -g vexp-cli --force
Permission denied on CLI binary (macOS / Linux)
chmod +x $(npm config get prefix)/lib/node_modules/vexp-cli/binaries/vexp-core-*
Privacy & Security
Local-only by default
Your source code never leaves your machine. vexp runs entirely offline on every plan — Starter, Pro, Team, and Enterprise. Zero network calls, zero cloud dependencies.
Telemetry opt-in
Usage metrics (token savings %, average latency, language distribution) are only collected when vexp.telemetry.enabled is set to true. No code content is ever included.
Secrets detection
Files matching secrets patterns (.env*, *secret*, *credential*, API key patterns) are automatically excluded from indexing and cannot be included in context capsules.
Signed binaries
macOS binaries are signed and Apple-notarized. Windows binaries carry an Authenticode EV certificate. Linux binaries are verified via SHA-256 manifest at startup.
.vexp_ignore
Add a .vexp_ignore file (gitignore syntax) to exclude paths from indexing. This is always respected and cannot be overridden via API or settings.
Sandboxed daemon
The vexp-core daemon never executes user code. tree-sitter operates in parse-only mode — no eval, no code execution, no dynamic import.
Automatic cleanup
The daemon automatically cleans up socket files, PID files, and port files on shutdown — even after unexpected termination. No stale files left behind.
.vexp_ignore example
# Exclude secrets and environment files .env* *.pem *.key secrets/ # Exclude generated code src/generated/ dist/ build/ # Exclude large data directories data/ fixtures/large/
Plans & Limits
vexp counts indexed nodes — not lines of code or file count. A node is a distinct symbol: function, class, method, interface, variable, or type alias. As a reference: the vexp codebase itself (~50 source files) generates ~500 nodes.
Starter
$0
7 MCP tools including run_pipeline (basic) and session memory. 8 pipeline + skeleton calls per day (resets at midnight UTC). Try vexp on a personal project — no account required.
Pro
$19/mo
All 11 MCP tools including full run_pipeline, session memory, multi-repo workspace, intent detection, CodeLens.
Team
$29/user/mo
Shared workspace, priority paths. Flat per-seat pricing.
Enterprise
Custom
Audit log, custom exclusion policies, SHA-256 verification.
Starter plan paywall behavior
vexp never blocks you or loses data at the node limit. As you approach the limit:
- At 80% (1,600 nodes) — a non-blocking informational notification appears in the status bar.
- At 100% (2,000 nodes) — new files are still indexed but excess nodes are excluded from queries. Upgrade to Pro for 50,000 nodes and all 11 tools.
Daily usage quota (Starter)
Starter plan users get 8 pipeline + skeleton calls per day — enough to explore vexp on real projects. The status bar shows your current usage (e.g. 3/8) with color progression as you approach the limit. The quota resets daily at midnight UTC. Pro and Team plans have no daily limits.
Upgrade flow
To upgrade from Starter to Pro or Team:
- Click Start Pro or Start Team on the pricing page.
- Complete payment on Stripe (monthly or annual billing).
- You are redirected to a success page with your license key.
License activation
From the success page or email, choose one of:
- One-click — click
Activate in VS Codeto activate automatically via a deep link. - Copy & paste — click
Copy License Key, then open the Command Palette (Ctrl+Shift+P/⌘⇧P) and runvexp: Activate License Key.
> vexp: Activate License Key
A confirmation message shows your plan name and licensed email.
License status & upgrade prompts
Run vexp: Show License Status (VS Code) or vexp license status (CLI) at any time to see your current plan, node usage, and license expiry date.
vexp also shows automatic upgrade prompts as you approach your plan limits:
- 80% node usage — a non-blocking notification with an
Upgrade to Probutton. - 100% node usage — a warning that excess nodes are excluded from queries, with an
Upgrade to Probutton. - Multi-repo limit — a modal when you try to add a repository beyond your plan limit, with an
Upgrade to Probutton.
License refresh & offline behavior
Both the VS Code extension and the CLI automatically refresh your license every 7 days by contacting vexp.dev. Each refresh extends your license validity by 30 days. No manual action is required.
| Scenario | Behavior |
|---|---|
| Active subscription, online | License auto-refreshes every 7 days. 30-day rolling expiry. |
| Active subscription, offline | 7-day grace period. After 7 days without a refresh, falls back to Starter limits. |
| Cancelled subscription | License expires naturally after 30 days from last refresh. No immediate revocation. |
| Expired license | Extension falls back to Starter tier (2,000 nodes, 1 repo, 7 tools). No data is lost. |
Account management
To manage your subscription or re-activate your license on a new device:
- Go to vexp.dev/account.
- Enter the email associated with your subscription (or your team member email).
- Click the login link sent to your email (magic link, no password required).
- On the account page you can:
- Activate in VS Code — one-click deep link to activate your license instantly.
- Copy License Key — copy the key for manual activation via Command Palette.
- Manage Subscription — open the Stripe billing portal (owner only).
Team member management
Team plan owners can add and remove team member emails directly from the account page. Each member can then log in independently at vexp.dev/account and activate their own VS Code instance — no need to share license keys or forward emails.
- The team owner logs in and sees a Team Members section with a seat counter (e.g. 3/5 seats used).
- Add a member by entering their email and clicking Add. The member count is limited by the number of seats purchased at checkout.
- Remove a member by clicking the X button next to their email.
- Each member logs in with their own email, sees their plan badge, and can activate in VS Code or copy the license key.