DeepFusion Labs
Home DeepQuery DeepKnowledge DeepInit DeepMap Get in Touch

Coming soonOpen-source release on GitHub

A Claude Code plugin · multi-language · MIT

DeepMap Code RAG that reasons, not just retrieves. Graph + Vector + FTS. 100% local.

DeepMap searches your code three ways at once: graph (how code connects), vector (what code means) and full-text (names and keywords, with fuzzy matching for typos and spelling). It fuses the three into one ranked list. Then Claude reasons over it, with a file:line on every result and a confidence label on every link.

At a glance

  • Impact analysis in one call: callers, routes, jobs and cascades, up to 3 hops out
  • Multi-language: 25 programming languages parsed, 8 of them with their own end-to-end test suites, plus framework wiring for Python, Rails, .NET, Java, Go and TypeScript / JavaScript
  • MIT · 100% local · no cloud · no API key · no Docker
  • RAG = retrieval-augmented generation: Claude looks up your code before it reasons and answers.
deepmap_search · one question, three searches

you ask“Find the code that retries failed uploads.”

  1. GRAPHHow code connectsmore callers, higher rank
  2. VECTORWhat code meansmatches what it does
  3. FTSNames and keywordsfuzzy: typos still match
Fused into one ranked list the three rankings merge into one Each result carries: symbolfile:lineone-line summary
Claude reasons over it the bundled skill tells it to read the cited code and follow the links
How one search runs. A worked impact example is below.

What DeepMap does

The whole idea, in three lines.

  1. 1 · Retrieval

    Retrieves three ways at once.

    Graph + Vector + FTS, fused into one ranked list.

  2. 2 · Reasoning

    Reasons before it answers.

    A bundled skill tells Claude to follow the links and read the cited code.

  3. 3 · Evidence

    Backs every answer with evidence.

    A file:line on every result, a confidence label on every link.

How it retrieves

Three retrieval modes. One ranked answer.

One call to deepmap_search runs all three at once and merges their rankings. You never pick a mode.

GRAPHStructure

How your code connects

Your code as nodes and links in Neo4j, a graph database. In search, code with more callers ranks higher. For “what breaks”, DeepMap walks the links backwards, up to 3 hops, across calls and framework wiring.

“Who calls this? What depends on the User model?”

VECTORMeaning

What your code means

Each function, method and class gets a one-line intent summary. A local model on your CPU turns it into an embedding: a list of numbers that captures meaning. Vector search then finds code by what the code does, even when your words don't appear in it.

“Find the code that retries failed uploads.”

FTSFull-text

Names, keywords and fuzzy matches

Full-text search (FTS) matches your words against names and summaries, the way a search engine does, and ranks the hits by relevance. It is fuzzy: a typo or a different spelling still finds the name.

“retry_faild_charges” still finds retry_failed_charges.

Fused with RRF

Reciprocal Rank Fusion (RRF), a standard way to combine ranked lists, merges the three rankings into one. A result that several modes agree on rises to the top.

The ranking, exactly
  • Vector: similarity between your question and each symbol's name plus its one-line summary (a 768-dimension local model).
  • Full-text: BM25 relevance ranking over names and summaries. Every word of three or more characters is matched fuzzily, within 2 edits, so typos and spelling variants still hit. A method is indexed under its Class.method name.
  • Graph: the vector score boosted by the number of call links pointing at the code: score × (1 + log(1 + callers)). Calls are matched by name, so common names get a lift too.
  • Fusion: Reciprocal Rank Fusion with k = 60. By default the three modes carry equal, fixed weights.

The problem

Your agent greps. Grep can't see how your code connects.

Text search is perfect for finding a name. But “what breaks if I change this?” is about connections, and many never appear as text. Vector search alone finds similar code. It cannot follow a call chain.

One question. Five greps, or one DeepMap call.

“What breaks if I change charge_card()?” in a six-file example app with a checkout API and a background job.

Text search
$grep -rn "charge_card(" .
./billing/payments.py:4:def charge_card(order, amount):
./jobs/retries.py:12:    return charge_card(order, amount_due)
./shop/cart.py:8:    return charge_card(order, total)
./tests/test_payments.py:6:    assert charge_card(order, 0)

