v0.10.0 Local-first · Plain Markdown · Native MCP

Your knowledge,
wired as a graph.

GraphFinder turns Markdown vaults and entire codebases into a semantically indexed knowledge graph — giving humans a beautiful place to think and giving AI agents surgical, ~50-token retrieval through a native MCP server.

terminal
# Index any folder (notes + code) and export graph artifacts
$ graphfinder sync ./my-repo --export
# Register GraphFinder in every AI editor on this machine
$ graphfinder config --install
# Ask the graph
$ graphfinder search "how is authentication handled?"
24MCP tools
20+languages indexed
~50tokens per query
0cloud calls / API keys
Features

One engine for notes, code and agents.

Everything runs on your machine: a Rust core with an embedded ONNX model, SQLite with FTS5, a force-directed graph UI and an MCP server that any AI editor can talk to.

Hybrid semantic search

Dense 384-dimension FastEmbed vectors fused with SQLite FTS5 BM25 through Reciprocal Rank Fusion (k = 60). Notes are chunked by ##/### headings so every answer is an atomic, deep-linkable section like [[Note#Section]].

FastEmbed ONNXSQLite FTS5RRF k=60pulldown-cmark AST

100% local

No API keys, no telemetry. Your Markdown stays as plain files on disk.

Interactive graph

Force-directed canvas with 1/2-hop highlighting, tag clusters and language-coded code rings.

Codebase intelligence

AST-lite scanning of entire repositories: symbols (functions, classes, structs), local import graph and external packages — respecting .gitignore and syncing incrementally by SHA-256.

TypeScript Rust Python Go JavaScript C / C++ Java · Kotlin · C# + more

Native MCP server

24 tools over Streamable HTTP/SSE (127.0.0.1:45123) while the app is open, or headless stdio via graphfinder mcp. Works with Cursor, Claude Desktop, Antigravity, Windsurf, Cline, Roo Code, Zed.

Graph analytics

Community detection, degree centrality, God Nodes, cross-community surprises, cycles and shortest paths — exported as graph.json, GRAPH_REPORT.md and an offline graph.html.

Live file watcher

Edit in VS Code, Cursor or Neovim — changes are re-indexed within 500 ms.

Multi-vault projects

Isolated vaults, each with its own index. Rename refactors every incoming wikilink.

Hardened by default

DNS-rebinding defense, Origin checks, strict CSP and DOMPurify sanitization.

01 · INGEST

Point it at a folder

Markdown notes and source files are parsed, chunked and embedded locally.

02 · CONNECT

Watch the graph form

Wikilinks, tags and code imports become edges you can explore and analyze.

03 · RETRIEVE

Let agents ask precisely

MCP tools return only the section or symbol needed — not whole files.

Documentation

Everything about GraphFinder.

From installation to the internals of the search engine. Current release: v0.10.0.

01Overview#

GraphFinder is a cross-platform desktop application (Tauri v2 + Rust + React 19) and command-line tool that indexes Markdown knowledge vaults and source-code repositories into a single, semantically searchable graph.

