Introduction
vexp is a local-first context engine for AI coding agents. It builds a live dependency graph of your codebase, then serves your agent only the code that matters for the task — plus session memory across days and an optional local AI layer for an extra +30 % token savings. Everything runs on your machine.
The VS Code extension is the primary distribution. A standalone CLI (npm install -g vexp-cli) is available for terminal-only workflows. Both bundle the same native engine and MCP server — no Node runtime, no external dependencies, no account required.
How it works
Index
vexp parses your source files and builds a graph stored at .vexp/index.db (local, gitignored). A small 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, vexp identifies the pivot nodes that matter via semantic search + graph traversal. Session memories from previous work are surfaced too.
Capsule
Pivot files are returned in full; supporting files as compact skeletons (signatures only). The result fits the configured token budget — typically 8 000 tokens.
Installation
Pick a distribution. The VS Code extension is the fastest path; the CLI is for terminal-only setups (Claude Code, Codex, scripts, remote machines).
Install from the Extensions panel
Open Extensions (Ctrl+Shift+X / ⌘⇧X), search for vexp, and click Install.
The extension bundles the native engine for your platform. There is no Node runtime to install, no separate compilation, and nothing to download afterwards. Open any project folder and indexing starts automatically.
vexp.binaryPath in Settings to point at a locally-built vexp-core.Platform support
| Platform | Minimum OS |
|---|---|
| Linux x64 | Ubuntu 20.04+, Debian 11+, RHEL/Rocky 8+, WSL2 |
| Linux arm64 | Same minimum as Linux x64 |
| macOS Intel | macOS 11 (Big Sur) or later |
| macOS Apple Silicon | macOS 11 (Big Sur) or later |
| Windows x64 | Windows 10 or later |
First Run
Pick your distribution below. Both paths end with the same result: a working index, a configured AI agent, and a daemon that auto-restarts when needed — usually within 30 seconds on a typical project.
- Indexing starts automatically. Open a project folder. The status bar shows
vexp: indexingwhile it works, thenvexp: 1,247/2,000when ready. - Agents are configured. Accept the extension's setup prompt, or run
vexp: Setup Agentsfrom the Command Palette. vexp detects installed AI agents (Claude Code, Cursor, Copilot, Codex, and more) and writes the right config file for each. - Login autostart is installed. On the first setup, vexp installs a per-user login hook (no admin needed) so the daemon comes back at every reboot.
- Your AI agent just works. If the daemon was ever killed, it auto-restarts the next time an agent calls a tool — no manual management. Use the sidebar panel to monitor or stop it.
- NotePersonal mode: enable
vexp.personalModein Settings to skip writing shared-repo files (.claude/CLAUDE.md,.cursor/rules, git hooks). Useful when you want vexp on someone else's repo without changing their files.
VS Code Features
Beyond what your AI agent calls via MCP, vexp gives you visible feedback directly in VS Code (works the same in Cursor and Windsurf).
Sidebar panel
Click the vexp icon in the Activity Bar to open a sidebar with:
- Status header (running / indexing / error / stopped) and live index stats (nodes, edges, files, uptime).
- Token Savings dashboard with a period selector (today, 7 / 14 / 30 / 60 / 90 days) and an Export button that writes a markdown report to
.vexp/token-savings-report.md. - Local LLM section with Install / Start / Disable / Check-updates / Status buttons, plus a first-run modal that offers to enable it.
- Contextual actions: Force Re-index, Generate Context Capsule, Add / Connect Repository, Setup Agents, Settings, View Daemon Logs.
- Repository cards (status dot, file count, last-indexed time). A toggle shows or hides empty repos.
The panel auto-refreshes every 10 seconds.
CodeLens
Exported functions, classes, and types in TypeScript, JavaScript, Python, Go, Rust, Java, C#, C, C++, Ruby, and Bash get an inline annotation: N dependents across M files. Click it to open the impact graph for that symbol. Available on the Pro plan.
Hover
Hover any exported symbol in the same languages (TypeScript, JavaScript, Python, Go, Rust, Java, C#, C, C++, Ruby, Bash) to see its dependents count, cross-repo usage, and top callers. Pro plan.
Status bar
The left-side status bar shows the current state. Click it to open your license status.
| State | Meaning |
|---|---|
vexp: indexing | Indexing in progress |
vexp: 1,247 nodes | Healthy, unlimited plan |
vexp: 1,800/2,000 | Starter — close to node limit (yellow) |
vexp: 1.8k · 12/20 | Starter — daily-call usage after node count; warning (yellow) at ≥75% of the daily cap |
vexp: daily limit reached | Starter — paused until midnight UTC (red) |
vexp: 2,000/2,000 | Starter — node limit reached (red) |
vexp: starting… | Daemon booting |
vexp: stopped | Daemon not running |
vexp: error | Daemon failed — check logs |
Linked repos in VS Code
The active workspace's .vexp/workspace.json governs how repos are linked. See Multi-Repo Workspaces for the cross-repo features.
Commands
Everything you'll actually type, organized by where you type it.
Command Palette
Open the palette (Ctrl+Shift+P / ⌘⇧P), type vexp, and pick:
vexp: Project SetupAuto-detect installed AI agents, write config files, install git hooks.vexp: Setup AgentsMulti-select picker for AI agents (already-installed ones are pre-marked).vexp: Setup Multi-Repo WorkspacePick additional repos; vexp creates .vexp/workspace.json and enables cross-repo queries.vexp: Generate Context Capsule for Current TaskType a task description; vexp opens a panel with the pivot files and supporting skeletons.vexp: Show Impact Graph for Symbol at CursorOpen a panel showing what depends on the symbol you have selected.vexp: Show File SkeletonPick a detail level and see the file's structure without bodies.vexp: Show Index StatusOpen a panel with node / edge / file counts and uptime.vexp: Start IndexingStart the daemon if it's not running.vexp: Stop IndexingGracefully stop the daemon.vexp: Force Re-indexConfirm, then fully restart the daemon and re-index the project.vexp: Activate License KeyPaste a Pro / Team license key.vexp: Show License StatusSee plan, expiry, and links to manage your subscription.vexp: SettingsOpen VS Code Settings filtered to vexp options.MCP Tools
Your AI agent uses these tools through MCP. You won't call them directly — your agent does — but it helps to know what each one does.
| Tool | Purpose | When to use |
|---|---|---|
run_pipeline | Primary tool. Context search + impact analysis + memory recall in one call. Auto-detects intent. | Every task |
get_context_capsule | Lightweight context search with relevant memories. | Quick lookups |
get_impact_graph | What breaks if a symbol changes. Cross-repo supported. | Before refactoring |
search_logic_flow | Execution paths between two symbols. | Debugging |
get_skeleton | Token-efficient file structure (minimal / standard / detailed). | Exploring unfamiliar code |
get_session_context | Observations from current and previous sessions. | Recalling earlier work |
search_memory | Cross-session search with a "why this surfaced" rationale. | Finding past decisions |
save_observation | Persist an insight; optionally linked to a symbol for staleness tracking. | Recording context |
index_status | Indexing health, stats, available repo aliases. | Checking health |
workspace_setup | Generates agent configuration files. | First-time setup |
run_pipeline at a glance
run_pipeline replaces the older multi-step workflow with a single call that picks the right strategy for your task.
For multi-repo workspaces, scope a query with repos: ["backend", "shared"].
run_pipeline, get_context_capsule, and get_skeleton count against the Starter daily quota (20 / day, resets midnight UTC). All other tools — memory, impact, flow, status — are unlimited on every plan.Session Memory
vexp remembers what your agent explored, decided, and learned — automatically, across sessions and days. Memories are linked to the code graph, so when the underlying code changes, related memories are flagged stale (your agent sees that the past decision may no longer apply).
How it works
- Auto-capture. Every MCP tool call your agent makes becomes a compact observation in the local database.
- Auto-surface.
run_pipelineandget_context_capsuleinclude relevant memories in the result — no extra tool calls needed. - Each result explains itself. A short rationale tells the agent why this memory surfaced (matching the task, recent activity, related code, etc.).
- Staleness tracking. When code linked to a memory changes, the memory is marked stale and demoted in ranking — but still shown with a warning so the agent can re-evaluate.
The three memory tools
All three are available on every plan, including Starter:
get_session_context— observations from the current and previous sessions.search_memory— cross-session search across everything vexp has captured.save_observation— manually record an insight. Optionally link it to a symbol so it gets flagged when that symbol changes.
Supported Agents
vexp auto-detects and auto-configures 12 AI coding agents. Running vexp setup writes the correct configuration file for each installed agent, including tool-usage instructions tailored to that agent.
| Agent | Files written | Transport |
|---|---|---|
| Claude Code | .claude/CLAUDE.md + ~/.claude.json + .claude/hooks/vexp-guard.sh | stdio |
| Cursor | .cursor/rules + .cursor/mcp.json | stdio |
| Windsurf | .windsurf/rules.md + .windsurf/mcp.json | stdio |
| GitHub Copilot | .github/copilot-instructions.md + .vscode/mcp.json | stdio |
| Zed | .zed/rules.md + .zed/settings.json | stdio |
| Continue.dev | .continue/config.json | stdio |
| Codex | AGENTS.md + ~/.codex/config.toml | stdio — direct; opt-in HTTP on 127.0.0.1:7821 |
| Opencode | AGENTS.md | instructions only (no MCP file) |
| Kilo Code | .kilocode/rules.md + .kilocode/mcp.json | stdio |
| Kiro | .kiro/steering/vexp.md + .kiro/settings/mcp.json | stdio |
| Augment | .augment/guidelines.md | instructions only (no MCP file) |
| Antigravity | .antigravity/rules.md | instructions only (no MCP file) |
Multi-Repo Workspaces
vexp can index multiple repositories as a unified workspace and detect relationships between them — entirely on your machine. Useful for monorepos split across repos, frontend + backend pairs, and microservices.
Setup
Create .vexp/workspace.json in your primary repo, or click Add / Connect Repository in the sidebar.
Cross-repo edge detection
vexp automatically detects three kinds of relationship across repos:
| Type | How vexp detects it | Example |
|---|---|---|
| API contract | OpenAPI / Swagger spec matched to consumer HTTP calls | Backend exposes /api/users; frontend fetches it |
| Shared types | package.json dependency matching between repos | Both repos import @company/shared-types |
| Env contract | .env.example keys matched to process.env / os.environ usage | Backend defines DATABASE_URL; worker reads it |
Querying across repos
run_pipelineandget_context_capsulequery all indexed repos by default.- Scope with
repos: ["backend"]. - Use
cross_repo: trueonget_impact_graphandsearch_logic_flowto trace across repo boundaries. - Use
repo: "alias"onget_skeletonto target a specific repo. - Call
index_statusto see available repo aliases.
Switching workspaces from the CLI
If you have several configured workspaces and use Codex, vexp use <workspacePath> repoints Codex's global MCP config at a different one without re-running setup.
.vexp/parent_workspace.json auto-written during setup.Local LLM (optional)
vexp ships an optional on-device AI layer that improves prompt preprocessing and compression for additional token savings. Everything runs on your machine — no cloud, no account, no code leaving your laptop. Typical extra savings: +30 % tokens on top of the baseline.
Multi-language intent detection covers 15 languages: English, Italian, French, German, Spanish, Portuguese, Russian, Chinese, Japanese, Korean, Arabic, Hindi, Turkish, Dutch, Polish.
Install & manage
One-time download (~3.5 GB). Files stay on disk after a disable, so re-enabling is instant. Requires at least 6 GB of RAM; below that the installer declines and vexp stays on the built-in rule-based compressor. On NVIDIA Linux/Windows machines, a one-time CUDA plugin (~62 MB) and CUDA 12 runtime (~550 MB) are also downloaded automatically.
The sidebar's Local LLM section shows the model status and these buttons:
- Install LLM (primary, blue) — when not yet installed. First-run modal also offers this.
- Start LLM (primary, blue) — when installed but disabled.
- Check LLM updates (secondary) — always available; compares your model with upstream without downloading.
- Disable LLM (red, destructive) — when active. Files stay on disk.
- LLM Status — diagnostic panel with hardware, files, backend count.
GPU acceleration
Works the same in both distributions. On Apple Silicon and Intel Macs, Metal is detected and used automatically. On Linux or Windows with an NVIDIA GPU, CUDA is detected and used automatically — no flag or environment variable is needed. If no usable GPU is found, inference silently falls back to CPU.
NVIDIA GPUs are supported on Linux and Windows; a one-time CUDA plugin download is fetched automatically. The first GPU inference may take a few seconds to warm up.
Configuration
vexp works out of the box. Tune it via VS Code settings, .vexp/vexp.toml, environment variables, or ignore files.
VS Code settings
All under the vexp. prefix in Settings or your settings.json:
| Setting | Type | Default | Description |
|---|---|---|---|
vexp.enabled | boolean | true | Master toggle for the extension |
vexp.maxContextTokens | number | 8000 | Default token budget for context capsules |
vexp.skeletonDetail | enum | "standard" | minimal / standard / detailed |
vexp.autoCommitIndex | boolean | true | Include the manifest in git commits |
vexp.gitHooksInstall | boolean | true | Install pre-commit / post-checkout / post-merge hooks |
vexp.multiRepo.enabled | boolean | true | Multi-repo workspace support |
vexp.multiRepo.workspaceConfig | string | ".vexp/workspace.json" | Path to the workspace config |
vexp.telemetry.enabled | boolean | false | Anonymous usage telemetry (opt-in; never code content) |
vexp.mcpPort | number | 7821 | MCP HTTP port — used only when vexp.codexMcpTransport is set to http |
vexp.codexMcpTransport | enum | "direct" | How vexp configures the Codex IDE MCP server (direct stdio vs VS Code-managed HTTP); a config you wrote by hand is left untouched |
vexp.binaryPath | string | "" | Override the vexp-core binary path (escape hatch) |
vexp.logLevel | enum | "warn" | error / warn / info / debug |
vexp.personalMode | boolean | false | Skip agent configs + git hooks for this workspace |
vexp.hideInternalFiles | boolean | true | Hide .vexp internal files from the explorer |
.vexp/vexp.toml
Optional file at the project root. Useful for ranking hints and indexing limits:
Environment variables
| Variable | When to set it |
|---|---|
VEXP_CORE_PATH | Bundled binary won't run — point at a locally-built vexp-core |
VEXP_HOME | Override the home directory used for ~/.vexp/ state (license, config, daemon registry). Set this when running inside a sandboxed environment (e.g. Codex, containers, CI) where the OS-resolved home directory differs from the real user profile. Must be an absolute path. |
VEXP_NO_AUTOSTART_INSTALL=1 | Don't install login autostart on first vexp setup |
VEXP_PORT=<port> | MCP HTTP port (default 7821) — set if 7821 is taken |
Manifest & git
.vexp/index.db is local-only (gitignored by default). .vexp/manifest.json contains a small list of content hashes and is committed to git — clones rebuild incrementally from it (typically < 5 s on a 5 000-file repo). A merge driver auto-resolves manifest conflicts. Git hooks (pre-commit, post-checkout, post-merge) keep the index in sync. Disable any of this with vexp.autoCommitIndex / vexp.gitHooksInstall. Existing hooks coexist via marker-delimited blocks.
Ignore files
vexp honours .gitignore, .vexpignore, and .vexp_ignore — all using gitignore syntax. Common directories are excluded by default: node_modules, .git, target, dist, .next, __pycache__, build, vendor, Pods, DerivedData, .expo.
Supported Languages
vexp parses 27 programming languages plus Markdown. Each of the 27 programming languages has a dedicated tree-sitter grammar with language-specific extraction; Markdown is indexed via a structural heading scan (no tree-sitter).
| Language | Extensions |
|---|---|
| TypeScript | .ts, .tsx |
| JavaScript | .js, .jsx, .mjs, .cjs |
| Python | .py |
| Go | .go |
| Rust | .rs |
| Java | .java |
| C# | .cs |
| C | .c, .h |
| C++ | .cpp, .cc, .cxx, .hpp, .hh, .hxx |
| Ruby | .rb |
| Bash | .sh, .bash |
| Kotlin | .kt, .kts |
| Scala | .scala, .sc |
| Swift | .swift |
| Dart | .dart |
| PHP | .php |
| Elixir | .ex, .exs |
| Haskell | .hs |
| OCaml | .ml, .mli |
| Lua | .lua |
| R | .r, .R |
| Zig | .zig |
| HCL / Terraform | .tf, .hcl |
| Objective-C | .m, .mm |
| Clojure | .clj, .cljs, .cljc |
| F# | .fs, .fsx, .fsi |
| Dockerfile | Dockerfile |
Markdown indexing
Markdown files (.md, .mdx, .markdown) are first-class index nodes. Each file becomes a Document node (named after the file stem); each ATX heading (# through ######) becomes a nested Section node; each http:// or https:// URL becomes a Link node (URLs inside fenced code blocks are skipped).
Planning documents — spec.md, plan.md, tasks.md, README.md, ADRs under docs/adr/, RFCs under docs/rfcs/ — get a ranking boost when an agent searches for design or architecture context. Surfaced through run_pipeline and get_skeleton like code files.
Troubleshooting
Pick your distribution for the distro-specific issues, then check the cross-distro table below for the rest.
| Symptom | Diagnose | Fix |
|---|---|---|
| Extension does nothing | View → Output → dropdown "vexp" | Open a folder with a supported source file (or .vexp/manifest.json) |
| Index never updates | vexp: Show Index Status | vexp: Force Re-index |
| Bundled binary won't run | See the binary error in the Output panel | Set vexp.binaryPath in Settings |
| macOS "unidentified developer" | — | System Settings → Privacy & Security → Allow vexp (signed & notarised) |
| Sidebar empty / no repos | Check status header in the sidebar | Use vexp: Start Indexing or reload the window |
Cross-distro issues
These apply whether you use the VS Code extension or the CLI.
| Symptom | Diagnose | Fix |
|---|---|---|
| Agent can't reach vexp | vexp daemon-cmd status | Re-run vexp setup, or run vexp doctor to diagnose daemon/MCP state |
| Port 7821 in use | vexp daemon-cmd status | Set vexp.mcpPort (VS Code) or VEXP_PORT (CLI) and re-run vexp setup |
| Daily limit reached (Starter) | Status bar shows "daily limit reached" | Wait until midnight UTC, or upgrade to Pro |
| LLM "no backends are loaded" | vexp setup-llm --status | Re-install with vexp setup-llm --install (refetches GPU shaders) |
| LLM out of disk | du -sh ~/.local/share/vexp/models | vexp setup-llm --disable, then delete the models folder |
| CUDA crash on newest NVIDIA GPUs | Run vexp version and confirm the core version is ≥ 2.0.19 | Upgrade to vexp 2.0.19 or later, which adds support for the latest NVIDIA GPU generation. |
| Pro license shows as FREE / 2000 nodes in sandboxed env (Codex, containers) | Run vexp index and check stderr for home_dir= — if it shows a sandbox path, the license files are not there | Set VEXP_HOME to the real user home in your MCP/agent config (e.g. VEXP_HOME=C:\Users\yourname) |
| Not sure what's wrong / agent can't reach vexp | vexp doctor | Read-only check of workspace drift, stale daemons, Codex transport, and license (works without a running daemon). |
| Want logs | vexp daemon-cmd logs --follow | Or open .vexp/daemon.log directly |
.vexp/daemon.log and the index log .vexp/vexp.log are the next stop. Both are auto-truncated to 500 lines when they exceed 2 MB.Privacy & Security
vexp is designed for codebases you can't send to the cloud. Everything runs on your machine.
- Local-only by default. Zero network calls for parsing, indexing, or querying. The only outbound call is an optional, opportunistic license refresh — opt out by going offline (vexp keeps a 14-day grace period).
- No code execution. vexp parses your code with tree-sitter; it never runs it.
- Telemetry is opt-in. Telemetry is opt-in and off by default. The
vexp.telemetry.enabledsetting exists for future use; today vexp transmits nothing. - Signed binaries. macOS builds are signed and notarised; Windows builds use Authenticode EV signing.
- Secret filtering (default on). Files named like credentials are dropped at index time:
.env,.env.production,.env.local,id_rsa,*.pem,*.key,secrets.yaml,secret.md,password.json,credentials.toml, and similar filename-boundary matches. - Template files allowlisted.
.env.example,.env.sample,.env.templateare not excluded — they document contracts, not secrets. - Filename boundary matching. Legitimate source files that just contain the word
secret,password, orcredentialin their name — e.g.src/secret-manager.ts— are not excluded. - Custom exclusions. Add patterns to
.vexpignore(gitignore syntax). To disable the secret filter entirely, setfilter_secrets = falseat the top level of.vexp/vexp.toml.
Plans & Quotas
Quotas at a glance. For prices and the upgrade button, see the full pricing on the homepage.
| Plan | Nodes | Repos | Daily calls |
|---|---|---|---|
| Starter (Free) | 2,000 | 1 | 20 / day (resets midnight UTC) |
| Pro | 50,000 | 3 | unlimited |
| Team | unlimited | unlimited | unlimited |
run_pipeline, get_context_capsule, and get_skeleton. Memory tools, impact graphs, flow analysis, savings reports, and index status are unlimited on every plan.What happens at the limits
- At 80 % of the node cap (Starter), you get a one-off warning.
- At 100 % of the node cap, new nodes stop being added. Your existing index keeps working — no data loss.
- At 20 daily calls, the next call to a quota-affected tool returns a limit-reached error and the daemon shuts down. Your index and session memories are preserved; the quota resets at midnight UTC (or upgrade to Pro/Team for unlimited calls).
License activation
Run vexp: Activate License Key from the Command Palette and paste your key, or click the magic link in the activation email — vexp activates without any further input.
Offline use
vexp refreshes your license quietly in the background whenever you're online. If you stay offline, you keep working at your current plan for up to 14 days. After that vexp falls back to Starter — no data loss, and your previous plan returns automatically the next time you're online.
Account portal
Manage your subscription, devices, and team at vexp.dev/account (magic-link login). Team owners can add or remove members; each member logs in independently.