$grep -rn "place_order(" .
./admin/tools.py:4:def place_order(form):
./api/orders.py:12:    return place_order(order)
./shop/cart.py:5:def place_order(order):

$grep -rn "create_order" .
./api/orders.py:10:def create_order(order: dict):

$grep -rn "retry_failed_charges" .
./jobs/retries.py:10:def retry_failed_charges(order, amount_due):

$grep -rn "@app." .
./api/orders.py:9:@app.post("/orders")
./jobs/retries.py:9:@app.task

Five searches, and only if you know to look for the decorators.

DeepMap· impact report

›/deep-map:impact "charge_card"

6 dependent(s) of 'charge_card' (reverse reachability; hop · via · confidence):

  1. INFERRED1hvia CALLSplace_order -> charge_cardshop/cart.py:5
  2. INFERRED1hvia CALLSretry_failed_charges -> charge_cardjobs/retries.py:10
  3. INFERRED1hvia CALLStest_charge_declined -> charge_cardtests/test_payments.py:4
  4. INFERRED2hvia SCHEDULED_ASretries -> charge_cardjobs/retries.py:1the file that registers the Celery task
  5. AMBIGUOUS2hvia CALLScreate_order -> charge_cardapi/orders.py:10
  6. AMBIGUOUS3hvia ROUTES_TOorders -> charge_cardapi/orders.py:1the file that declares POST /orders

Note: 2 edge(s) are AMBIGUOUS (the name maps to multiple symbols, or a reflective/dynamic hop) — verify by reading the source.

Computed by DeepMap, not drawn. These rows were produced by its own extraction and link grading on this example app. Each row: confidence label · hops away (1h is a direct caller) · kind of link · dependent → what you asked about · file:line.

the same answer as a tree · charge_card()
  1. charge_card()billing/payments.pyyou're changing this
    1. called byplace_order()functionINFERRED
      1. called bycreate_order()handlerAMBIGUOUS
        1. served atPOST /ordersHTTP routeEXTRACTED
    2. called byretry_failed_charges()functionINFERRED
      1. runs asCelery taskbackground jobEXTRACTED
    3. called bytest_charge_declined()testINFERRED
EXTRACTED read from the code INFERRED matched by name AMBIGUOUS several matches: check it Each link has its own label. A report row shows the weakest label on its path.
What Claude can do with it illustration

Changing charge_card() reaches six places within 3 hops:

  • Direct callers: place_order (shop/cart.py:5), retry_failed_charges (jobs/retries.py:10) and one test.
  • A background job: retry_failed_charges is registered as a Celery task, so it also runs outside any web request.
  • An HTTP route: POST /orders → create_order → place_order. DeepMap marked that path AMBIGUOUS because two functions are named place_order, so I opened api/orders.py:12 and confirmed that it calls the one in shop/cart.py.

Update the three callers, then re-run the order and billing tests.

In a real codebase most call links are AMBIGUOUS (known limits). Claude's answer is an illustration written by us.

Why it's more than retrieval

Most code search returns a list - and stops.

DeepMap ships a reasoning skill with the tools: a set of instructions Claude Code loads with the plugin. It tells Claude how to use the graph, and when not to.

What the skill tells Claude

  1. RouteSend a code question to the right tool: search to find code, impact to see what breaks, read-only Cypher to list and count.
  2. ReadOpen the cited file:line before answering. A result is a lead to confirm.
  3. TraceBefore a refactor, trace the impact first: callers, routes, jobs and cascades.
  4. CaveatSay how sure each link is: EXTRACTED, INFERRED or AMBIGUOUS.
  5. Fall backIf the graph is empty, unreachable or doesn't cover a language, use Grep and Read.

Every answer shows its evidence - and flags what's inferred.