Traditional RAG pipelines split documents into arbitrary fixed windows or push entire files into an LLM context, wasting thousands of tokens. Note-taking tools, in turn, rarely offer local vector search or an API agents can use. GraphFinder addresses both sides:

  • For humans — a distraction-free, local-first environment to write pure Markdown with [[wikilinks]], explore connections in an interactive 2D graph and keep full ownership of your files.
  • For AI agents — an embedded Model Context Protocol (MCP) server that returns sub-section level results ([[Note#Section]]) and individual code symbols, typically around 50 tokens per hit.

Key concepts

ConceptMeaning
VaultA folder of .md files (and optionally code) indexed by GraphFinder.
ProjectA registered vault with its own isolated SQLite index. Identified by a slug id (e.g. my-api).
ChunkAn atomic section of a note delimited by ## / ### headings, embedded independently.
Deep linkA reference to a specific section: [[Note Title#Section Heading]], or to a symbol: [[path/file.rs#function]].
Node / EdgeNotes and code files are nodes; wikilinks and imports are edges.
God NodeA highly central hub in the graph, detected by degree centrality.

02Installation#

Option A — Pre-built installers (recommended)

Every tagged release is built by GitHub Actions for all three desktop platforms. Grab the latest from the Releases page:

After installing, enable the terminal command so graphfinder works from any shell:

bash
# Windows: adds the install folder to your User PATH + creates graphfinder.cmd shims
# macOS/Linux: creates a symlink in ~/.local/bin/graphfinder
graphfinder install-cli

If graphfinder is not yet on your PATH, run the binary directly, e.g. "C:\Program Files\GraphFinder\GraphFinder.exe" install-cli. Open a new terminal afterwards.

Option B — Build from source

Prerequisites

  • Node.js 20+ and npm
  • Rust 1.75+ via rustup
  • Windows: Visual Studio C++ Build Tools · Linux: libwebkit2gtk-4.1-dev, build-essential, libssl-dev, libayatana-appindicator3-dev, librsvg2-dev
bash
git clone https://github.com/GabrielTBeserra/GraphFinder.git
cd GraphFinder
npm install

# Run the desktop app in development mode (Vite on :1420 + Tauri)
npm run app

# Produce installers in src-tauri/target/release/bundle/
npm run tauri build

On first launch the embedding model (all-MiniLM-L6-v2, ~90 MB) is downloaded once into .fastembed_cache. After that GraphFinder works fully offline.

03Quick start#

  1. Open the appLaunch GraphFinder (or run graphfinder with no arguments). A default vault is created and the graph appears.
  2. Create or open a projectUse the project switcher in the top bar → New project, give it a name and optionally pick an existing folder (a notes folder or a code repository).
  3. Write a noteCreate a note, start with # Title, a short summary, then ## sections. Link concepts with [[Other Note]] and finish with tags like #architecture. Save with Ctrl+S.
  4. SearchPress Ctrl/⌘+K for Omnisearch — hybrid semantic search across notes and code symbols.
  5. Connect your AI editorRun graphfinder config --install or copy a snippet from the in-app MCP modal. Your agent now has 24 GraphFinder tools.

Prefer the terminal? The same flow headless:

bash
cd ~/code/my-project
graphfinder sync            # registers the folder as a project and indexes it
graphfinder status          # notes, code files, edges, database size
graphfinder search "rate limiting middleware"
graphfinder report          # architecture audit + graph artifacts

04Desktop app#

The interface is organised around a sidebar, the central graph canvas and contextual panels.

AreaWhat it does
Top barProject switcher, new project, Omnisearch, architectural report, MCP integration modal, dark/light theme toggle (persisted in localStorage).
SidebarTabs for Notes and Code (with language filters), plus semantic search with a toggle between Markdown notes and code symbols. Toggle with Ctrl+B.
Graph viewForce-directed canvas. Click a node to focus it and highlight its 1- and 2-hop neighbourhood. Filter with [All], [Notes], [Code]. Notes are coloured by tag cluster; code files get language-coded rings; hubs glow proportionally to their degree.
Note editorMarkdown editor with live preview (sanitised by DOMPurify), wikilink autocomplete (type [[, navigate with ↑↓, accept with Enter/Tab, close with Esc) and Ctrl+S to save.
Code InspectorSlide-out drawer for a code node: declared symbols with line ranges, import graph with clickable jumps, external packages and a surgical code viewer.
OmnisearchCtrl/⌘+K. Hybrid search across the active project, keyboard navigable.
Architectural reportCommunities, God Nodes, coupling surprises and cycles for the active project, with one-click export.
MCP modalCopy-ready config snippets for each AI editor, plus the agent rules (AGENTS.md) and curator skill.

Keyboard shortcuts

ShortcutAction
Ctrl/⌘ + KToggle Omnisearch
Ctrl/⌘ + BToggle sidebar
Ctrl/⌘ + SSave current note
↑ ↓ Enter EscNavigate search results and wikilink suggestions

While the desktop app is open it also hosts the MCP server on http://127.0.0.1:45123, so notes created by your agent appear on the graph in real time.

05Writing notes#

GraphFinder works with any Markdown, but retrieval is most precise when notes follow this structure:

  1. One H1 title (# Note Title) followed by a 2–3 line executive summary.
  2. Self-contained ##/### sections of roughly 40–150 tokens, with descriptive headings (## 2. SQLite WAL Configuration rather than ## Config). Each heading becomes its own embedding and deep-link target.
  3. Wikilinks — [[Note]] or [[Note#Section]]. Aim for 1–3 links per note to avoid orphans.
  4. Lowercase hashtags — #architecture #sqlite #mcp at the end of sections or the note. They drive the coloured clusters in the graph.
vault/Auth JWT.md
# Auth JWT

How the API issues and validates JSON Web Tokens. Covers signing keys,
expiry policy and refresh rotation.

## 1. Token Signing
Tokens are signed with RS256. Keys rotate every 30 days and are loaded
from the secrets store at boot. See [[System Architecture#2. Secrets]].

## 2. Refresh Rotation
Each refresh invalidates the previous token family to stop replay attacks.

#auth #security #architecture

How notes are parsed

  • Parsing uses a real CommonMark AST (pulldown-cmark). Content inside fenced code blocks is isolated, so a # in code is never treated as a heading or tag.
  • Sections longer than 320 tokens are windowed with a 40-token overlap so no context is lost at boundaries.
  • Renaming a note (UI or rename_note) rewrites every incoming [[Old Title]] across the vault.
  • Notes edited outside GraphFinder (VS Code, Cursor, Neovim…) are picked up by the file watcher (500 ms debounce).

07Code indexing#

Point GraphFinder at a repository and it builds a symbol index and dependency graph without needing a compiler or language server.

Supported file types

LanguageExtensionsImports parsed
TypeScript / TSX.ts .mts .cts .tsximport, require
JavaScript / JSX.js .mjs .cjs .jsximport, require
Python.py .pyiimport, from … import
Rust.rsuse, mod
Go.goimport
C / C++.c .h .cpp .hpp .cc .cxx .hh#include
Java / Kotlin.java .kt .ktsimport
C# / F#.cs .fsusing
PHP · Ruby · Swift.php .rb .swiftuse/require/import
Web & config.html .css .scss .sass .less .json .yaml .toml .sqlindexed as files
Shell.sh .bash .zshsource

What gets extracted

  • Symbols — top-level functions, classes, structs, interfaces, enums, with line ranges and token estimates. Each symbol is a searchable chunk.
  • Local imports — resolved to project files and stored as bidirectional edges (code_links): imports and dependents.
  • External packages — third-party modules (e.g. rusqlite, react) listed per file.

What gets skipped

Anything in .gitignore, plus node_modules, target, dist, .git, binary files and files larger than 1 MB.

08Graph analytics#

A pure-Rust analytics engine treats notes and code files as one unified graph and answers architectural questions.

AnalysisDescription
CommunitiesLabel-propagation / Louvain-style clustering reveals modular subsystems.
Centrality & God NodesDegree centrality ranks nodes; the most connected hubs are flagged as God Nodes — refactor or document them first.
Cross-community surprisesEdges that couple otherwise distant subsystems — often hidden architectural debt.
CyclesCircular dependency chains between files.
Shortest pathBFS across imports and wikilinks between any two nodes (graphfinder path, find_path).
Node explanation360° card: community, centrality rank, callers, callees, siblings (graphfinder explain, explain_node).

Exported artifacts

graphfinder report, graphfinder export, sync --export or the export_graph tool write to ./graphfinder-out/:

  • graph.json — nodes (community, degree, centrality, god-node flag) and edges (source, target, label, weight). Ideal for agents and scripts.
  • GRAPH_REPORT.md — executive summary, metrics, God Nodes table, subsystem list, coupling surprises and cycles.
  • graph.html — zero-dependency offline visualiser with search, community colours and hub halos. Open it in any browser.

09CLI reference#

The same binary is both the desktop app and the CLI. Running it without arguments opens the GUI; with a command it runs in the terminal.

usage
graphfinder [COMMAND] [OPTIONS]
Command (aliases)OptionsDescription
sync (syn, index) [path]--json --exportIndexes notes and code in path (default: current dir). Registers a new project if unknown, otherwise updates incrementally via SHA-256. --export also writes graph artifacts.
status (info) [path]—Shows notes, code files, graph edges and database statistics.
projects (list)—Lists every registered project and its path.
search <query>--path --limit <n>Hybrid semantic search (BM25 + embeddings) in a project.
report (audit) [path]--out-dir --jsonCommunities, God Nodes, surprises and cycles, plus all three artifacts.
path <from> <to>--path --jsonShortest multi-hop path between two files, symbols or notes.
explain <node>--path --jsonArchitectural context card for a node.
export [path]--out-dirWrites graph.json, GRAPH_REPORT.md, graph.html silently.
config (mcp-config, setup)--install / -i --jsonPrints MCP config for AI editors. --install auto-detects installed editors, registers GraphFinder in them and adds the CLI to PATH.
tools (schemas, mcp-tools, export-schemas) [dir]—Exports all 24 tool JSON schemas, a tools.json manifest and instructions.md to ./mcp-tools.
install-cli (install-path)—Adds graphfinder to the OS PATH.
mcp (--mcp)—Starts the headless stdio MCP server.
help (--help, -h)—Prints help.

Examples

bash
# Machine-readable sync for CI or scripts
graphfinder sync ./services/api --json

# How does the UI reach the database layer?
graphfinder path "GraphView.tsx" "db.rs"

# Why does this file matter?
graphfinder explain "src-tauri/src/engine/db.rs"

# Audit into a custom folder
graphfinder report --out-dir ./docs/architecture

# Search only 3 results in a specific project path
graphfinder search "file watcher debounce" --path ./GraphFinder --limit 3

From a source checkout, npm scripts wrap the CLI: npm run sync, npm run status, npm run search, npm run projects, npm run mcp.

10MCP server setup#

GraphFinder implements the Model Context Protocol with the official Rust SDK (rmcp) in two modes:

ModeEndpointBest for
A · Embedded HTTP/SSE (app running)http://127.0.0.1:45123/mcp (Streamable HTTP)
http://127.0.0.1:45123/sse (SSE)
Live updates: agent-created notes appear on the graph instantly.
B · Headless stdiographfinder mcp / GraphFinder.exe --mcpTerminals, servers, CI, or when you don't want the GUI open.

The fastest path is automatic registration:

bash
graphfinder config --install   # Cursor, Claude Desktop, Windsurf, Cline, Roo Code…
graphfinder config --json      # just print the JSON snippet

Or configure manually:

File: .cursor/mcp.json (workspace) or ~/.cursor/mcp.json (global).

mcp.json
{
  "mcpServers": {
    "graphfinder": {
      "url": "http://127.0.0.1:45123/sse"
    }
  }
}

File: %APPDATA%\Claude\claude_desktop_config.json (Windows) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS).

claude_desktop_config.json
{
  "mcpServers": {
    "graphfinder": {
      "command": "C:\\Program Files\\GraphFinder\\GraphFinder.exe",
      "args": ["--mcp"]
    }
  }
}

File: ~/.gemini/antigravity-ide/mcp_config.json.

mcp_config.json
{
  "mcpServers": {
    "graphfinder": {
      "type": "sse",
      "url": "http://127.0.0.1:45123/sse"
    }
  }
}

Windsurf: ~/.codeium/windsurf/mcp_config.json. Cline / Roo Code: cline_mcp_settings.json in the extension's global storage.

mcp_config.json
{
  "mcpServers": {
    "graphfinder": {
      "url": "http://127.0.0.1:45123/sse"
    }
  }
}

Any MCP client that spawns a process (no GUI required):

json
{
  "mcpServers": {
    "graphfinder": {
      "command": "graphfinder",
      "args": ["--mcp"]
    }
  }
}

In stdio mode the MCP handshake answers in under 50 ms — the embedding model loads and the vault syncs in the background.

11MCP tools (24)#

Every tool accepts an optional project parameter to target a specific vault without cross-contamination. Dashed parameters are optional.

Knowledge retrieval

search_semantic

Hybrid vector + BM25 search over note chunks with RRF. Returns deep links and token estimates.

querylimit=5format: dense_chunks | summaries

read_section

Reads exactly one section by heading or deep-link fragment.

targetsection

get_compressed_context

Summary, links, tags and a heading map with per-section token costs — under 80 tokens.

target

list_recent_notes

Recently modified notes with one-line summaries and tags.

limit=10

Authoring & linking

suggest_links

Embeds draft text and recommends existing notes/sections to link (prevents orphans).

textcurrent_notethreshold=0.60

store_context

Creates or updates a note, parses it and indexes it immediately.

titlecontenttags[]links[]

link_notes

Appends a [[wikilink]] from one note to another and updates the graph.

from_noteto_note

rename_note

Renames a note and refactors all incoming wikilinks vault-wide.

old_titlenew_title

delete_note

Deletes the file and cleans chunks, embeddings, links and tags.

target

Graph & architecture

get_graph_neighborhood

Nodes connected within 1 or 2 hops, without reading bodies.

targetdepth=1

find_path

BFS shortest path across wikilinks and imports between two nodes.

sourcetargetdirected=false

explain_node

Centrality, community, God Node status, dependents, dependencies and siblings.

target

get_community_report

System-wide audit: communities, God Nodes, surprises and cycles.

project

export_graph

Writes graph.json, GRAPH_REPORT.md and graph.html.

out_dir=./graphfinder-out

get_vault_stats

Notes, chunks, links, tags and total token estimates.

project

Codebase

search_code

Hybrid search over code symbols, signatures and comments. Returns [[file#symbol]] with line ranges.

querylanguagelimit=5

find_files

Glob / substring matching over indexed file paths.

patternlimit=20

get_file_context

Symbols with line ranges, local imports, dependents and packages — under 80 tokens.

file

read_code_chunk

Returns only the body of a named function, class or struct.

filesymbol

get_code_dependencies

What a file imports and who imports it.

file

Projects & sync

list_projects

All registered vaults with paths and note counts.

—

create_project

Creates an isolated vault (optionally at any path on disk).

namepath

switch_project

Changes the active default vault.

project_id

sync_vault

Hash-based incremental re-index; a path auto-maps to (or registers) a project.

pathproject

Run graphfinder tools to export the JSON schemas of all tools for use with any agent framework.

12AI agents & skills#

GraphFinder ships three layers that work together: the agent (Cursor, Claude, Antigravity…) reasons and plans, the skill enforces token economy and note quality, and the MCP server executes retrieval and writes.

Bundled skills & rules

  • AGENTS.md — repository rules for agents (token economy, note schema, decision pipelines). Antigravity loads it automatically; in Cursor add it to Project Rules; in Claude paste it into the project prompt.
  • .agents/skills/graphfinder-curator — authoring and curation workflow (summaries, atomic sections, suggest_links before store_context, tags).
  • .agents/skills/graphfinder — architecture auditing workflow (reports, paths, explain, exports).

Recommended workflows

Answering a question

flow
search_semantic("sqlite wal mode")        → top 5 chunks (~50 tokens each)
  └─ need the outline?  get_compressed_context("System Architecture")
  └─ need one section?  read_section("System Architecture", "1. Local Storage")

Saving knowledge

flow
draft note (# Title + summary + ## sections)
  → suggest_links(draft)                   → e.g. "System Architecture: 85%"
  → insert [[System Architecture]] into draft
  → store_context(title, content, tags)    → file written, indexed, graph updated

Inspecting code

flow
search_code("hybrid_search", language="rust")
  → get_file_context("src-tauri/src/engine/db.rs")       # symbol map, <80 tokens
  → read_code_chunk("src-tauri/src/engine/db.rs", "hybrid_search")
  → get_code_dependencies("src-tauri/src/engine/db.rs")  # impact analysis

Auditing architecture

flow
get_community_report()      → subsystems, God Nodes, surprises, cycles
  → explain_node("db.rs")   → why it matters
  → find_path("App.tsx", "db.rs")

Prompt examples

GoalPrompt
Surgical search"Query the GraphFinder vault and explain how code indexing works without reading full files."
Connected note"Document our OAuth2 flow as a GraphFinder note. Call suggest_links first and add relevant tags."
Code inspection"Find where import parsing is implemented and read only that function with read_code_chunk."
Impact analysis"Which files import GraphView.tsx? Summarise the architectural impact of changing it."
Architecture audit"Run a GraphFinder community report and list the God Nodes we should document first."

13Projects & vaults#

Each project is an isolated workspace with its own Markdown directory and its own SQLite vector database, so searches never leak between projects.

  • Default vault — <data dir>/vault with index <data dir>/index.db.
  • Managed vaults — <data dir>/vaults/<project_id>/, created from the UI or create_project.
  • External folders — any path on disk (e.g. a code repo) registered via the UI, graphfinder sync <path> or create_project(name, path).
  • Registry — vaults/projects.json stores the active project, custom names and custom paths.
vaults/projects.json
{
  "active_project": "default",
  "custom_names": { "my-api": "My API" },
  "custom_paths": { "my-api": "C:/Repos/MyAPI" }
}

Where is the data directory?

  1. GRAPHFINDER_DATA_DIR, if set.
  2. The current directory, if it contains package.json (source checkout / dev mode).
  3. Otherwise the OS data folder: %APPDATA%\GraphFinder (Windows), ~/Library/Application Support/GraphFinder (macOS), ~/.local/share/GraphFinder (Linux).

14Configuration#

GraphFinder is configured through environment variables — no config file required.

VariableDefaultEffect
GRAPHFINDER_DATA_DIRsee aboveBase directory for vaults, registry and databases.
GRAPHFINDER_VAULT<data>/vaultOverrides the default vault folder.
GRAPHFINDER_DB<data>/index.dbOverrides the default SQLite database path.
GRAPHFINDER_MODEL / GRAPHFINDER_EMBEDDING_MODELautomultilingual, multilingual-e5-small or e5 load MultilingualE5Small; otherwise all-MiniLM-L6-v2.
GRAPHFINDER_MODELS—Folder containing a local model.onnx + tokenizer.json for fully offline use (also auto-detected in models/all-MiniLM-L6-v2).
GRAPHFINDER_MCP_PORT45123Port of the embedded HTTP/SSE MCP server.
GRAPHFINDER_AUTO_APPEND_LINKSfalse1/true automatically appends suggested wikilinks when storing notes.
bash
# Portuguese / multilingual vault on a custom port
export GRAPHFINDER_MODEL=multilingual
export GRAPHFINDER_MCP_PORT=47000
graphfinder

Changing the embedding model changes vector dimensions/semantics. Re-index your projects (delete the project's index.db and run graphfinder sync) after switching.

15Architecture#

Frontend · React 19
  • GraphView (force-graph)
  • NoteEditor + preview
  • CodeInspector
  • Sidebar · Omnisearch
  • ProjectSwitcher · Modals
Tauri IPC
Rust core · Tauri v2
  • IPC commands (lib.rs)
  • MCP server (rmcp, axum)
  • Parser · Chunker
  • Code engine (AST-lite)
  • FastEmbed · Graph analytics
I/O
Local storage
  • Markdown vaults
  • Code repositories
  • index.db (SQLite WAL + FTS5)
  • projects.json
  • .fastembed_cache

Repository layout

tree
GraphFinder/
├── src/                      # React 19 + TypeScript frontend
│   ├── components/           # GraphView, NoteEditor, CodeInspector, Sidebar,
│   │                         # OmnisearchModal, McpModal, ArchitecturalReportModal…
│   ├── services/             # Tauri IPC bindings
│   └── types.ts
├── src-tauri/                # Rust backend
│   ├── src/main.rs           # CLI entry point (GUI when no args)
│   ├── src/lib.rs            # Tauri setup, IPC commands, embedded MCP HTTP server
│   ├── src/engine/
│   │   ├── parser.rs         # CommonMark AST, chunking, wikilinks, tags
│   │   ├── embeddings.rs     # FastEmbed model loading & inference
│   │   ├── db.rs             # SQLite schema, FTS5, hybrid RRF search
│   │   ├── vault.rs          # Engine: sync, watcher, note lifecycle
│   │   ├── code.rs           # Language detection, symbols, imports
│   │   ├── graph_analytics.rs# Communities, centrality, paths, exports
│   │   └── project.rs        # Multi-vault manager & registry
│   └── src/mcp/              # MCP tool definitions (mod.rs) & transports (server.rs)
├── .agents/skills/           # graphfinder & graphfinder-curator skills
├── mcp-tools/                # Exported tool schemas
├── docs/                     # This website (GitHub Pages)
└── AGENTS.md · MCP_TOOLS.md · CHANGELOG.md

Tech stack

LayerTechnology
Desktop runtimeTauri 2.12
BackendRust 2021 · Tokio · Axum 0.7 · rmcp 3.5
Embeddingsfastembed 4 (ONNX Runtime)
Storagerusqlite 0.32 (bundled SQLite, WAL, FTS5)
Parsingpulldown-cmark 0.13 · regex · walkdir
File watchingnotify-debouncer-mini 0.6
FrontendReact 19.2 · TypeScript 6 · Vite 8 · Tailwind CSS 4
UIRadix UI · Phosphor Icons · force-graph · marked · DOMPurify

16Security#

  • Loopback only — the MCP HTTP server binds to 127.0.0.1.
  • DNS-rebinding defense — the Host header is validated on every request.
  • Origin validation — strict middleware instead of permissive CORS.
  • Content Security Policy — enforced in tauri.conf.json.
  • XSS protection — Markdown previews are sanitised with DOMPurify.
  • Path traversal protection — project ids are sanitised before touching the filesystem.

Report vulnerabilities privately as described in SECURITY.md.

17Development#

ScriptPurpose
npm run devVite dev server for the frontend only (port 1420).
npm run appFull desktop app in dev mode (tauri dev).
npm run buildType-check and build the frontend into dist/.
npm run tauri buildRelease binaries and installers.
npm run lintLint with oxlint.
cargo test --manifest-path src-tauri/Cargo.tomlRust unit tests (parser, FTS5, embeddings math, language detection, imports, code search).
npm run sync | status | search | projects | mcpRun CLI commands via cargo run.

Releases

Pushing a tag matching v* (or running the Release workflow manually) triggers .github/workflows/release.yml: scripts/sync-version.js stamps the tag version into package.json, Cargo.toml and tauri.conf.json, then tauri-action builds and publishes installers for Windows, macOS and Linux.

bash
git tag v0.11.0
git push origin v0.11.0

Contributing

Bug reports, features, docs and PRs are welcome. Read CONTRIBUTING.md and the Code of Conduct.

18Troubleshooting & FAQ#

My agent can't connect to 127.0.0.1:45123.

The HTTP/SSE endpoint only exists while the desktop app is running. Open the app, or switch your client to stdio mode ("command": "graphfinder", "args": ["--mcp"]). If you changed GRAPHFINDER_MCP_PORT, update the URL.

graphfinder is not recognised in the terminal.

Run GraphFinder.exe install-cli (or graphfinder config --install) and open a new terminal so the updated PATH is loaded.

Search results are poor for Portuguese / other languages.

Set GRAPHFINDER_MODEL=multilingual and re-index.

The first start is slow.

The embedding model is downloaded once. Subsequent starts load it from .fastembed_cache; point GRAPHFINDER_MODELS to a local copy for air-gapped machines.

Some files are missing from the code graph.

Check whether they are ignored by .gitignore, are binary, exceed 1 MB, or have an unsupported extension. Run graphfinder sync to force an incremental update.

Does any data leave my machine?

No. Embeddings, search and analytics run locally. The only network access is the one-time model download (and this website checking the latest release on GitHub).

19Changelog#

Full history in CHANGELOG.md and on the Releases page.

v0.10.0currentOctober 2026
  • Graph analytics engine: communities, God Nodes, cross-community surprises, cycles.
  • New MCP tools find_path, explain_node, get_community_report, export_graph (24 total).
  • CLI commands report, path, explain, export, config --install, tools, install-cli.
  • Artifacts graph.json, GRAPH_REPORT.md, offline graph.html; architectural report modal in the app.
v0.4.02026-10-22
  • Multi-language codebase indexing and AST-lite import graph.
  • Code tools: search_code, find_files, get_file_context, read_code_chunk, get_code_dependencies.
  • Code Inspector drawer, language-coded graph rings, [All]/[Notes]/[Code] filters, incremental SHA-256 code sync.
v0.3.02026-10-21
  • Hybrid search (vectors + FTS5 BM25 via RRF), CommonMark AST parser, 320-token windowing.
  • Dual-mode MCP (HTTP/SSE + stdio), file watcher, vault-wide rename refactoring, multilingual model.
  • Zero-flicker canvas; security hardening (Host/Origin checks, CSP, DOMPurify, path sanitisation).
v0.2.02026-10-19
  • Multi-vault support with isolated databases; MCP embedded in the main binary (--mcp).
  • First 7 MCP tools, integration modal, project switcher, Swiss-minimal design system.
v0.1.02026-10-01
  • Initial release: single vault, header-based chunking, local FastEmbed, 2D graph, Markdown editor with wikilinks.

Give your agents a memory
that doesn't waste tokens.

Free and open source under the MIT license. Runs entirely on your machine.