How it works

Code → Symbols →
Ghost Tree.

GhostMap works in layers. Each layer builds on the previous one - the model is consistent whether you open a 10-line file or a 60,000-line one.

Four layers. One tree.

01
Ghost Engine

Symbol extraction

GhostMap reads your file and extracts meaningful symbols: classes, functions, interfaces, structs, and enums. It uses the strongest available extractor for your supported language, then falls back gracefully when needed.

02
@ghost annotations

Anchor parsing

Every @ghost comment in the file is parsed: description, status, name, range markers. Contextual anchors attach to the nearest symbol. Named anchors and Ghost Ranges create independent nodes.

03
Hierarchy builder

Tree construction

Symbols and anchors are organized into a hierarchy by range containment - if a symbol starts inside a Range, it becomes a child of that Range. The result is a tree that reflects your code's actual structure.

Ghost Index – V1
Per-file snapshot & instant reload

After the first analysis of an active file, GhostMap persists the complete tree into the per-document Ghost Index – a local snapshot fingerprinted with the file’s content hash, stored under .ghostmap/ghostmap.json. Every subsequent open of that same file loads from the snapshot in milliseconds, with zero LSP work. V1 is per-file: only files you have opened are cached.

Active file today. Workspace tomorrow.

GhostMap V1 ships an active-file Ghost Tree backed by a per-document local cache. The workspace-wide indexing engine is the V2 direction – designed but not shipped.

V1 – today shipped

  • Active-file Ghost Tree from the best available local extractor.
  • Per-document snapshot in .ghostmap/ghostmap.json.
  • Fingerprint-validated reload, optimistic trust on activate.
  • No workspace-wide index, no file-system watcher, no background fingerprint validator (the previous one was removed in round 6 because it froze the host).

V2 indexing engine planned

  • Workspace-wide Ghost Index v2 as sharded JSON snapshots.
  • Ghost Watcher on the file system, debounced per URI.
  • Incremental background indexing in a worker thread, off the Extension Host main loop.
  • Keeps V1 active-file responsiveness untouched on the fast path.

Status: V2 design + skeleton branches only. Not in any shipped 0.5.x. Future enterprise-oriented integrations on top of V2 (Jira / Slack, Ghost Threads, Ghost Graph, AI explanations, permissions & audit log) are sketched on the Roadmap page as future direction, not shipped.

Three ways to annotate.

Pick the right anchor for what you're describing. Each type creates a different kind of node in the Ghost Tree.

Contextual Anchor
// @ghost description: // validate jwt | status: review function login() {}

No name. Attaches silently to the nearest symbol within the ownership radius (default: 5 lines). The description and status appear on login in the tree.

Named Anchor
// @ghost #security // description: audit JWT // status: todo

Has a #name. Creates an independent node in the tree - doesn't need a symbol nearby. Good for notes, open questions, or flagging a section of a file.

Ghost Range
// @ghost #refactor start // description: split service ... code ... // @ghost end

A named anchor that owns everything between start and end. All symbols inside become children of this node in the tree.

Track work state in the tree.

Every anchor can carry a status. Filter the Ghost Tree by status to see only what's pending, in review, or done.

todo - work hasn't started
in-progress - actively being worked on
review - waiting for review
done - resolved, no action needed
blocked - waiting on something external
pending - scheduled but not started
Status values are normalized automatically: lowercased, trimmed, and spaces converted to hyphens (in progressin-progress). If you use a value GhostMap doesn't recognize, it offers a quick fix with the closest match.

Try it on your own project.

Install from a local VSIX, then add your first @ghost in minutes.

Install (Local VSIX) 5-minute guide →