Every result points to a file:line you can open. Every link in the graph carries one of three confidence labels.

  • EXTRACTED

    Read directly from your code

    Declaration and target in the same file, like a route decorator above its handler. Import lines too. Solid.

  • INFERRED

    Matched by name to exactly one symbol

    Only one function, method or class has that name, so the link points there. Likelier, but still a name match: a call on another object with that name can land on it.

  • AMBIGUOUS

    Several matches, or a dynamic call

    The name matches more than one symbol. A lead, not a fact: open the file:line and verify.

Setup reports a verdict too. It ends READY, DEGRADED or FAILED, and DEGRADED names the gap. /deep-map:status compares the graph with your latest commit.

The wiring frameworks hide

It maps the connections that aren't a plain function call.

A URL runs a handler. A service is injected. A job is scheduled. A delete cascades. None of that is written as a call. DeepMap reads these declarations in 6 ecosystems and stores each as a typed link Claude can follow. This layer is DeepMap's own, added on top of the parsed code graph; every other language still gets calls and imports.

Find your stack. A dash marks a link DeepMap doesn't read yet.

Framework links DeepMap reads, by ecosystem
EcosystemRoutesInjected dependenciesJobs & schedulesEvents & signalsHooks & callbacksCascading deletesModel relationsView renders
Python Flask, FastAPI, Django URLconfs, click commands FastAPI Depends Celery, APScheduler Django signals Flask and FastAPI hooks SQLAlchemy cascade, ondelete; Django on_delete SQLAlchemy (classic and Mapped[...]), Django - not read
Ruby on Rails routes.rb - not read - not read - not read model callbacks dependent: ActiveRecord .erb views and partials
C# / .NET ASP.NET Core attributes, minimal APIs (named handlers) constructor parameters, service registrations - not read - not read - not read EF Core OnDelete EF Core - not read
Java Spring MVC constructor, @Autowired @Scheduled @EventListener - not read JPA cascade JPA - not read
Go Gin, Echo, Fiber, Chi, net/http constructor functions - not read - not read - not read GORM OnDelete GORM - not read
TypeScript / JavaScript NestJS, Express, Fastify, koa-router, Hono, Next.js route handlers, Angular (named handlers) NestJS and Angular constructors, @Inject; tsyringe, InversifyJS, TypeDI NestJS @Cron, @Interval, @Timeout; Bull @Process NestJS @OnEvent, microservice and WebSocket handlers NestJS guards, interceptors, pipes, filters, middleware; TypeORM entity listeners; Angular route guards TypeORM onDelete, MikroORM deleteRule, a remove cascade TypeORM, MikroORM - not read

Not read yet: in Python, Django REST framework routers and SQLModel models; in TypeScript and JavaScript, GraphQL resolvers, Prisma and Sequelize models, Next.js middleware and server actions, and Vue or React Router tables; and any framework wiring in Rust.

Pattern-based readers, each with committed tests. A link a reader can't resolve is dropped, never invented.

“What gets deleted along with a Customer?”

Cascades live in model declarations, not calls. DeepMap follows them hop by hop in Rails, Django, SQLAlchemy, EF Core, JPA, GORM and TypeORM.

Customer Order InvoiceLineItemPayment

›/deep-map:impact "Customer"

4 dependent(s) of 'Customer' (reverse reachability; hop · via · confidence):

  1. INFERRED1hvia CASCADESOrder -> Customerapp/models/order.rb:1
  2. INFERRED2hvia CASCADESInvoice -> Customerapp/models/invoice.rb:1
  3. INFERRED2hvia CASCADESLineItem -> Customerapp/models/line_item.rb:1
  4. INFERRED2hvia CASCADESPayment -> Customerapp/models/payment.rb:1

Rows read right to left, as in the chain. They are INFERRED because a cascade target is matched to its model class by name. Computed by DeepMap on a five-model Rails example.

Works for cascades declared in model code (EF Core: an explicit OnDelete only). A set-null rule is recorded as a cascade link too, so open the declaration to check. Not read yet: ON DELETE rules that live only in migrations or the database.

All 14 kinds of link
Every kind of link in the DeepMap graph
LinkMeaningIn the default walk
CALLSOne function calls another (matched by name)Yes
ROUTES_TOAn HTTP route or CLI command runs this handlerYes
DEPENDS_ONThe framework injects this dependencyYes
SCHEDULED_ASA background or scheduled jobYes
TRIGGERSAn event or signal fires this listenerYes
HOOKSA lifecycle hook or callback runs thisYes
INHERITSA class extends another (in Go, struct embedding)Yes
CASCADESDeleting the owner deletes or nullifies thisYes
RENDERSA Rails view renders a partialYes
HAS_MANY · REFERENCESModel relations: ORM associations and foreign keysOpt-in (DEEPMAP_IMPACT_PROFILE=orm)
IMPLEMENTSA class implements an interfaceNo
DISPATCHESA reflective call (always labeled AMBIGUOUS)No
IMPORTSA module imports anotherNo

Languages

25 programming languages. Every one gets Graph + Vector + FTS.

A multi-language tree-sitter engine parses all 25 into the same code graph (functions, classes, calls, imports), and all three search modes cover every one. Of these, 8 also have their own end-to-end test suites, built from real extractor output, and 6 ecosystems get DeepMap's own framework wiring on top.

All 25 programming languages

Language support: code graph and search, test suites and framework wiring
LanguageGraph + Vector + FTSOwn end-to-end testsSearch, proven end-to-endFramework wiring
8 languages with their own end-to-end test suites
Python✓ yes✓ yes✓ yes✓Flask, FastAPI, Celery; Django URLs, signals and models; SQLAlchemy
JavaScript✓ yes✓ yes- not yet✓Express, Fastify, koa-router, Hono, Next.js
TypeScript✓ yes✓ yes✓ yes✓NestJS, Express, Fastify, koa-router, Hono, Next.js, TypeORM, MikroORM, Angular
Go✓ yes✓ yes✓ yes✓Gin, Echo, Fiber, Chi, net/http, GORM
Rust✓ yes✓ yes✓ yes- none
Java✓ yes✓ yes- not yet✓Spring MVC, JPA
Ruby✓ yes✓ yes- not yet✓Rails, ActiveRecord, .erb views
C#✓ yes✓ yes- not yet✓ASP.NET Core, EF Core
17 more through the same engine and pipeline; Pascal/Delphi also has its own test suite
C✓ yes- not yet- not yet- none
C++✓ yes- not yet- not yet- none
PHP✓ yes- not yet- not yet- none
Kotlin✓ yes- not yet- not yet- none
Scala✓ yes- not yet- not yet- none
Swift✓ yes- not yet- not yet- none
Lua✓ yes- not yet- not yet- none
Elixir✓ yes- not yet- not yet- none
Objective-C✓ yes- not yet- not yet- none
Julia✓ yes- not yet- not yet- none
Bash✓ yes- not yet- not yet- none
PowerShell✓ yes- not yet- not yet- none
Groovy✓ yes- not yet- not yet- none
Zig✓ yes- not yet- not yet- none
Fortran✓ yes- not yet- not yet- none
Verilog✓ yes- not yet- not yet- none
Pascal/Delphi✓ yes✓ yes- not yet- none

Call coverage varies. Calls on objects (order.save()) are mostly missing in every language we tested, and so are Python module.func() calls (known limits).

Get started

Install the plugin. Then just ask.

Three steps, all inside Claude Code. No terminal, no API key, no Docker.

Coming soon: The public repository opens shortly. These commands work as soon as it is live.

Needs Claude Code, Python 3.10+ and Java 17 or 21. Tested on Windows 11 and Linux; macOS not verified yet.

  1. Add the plugin

    In Claude Code:

    Claude Code
    /plugin marketplace add deepfusionlabs/deep-map
    /plugin install deep-map@deepfusionlabs
  2. Run setup in your project

    In Claude Code, with your project open:

    Claude Code
    /deep-map:setup

    The first run installs DeepMap's own Python environment, downloads the embedding model and Neo4j, builds the graph and starts the local servers. Your own Python is never touched.

  3. Open a new Claude Code session and ask

    A new session connects the tools. Then ask in plain English:

    • “What breaks if I change charge_card()?”
    • “Find the code that retries failed uploads.”
    • “Which classes get UserRepository injected?”

The first setup on a machine downloads about 1 GB once (3–11 minutes in our runs). On a busy machine, setup took 12–14 minutes on projects of about 700–1,300 symbols. To add another project, run /deep-map:setup inside it.

Install details
  • Downloads: DeepMap's Python packages (with a CPU build of PyTorch), the embedding model (about 0.6 GB) and Neo4j Community from its official source, checksum-verified. About 2.5 GB on disk afterwards (about 3.2 GB on Linux); keep about 4 GB free while it installs.
  • Large projects: on a busy machine, setup took about 70 minutes on a project of about 6,300 symbols, the largest tested.
  • Your Python stays as it is: when it lacks DeepMap's packages, they go into DeepMap's own environment under ~/.deepmap/venv, and every /deep-map command uses it. A Python that already has them, from the terminal installers, is used as is. On Debian and Ubuntu, setup needs the python3-venv package and names the command that installs it.
  • The git hook: setup prints a one-line command that also re-syncs the graph in the background after each commit, on top of the refresh at session start.
  • Prefer a terminal? The plugin also ships install.sh and install.ps1. They install the packages into the Python they find, download the model (about 0.6 GB, like setup), run setup and add the git hook.
All 8 /deep-map commands
DeepMap slash commands
/deep-map:setupSet up DeepMap for this project, or repair it. Safe to re-run.
/deep-map:refreshUpdate the graph after code changes. Re-embeds only what changed and removes deleted code.
/deep-map:impact "<symbol>"The impact report on demand.
/deep-map:statusWhat's in the graph, whether it is behind your latest commit, and whether the servers are up.
/deep-map:doctorA full health check with a next step for anything that isn't OK.
/deep-map:enrichOpt-in: better summaries for undocumented code, written by Claude on your own plan.
/deep-map:versionWhich version is loaded right now.
/deep-map:plugin-updateUpdates DeepMap for you, then tells you how to load the new version.

Architecture

Parse. Index. Query. Reason.

Proven open-source parts in one local pipeline: a graph database, a vector index and a full-text index, with a reasoning skill on top.

  1. ParseA multi-language tree-sitter parsing engine plus DeepMap's 6 framework readers, with no network and, by default, no LLM. Every function, method and class gets a one-line intent summary: in Python the opening of its docstring, otherwise built from its name and what it calls.
  2. GraphNeo4j Community 5.26, one instance per project, localhost only. Function, Method, Class and Module nodes; 14 kinds of link, each with a confidence label.
  3. IndexVector: ModernBERT-embed, 768-dimension embeddings of the intent summaries, computed on your CPU. Full-text: a BM25 index over names and summaries, queried with fuzzy matching. Both indexes live in the same Neo4j instance as the graph.
  4. QueryFour tools over MCP, the standard way Claude Code plugs in tools, here over HTTP on localhost: deepmap_search (graph + vector + full-text, fused into one ranked list), deepmap_impact (the backwards graph walk), deepmap_cypher (read-only Cypher for structure questions: list, count, group, paths) and deepmap_embed (any text, embedded with the same model).
  5. ReasonClaude Code, with the reasoning skill, the hooks and the eight /deep-map commands.
How the impact walk works
  • It walks backwards from the symbol through calls and the framework wiring: routes, injected dependencies, jobs, events, hooks, inheritance, cascading deletes and view renders.
  • 3 hops for Claude and the slash command; from a terminal, DeepMap's own impact command can go up to 5. The default limit is 30 rows.
  • Each row reports the dependent, its distance in hops, the kind of link that attaches it, the weakest confidence label on its path and its file:line.
  • Notes travel with the answer: when the list was cut at the limit, when a very widely used name was cut back to one hop, when a symbol isn't in the graph, and when a method's callers are only a lower bound.
Open the graph yourself
  • Each project has its own Neo4j instance; the first normally uses the standard ports, the others the next free ones.
  • It is a real Neo4j database. Neo4j Browser runs on the instance's HTTP port (http://127.0.0.1:7474 for your first project): sign in as neo4j with the password deepmap, a local development password on a localhost-only port, and run your own Cypher, Neo4j's query language, such as MATCH (a)-[r:ROUTES_TO]->(h) RETURN a, r, h LIMIT 25.
  • Claude can do the same through deepmap_cypher, read-only: writes are refused, and each answer is bounded in time, rows and size, without embedding vectors.
  • /deep-map:status lists every instance: running or stopped, its size, and when it was last used.

Reliability engineering

Seven defensive layers. No single point of failure.

Claude decides when to use a tool, and that decision can fail. A graph can fall behind your code. An outage can look like an empty answer. Seven layers cover these.

  1. Self-heal at session start code

    After a reboot, a hook revives this project's database and servers and tells Claude whether the graph is ready, stale or incomplete. If the code changed, it also refreshes the graph in the background.

  2. Pre-search nudge code

    Before a text search, a once-per-session reminder that the tools exist. Never blocks.

  3. Post-edit sync flag code

    After an edit, a once-per-session note that the graph may be stale. Never blocks.

  4. Git post-commit sync optional

    Each commit re-syncs the graph in the background.

  5. Skill guidance and confidence discipline guidance

    The bundled skill's five rules, shown above.

  6. Fail loud on outage code

    An outage is reported as an error, never as an empty result. If the embedding model can't load, search falls back to keywords and says so.

  7. No-regression ranking check code

    A test fails if the ranking functions change, so the ranking formula can't change unnoticed between releases.

317 live test cases on a real database.

  • 317live test cases

    across 10 areas, from setup and search to hooks and failure modes.

  • 200+automated test suites

    each fix starts as a test that fails on the old code.

  • 300generated source files

    fuzz each of the Rails, C#, Java, Go and TypeScript framework readers.

AI test agents ran the cases on live database instances, two independent AI reviewers re-checked the findings of the main test runs, and a maintainer decides what ships (AI policy (available at launch)).

License, privacy and limits

MIT, 100% local - and clear about what it isn't.

  • Runs on your machine

    By default nothing DeepMap builds leaves your machine. The database listens only on localhost.

  • No cloud, no telemetry

    DeepMap collects no telemetry, and setup switches off Neo4j's own usage reporting.

  • No API key, no new subscription

    By default no LLM parses or summarizes your code. The embedding model runs on your CPU.

DeepMap is MIT-licensed. It runs on a local Neo4j Community Edition instance (GPLv3), which DeepMap downloads from the official source but does not redistribute or modify, and accesses over the standard Bolt protocol. DeepMap's own MIT-licensed code is independent of Neo4j's license. If you use DeepMap commercially, review Neo4j's licensing terms (or consult counsel) for your use of Neo4j Community.

What it isn't: known limits

  • Calls are linked by function name, not by the object's type. A plain call to a common name, such as run(), links to every function called run, so in a real codebase most call links are AMBIGUOUS (83–98% in three measured codebases), and Claude is told to open the file:line and verify. A stricter mode, DEEPMAP_PRECISE_CALLS=1, keeps the parser's exact target instead; it is opt-in.
  • Calls on an object, such as order.save(), are mostly missing from the graph, even when the code declares the object's type; calls on self or this are kept. We saw this in Python, TypeScript, Go, Rust and C#. In Python, module.func() calls and calls at module level are missing too. An opt-in, type-based call linker for Python, TypeScript and JavaScript (DEEPMAP_TYPED_CALLS=python,typescript,javascript) links many of these calls by the object's declared type. It is off by default: in our measurement it added no wrong links, but it has not yet passed every check we set for it in advance.
  • It reports what it can trace. It is not a proof that nothing else depends on your code.
  • The graph is a snapshot of your last sync, not of your working tree.
  • One graph per project. No cross-repository queries.
  • Search matches names and one-line summaries, not code bodies. For an exact string or a regex, grep is still the right tool.
  • No data-flow or taint analysis. DeepMap never edits code.
  • Early release: macOS isn't verified yet, only Neo4j 5.26 is tested, and the largest project tested has about 6,300 symbols.

FAQ

Common questions, short answers.

How accurate is “what breaks”?

It reports what it can trace; it is not a proof. Every link carries a confidence label, Claude is told to confirm AMBIGUOUS ones by reading the code, and the known limits say what the graph misses.

Is it free?

Yes. DeepMap is open source under the MIT license, with no new subscription or API key. You need Claude Code.

Does my code leave my machine?

Not by default. The one opt-in exception is enrichment, which sends undocumented functions to Claude under your own Claude Code login (/deep-map:enrich, off by default). That is the same place Claude Code already sends your code. One network call you may see: a sync started by the git hook lets the model library ask huggingface.co whether its files are current. It sends nothing about your code, and HF_HUB_OFFLINE=1 turns it off.

Does it slow Claude down?

A search takes about half a second (median). Two small hooks run before a Grep or Glob and after an Edit or Write, 0.3–1.4 seconds per run, and one runs after each search, impact or Cypher call. The background refresh runs at low CPU priority. DEEPMAP_NUDGE=0 and DEEPMAP_SYNC_FLAG=0 silence the first two hooks; DEEPMAP_HOOKS=0 turns off every DeepMap hook, the session-start self-heal and background refresh included.

How much memory and disk does it use?

About 2–3 GB of RAM per project while it runs: a Neo4j database process (Java heap capped at 512 MB by default) and two local servers that keep the embedding model loaded. DeepMap's command-line tool can hibernate idle projects' databases and stop a project's servers. Disk: about 2.5–3.2 GB, plus each project's graph.

What happens when my code changes?

When an interactive session starts and your code changed since the last build, DeepMap refreshes the graph in the background: offline, at low CPU priority, at most once every 15 minutes for the same commit. It skips a project whose sync takes more than 20 minutes (DEEPMAP_AUTO_SYNC_MAX_S raises the limit), and /deep-map:status says why. Claude is told that it is running and how it ended. It is not a file watcher, and it removes a deleted symbol only when it re-read that file or the file is gone, so /deep-map:refresh is still the full clean-up and brings in this session's edits at once; a refresh you start takes over. The optional git hook (setup prints the command) also re-syncs after each commit, but only adds and updates. DEEPMAP_AUTO_SYNC=0 turns the background refresh off.

Can I use it on several repositories?

Yes. Each project gets its own isolated Neo4j instance and ports from one shared install. There are no cross-repository queries. Already running Neo4j yourself? DeepMap leaves it alone and uses the next free port.

How is it different from a language server or other code-graph tools?

Use a language server too: it resolves calls by type, which DeepMap's default graph doesn't, and Claude Code can reach it through LSP plugins. Many tools now give AI agents a call graph, and some also combine graph, vector and keyword search. DeepMap's focus is the wiring frameworks hide from a call graph: routes, injected services, jobs, events, callbacks and cascading deletes, read in six ecosystems and walked together with calls in one impact query, with a confidence label on every link. It all lives in a real database on your machine, under the MIT license.

Does it work with other AI coding tools?

Not supported. DeepMap's tools run on standard MCP servers on your machine, so another MCP client could call them, but the skill, hooks, slash commands and setup are built for Claude Code, and nothing else is tested.

How do I update or remove it?

Update with /deep-map:plugin-update, then start a new session. There's no uninstall command yet, so removal is manual. In each project, stop its servers and database and remove its git hook with DeepMap's provisioner, build/provision.py (mcp-stop, stop, git-hook --uninstall), or ask Claude to. Then remove the plugin in Claude Code's /plugin menu and delete .deepmap/ and the two DeepMap entries in .mcp.json. DeepMap's Python environment, the Neo4j download and every graph stay under ~/.deepmap, and the model in your Hugging Face cache, until you delete them.

Also from DeepFusion Labs

DeepInit loads context up front. DeepMap answers during the task.

DeepInit writes the truth about your codebase into the context your agent reads before it starts: the real rules, the live database schema, the why, each claim checked against your code. See DeepInit →

Coming soonOpen-source release on GitHub

Graph + Vector + FTS for Claude Code. 100% local.

MIT, no API key. Install it once, then just ask.