Prev Next

AI / Graphify Interview questions

Last updated

1. What is Graphify? 2. What is a knowledge graph in the context of Graphify? 3. How do you install Graphify? 4. What does the /graphify command do? 5. What files does Graphify write to the graphify-out directory? 6. What is graph.json used for? 7. What is GRAPH_REPORT.md? 8. List the AI assistants Graphify supports? 9. What input types can Graphify process? 10. What is tree-sitter and why does Graphify use it? 11. What does the graphify extract command do? 12. What are the EXTRACTED, INFERRED and AMBIGUOUS edge tags? 13. How do you use graphify query? 14. What does graphify path do? 15. What does graphify explain do? 16. What is a god node in Graphify? 17. What is a community in Graphify? 18. What is the --code-only flag in Graphify? 19. What is a.graphifyignore file? 20. What is the Graphify MCP server? 21. What is the difference between Graphify and RAG? 22. How does Graphify differ from a language server? 23. Explain the internal working of Graphify's build pipeline? 24. How does Graphify resolve a call to one declaration? 25. Why can an INFERRED edge exist without an LLM? 26. When does Graphify use a model instead of the parser? 27. How does Graphify keep the graph up to date? 28. How does graphify hook install work for teams? 29. How can you share a Graphify graph across a team? 30. How does Claude Code integrate with Graphify? 31. What happens when a symbol name matches several declarations? 32. Why can Graphify's static analysis miss some dependencies? 33. How can you check a change's impact before editing? 34. How can you detect colliding pull requests with Graphify? 35. How can you reduce token usage with Graphify? 36. How can you combine several repositories into one graph? 37. How can you export a Graphify graph for reuse? 38. How does Graphify parse SQL and Terraform files? 39. When should you use Graphify instead of grep? 40. How do you troubleshoot an assistant that ignores the Graphify graph? 41. How do you troubleshoot a stale Graphify graph? 42. Why does an empty callers result not prove code is unused? 43. How does hosted Graphify differ from the open-source CLI? 44. How does the hosted MCP server authenticate agents? 45. What happens when a push reaches a hosted Graphify repository? 46. How does Graphify review a pull request? 47. How does Graphify's formal verification work? 48. How does Graphify Memory work? 49. How can you keep private code private when using Graphify? 50. How can you optimize Graphify for a large monorepo?

1. What is Graphify?

Graphify is an open-source tool that turns a folder of code, docs, PDFs, images and video or audio transcripts into a persistent, queryable knowledge graph. It is built mainly for AI coding assistants such as Claude Code, Cursor, Codex and Gemini CLI, but you can query the graph from a terminal as well.

You build the graph once and the assistant asks it questions instead of grepping through hundreds of files. Answers come back as paths between concepts, with a file and line on every hop.

The package on PyPI is graphifyy (two y's) and the command it installs is graphify. Graphify Labs also runs a hosted version at app.graphify.com that builds and refreshes the same kind of graph for you.

Take quiz
What does Graphify turn a project folder into?
A vector index of embedded text chunks
A generated unit-test suite
A compiled binary of the codebase
A persistent, queryable knowledge graph
Which PyPI package name installs the official Graphify?
graphifyai
graphifyy, with two y's
graph-ify-cli
graphify, with a single y

2. What is a knowledge graph in the context of Graphify?

It is a map of your project stored as nodes and edges. Nodes are things like functions, classes, modules, documents and concepts. Edges are the relationships between them, such as calls, imports, inherits and references.

Each node keeps its source file, and each edge keeps a relation name plus a confidence label. That is why a query result can point you back to the exact code it came from.

A trimmed example of what a query returns:

$ graphify query "what connects auth to the database?"

AuthService -> SessionStore -> DatabasePool      [EXTRACTED]
  src/auth/service.py:42 -> src/db/pool.py:17

The graph is saved to graph.json, so it persists between sessions instead of being rebuilt in the assistant's head every time.

Take quiz
In a Graphify graph, what does an edge represent?
A Git commit between two branches
A cached copy of a converted PDF
A relationship such as calls or imports between two nodes
One source file stored on disk
Which relation names can appear on Graphify edges?
calls, imports, inherits and references
compiles, deploys and signs
likes, follows and mentions
reads, writes and deletes only

3. How do you install Graphify?

Install the graphifyy package from PyPI, then register the skill with your assistant. The steps for Claude Code:

  1. uv tool install graphifyy installs the package and the graphify command.
  2. graphify install registers the /graphify skill with Claude Code.
  3. For other assistants run graphify install --platform codex (swap in your platform name).
  4. Check the setup with graphify --version.
  5. Inside the assistant, type /graphify . to build your first graph.

Watch the spelling. The official package is graphifyy with two y's, and a similarly named graphify package on PyPI is not a substitute.

Optional extras exist: graphifyy[mcp] adds the local MCP server and graphifyy[all] adds every optional language parser.

Take quiz
Which command registers the Graphify skill with Claude Code?
graphify install
graphify register --claude
pip install claude-graphify
uv run graphify skill
Which extra do you install to get the local MCP server?
graphifyy[server]
graphifyy[mcp]
graphifyy[http]

4. What does the /graphify command do?

/graphify . is a skill invocation that you type into your assistant's chat, not into a shell. It tells the assistant to build a knowledge graph of the folder, including docs and images, and write the results to graphify-out/.

Code is parsed locally. Documents, papers, images and transcripts are handled by semantic extraction that runs through the model session you already have open. Adding --update re-scans only the files that changed.

Where you type it Example What it is
Assistant chat /graphify . Skill invocation
Shell graphify extract . --code-only CLI command

Mixing the two up is the most common beginner mistake.

Take quiz
Where do you type /graphify . to build a graph?
Into the address bar of graph.html
In the AI assistant's chat
In a .graphifyignore file
In bash or PowerShell
Which flag re-scans only changed files when using the skill?
--rebuild-cache
--refresh-all
--update
--changed-only

5. What files does Graphify write to the graphify-out directory?

A build writes a small set of files you can open, commit or feed into other tools. The three you will touch most are graph.json, GRAPH_REPORT.md and graph.html.

File Purpose
graph.json Machine-readable graph used by the CLI, MCP and exports
GRAPH_REPORT.md Human-readable summary of communities and central concepts
graph.html Interactive browser visualization
manifest.json Fingerprints used to spot changed files
cache/ Cached extraction results
converted/ Converted content for inputs that need preprocessing
cost.json Local extraction cost info, when produced

Set the GRAPHIFY_OUT environment variable to change the output location, which helps when several worktrees need separate graphs.

Take quiz
Which file holds the fingerprints used to detect changed files?
cost.json
graph.html
converted/
manifest.json
How do you move Graphify's output to a different directory?
Rename graph.json to .graphifyrc
Graphify always reads ./graphify-out and cannot change it
Set the GRAPHIFY_OUT environment variable
Edit the header of GRAPH_REPORT.md

6. What is graph.json used for?

graph.json is the machine-readable copy of your knowledge graph. The CLI, the MCP server and the export commands all read it, so it is the file that makes the graph reusable.

It follows NetworkX node-link conventions. Nodes carry an id, a label and usually source_file and file_type. Edges connect node ids and carry a relation and a confidence tag. Current readers expect a links array and still accept older files that use edges.

You can point a query at any copy of it:

graphify query "authentication" --graph ./shared/graph.json

Treat the file like source code from an access point of view, since it holds labels and context taken from your repository.

Take quiz
Which JSON array do current Graphify readers expect for relationships?
pairs
links
relations
calls
Which convention does graph.json follow?
An OpenAPI document
A SQLite dump
A GraphQL schema
NetworkX node-link format

7. What is GRAPH_REPORT.md?

GRAPH_REPORT.md is the human-readable architecture report that Graphify writes beside the graph. It summarizes the communities it found, the central concepts and the notable connections between them.

Read it first when you join an unfamiliar codebase. It gives you the shape of the system in a few minutes, and you can then use graphify query or graphify explain to dig into anything that looks interesting.

Because it is plain Markdown, it diffs well in pull requests and many teams commit it next to graph.json so everyone, and every assistant, starts from the same picture.

Take quiz
Who is GRAPH_REPORT.md mainly written for?
People who want a readable summary of communities and key concepts
The compiler, as a build artifact
The Git server, to validate commits
The tree-sitter grammar loader
Which output file is the interactive visualization?
GRAPH_REPORT.md
graph.html
cost.json
manifest.json

8. List the AI assistants Graphify supports?

The official site lists 17 assistants for the local skill, including Claude Code, Cursor, Codex, Gemini CLI, GitHub Copilot, Aider, Amp and Devin. The count keeps growing as platforms are added.

A bare graphify install sets up Claude Code. For anything else you pass the platform name:

graphify install --platform codex
graphify install --platform droid
graphify install --platform trae

The graph is also served over MCP, so a client without a native skill can still query it. The hosted console goes further and lists around 30 clients, including Kiro, OpenCode, Warp and JetBrains Junie.

Take quiz
Which assistant does a plain graphify install set up?
Claude Code
GitHub Copilot
Cursor
Gemini CLI
How can a client without a native Graphify skill still use the graph?
By emailing graph.json to the assistant
By running graph.html inside the editor
Through a browser extension
Over MCP

9. What input types can Graphify process?

Graphify accepts code, documentation, research papers, images and video or audio. They do not all take the same route through the pipeline.

Input How it is read
Source code Parsed locally with tree-sitter and dedicated extractors, no model needed
SQL schemas, Terraform Structural extractors, which need an optional extra
Docs, papers, images Semantic extraction through a model
Video and audio Turned into transcripts first, then semantic extraction

YouTube sources are fetched with yt-dlp, so talks and tutorials can sit in the same graph as your code. Pass --code-only when you want to skip the model-based routes entirely.

Take quiz
Which input is sent through a model for extraction?
Python source files
Every file, including code
PDFs, images and transcripts
Only files listed in .graphifyignore
Which flag skips the model-based extraction routes?
--structure-lite
--code-only
--offline
--no-label

10. What is tree-sitter and why does Graphify use it?

Tree-sitter is a parsing library that turns source code into a syntax tree for each supported language. Graphify uses it to read code deterministically and locally, so the same code always produces the same declarations, imports and calls.

There are practical reasons beyond that:

  • No LLM and no API key are needed for the structural graph.
  • Every node and edge keeps its source file and line.
  • Coverage is broad: the open-source CLI supports 40 languages, 33 through tree-sitter grammars and 7 through built-in parsers.
  • Parsing is fast enough to rerun on every commit.

The hosted product lists 63 grammars. Some formats use heuristic or dedicated parsers, so support varies by language and by construct.

Take quiz
Why does tree-sitter suit Graphify's code extraction?
It embeds each function into vectors
It executes the code to record real calls
It is deterministic and runs locally without a model
It asks an LLM to guess the structure
How many languages does the open-source Graphify CLI support?
12, all through tree-sitter
5, all through regular expressions
63, all through built-in parsers
40, made up of 33 tree-sitter grammars and 7 built-in parsers

11. What does the graphify extract command do?

graphify extract runs the extraction pipeline from a shell, with no assistant chat involved. It parses the folder, builds the graph and writes the results to graphify-out/.

Two common forms:

graphify extract . --code-only
graphify extract ./docs --backend ollama

The first builds a structural graph from code alone, with no model and no key. The second runs semantic extraction on documents through a headless backend you configure, here a local Ollama model.

That makes it the right choice for CI jobs, scripts and any place where you cannot type a slash command into an assistant.

Take quiz
Which flag points graphify extract at a local model backend?
--backend ollama
--serve
--assistant chat
--model-free
Where do you run graphify extract?
Inside the assistant chat only
As a Git commit message
In a shell, headless
Inside graph.html

12. What are the EXTRACTED, INFERRED and AMBIGUOUS edge tags?

They are the confidence labels stored on every edge in graph.json. They tell you how Graphify came to know a relationship, so a guess never looks like a fact.

Tag Meaning Console style
EXTRACTED Explicit in the source, such as a call to a fully qualified name Solid line
INFERRED Derived by resolution or semantic analysis Dashed line
AMBIGUOUS Evidence does not settle on one clear relationship Dotted line

An INFERRED edge does not always come from a model. Static name and import resolution can produce one. Always read the evidence and any confidence score before treating it as fact.

Take quiz
Which tag means the relationship is written explicitly in the source?
OBSERVED
INFERRED
AMBIGUOUS
EXTRACTED
What is true of an INFERRED code edge?
It can come from static name and import resolution with no model
It was observed at runtime in traces
It is always written by an LLM
It is guaranteed correct

13. How do you use graphify query?

graphify query takes a plain-English question and returns the part of the graph around it, so the assistant reads a small, relevant slice instead of the whole repository.

graphify query "how does a request get authenticated" --budget 1500

Option Default Meaning
--dfs Off Follow one path deep instead of searching broadly
--context No filter Keep one kind of edge, such as call
--budget 2000 Approximate output token budget
--graph graphify-out/graph.json Which graph file to read

Name a feature, file or subsystem in the question. A specific question returns a smaller and more useful result than a broad one.

Take quiz
What is the default token budget for graphify query?
500
2000
Unlimited
10000
Which option follows one path deep instead of searching broadly?
--context
--graph
--dfs
--budget

14. What does graphify path do?

graphify path finds how two concepts connect and prints the chain of edges between them. Use it when you already know both ends, for example a handler and a database client.

graphify path "ApiHandler" "DatabaseClient"
graphify path "ApiHandler" "DatabaseClient" --undirected

By default it respects edge direction, so A calls B is not the same as B calls A. Add --undirected to explore connectivity regardless of direction, which helps when a directed search finds nothing.

A path is evidence from static analysis. It does not prove a request will actually travel that route at runtime.

Take quiz
Which flag makes graphify path ignore edge direction?
--undirected
--directed
--budget
--global
By default, how does graphify path treat the edge A calls B?
As an undirected link
As a directed link from A to B
As two unrelated nodes
As a runtime trace

15. What does graphify explain do?

graphify explain inspects a single node. Give it a function, class or concept and it shows what that node is and how it connects to its neighbors.

It fits naturally after the other two lookup commands. query finds the area, path links two points, and explain zooms in on one stop along the way.

graphify explain "build_from_json"

Use it when a query result mentions an unfamiliar name and you want its relationships without opening files first.

A typical flow: run graphify query, spot an unfamiliar node such as a session store, then explain it before opening any file. If you need to see how that node reaches a specific other node, switch to graphify path.

Take quiz
Which command inspects one node and its connections?
graphify watch
graphify export
graphify god-nodes
graphify explain
You want to see how two concepts connect, not details of one node. Which command?
graphify diagnose
graphify explain
graphify path
graphify tree

16. What is a god node in Graphify?

A god node is a highly connected node, a hub that many other nodes depend on or point to. graphify god-nodes lists them, and the hosted console shows the same idea as a Most connected list.

Graphify leaves out file-level nodes that collect imports mechanically, otherwise every file would look like a hub.

They matter for two reasons. They are the best entry points when you are learning a codebase, and they are the riskiest places to edit, because a change there fans out to many dependents.

graphify god-nodes

Take quiz
What defines a god node?
The root directory of the repository
A node created only by the model pass
A node whose edges are all AMBIGUOUS
A node with an unusually high number of connections
Which command lists the most connected nodes?
graphify god-nodes
graphify tree
graphify rank
graphify hubs --top

17. What is a community in Graphify?

A community is a group of densely connected nodes that behaves like a subsystem. Graphify finds them with community detection, using Leiden when the dependency is installed and falling back to NetworkX Louvain otherwise.

Grouping depends only on how nodes connect. Folder names and file dates play no part. Community names are separate: they come from your assistant or a configured backend.

Communities show up as colors on graph.html and as sections in GRAPH_REPORT.md. They also drive graphify prs --conflicts, which flags open pull requests that touch the same community.

Take quiz
What drives Graphify's community detection?
File modification dates
How densely nodes are connected
Folder names
Commit author names
Which algorithm is the fallback when Leiden is unavailable?
k-means clustering
NetworkX Louvain
DBSCAN
PageRank

18. What is the --code-only flag in Graphify?

--code-only limits graphify extract to the structural pass. It parses source with tree-sitter and the dedicated extractors and skips model-based extraction of docs, papers and images.

graphify extract . --code-only

No LLM and no API key are involved. The Graphify docs report about 19.6k nodes and 44k edges in roughly 26 seconds on the open-source repo itself with this flag.

Reach for it in CI, on repositories where nothing may leave the machine, or when you simply want a fast first graph before deciding whether the richer passes are worth the cost.

Take quiz
What does --code-only skip?
Model-based extraction of docs, papers and images
Resolving imports between files
Writing graph.json
tree-sitter parsing of source files
Which situation fits --code-only best?
Generating readable community names with a model
Indexing a folder of scanned PDFs
A CI job that must build a graph with no model credentials
Transcribing conference videos

19. What is a.graphifyignore file?

.graphifyignore tells Graphify which paths to skip. It uses the same syntax as .gitignore, so there is nothing new to learn.

vendor/
node_modules/
dist/
*.min.js

Excluding bulk and generated folders keeps the graph smaller and faster to build, and it stops machine-written code from crowding out the hubs that matter. It is also a simple way to keep sensitive folders out of the graph entirely.

Be careful not to ignore your test folders if you want test-to-code links later.

Keep the file with the project and commit it, so teammates and CI builds skip the same folders. Otherwise graphs built on different machines can quietly differ.

Take quiz
The syntax of .graphifyignore matches which file?
Makefile
package.json
robots.txt
.gitignore
Which folder is the best candidate to exclude?
tests/ that you want linked to code
docs/ that describe the architecture
node_modules/
src/ with application code

20. What is the Graphify MCP server?

It exposes the graph to an assistant through the Model Context Protocol, so the assistant calls tools like query_graph instead of reading files one by one. There are two flavors.

Local server Hosted server
Command or URL graphify-mcp https://api.graphify.com/mcp
Transport stdio by default Streamable HTTP
Tools Ten, such as query_graph and shortest_path 27, such as graphify_callers
Auth None, reads a local file OAuth in the browser

uv tool install "graphifyy[mcp]"
claude mcp add graphify -- graphify-mcp graphify-out/graph.json

Tool names differ between the two, so trust the live tool list your client shows.

Take quiz
Which transport does the local graphify-mcp server use by default?
Named pipes
stdio
gRPC
WebSocket
How many tools does the local Graphify MCP server expose?
Ten
Three
27
Fifty

21. What is the difference between Graphify and RAG?

Graphify returns paths of edges that were read from the code. A vector RAG pipeline returns chunks of text whose embeddings sit closest to the question. Graphify's own docs are explicit that it is not RAG: no embeddings, no similarity search.

Aspect Graphify Vector RAG
Unit returned A path of edges with file and line Top-k similar chunks
Index graph.json, no embeddings Vector database of embeddings
After a change Re-parse only changed files Re-embed the changed chunks
Strong at What calls this, what breaks Fuzzy search over prose
Typical gap Dynamic dispatch the parser cannot see A caller that reads nothing like its callee

The two combine well. Use the graph for structure and a vector index for loosely worded questions over documentation.

Take quiz
What does a Graphify answer consist of?
The top-k chunks closest in embedding space
A free-form summary with no sources
A list of files sorted by size
A path of edges with a file and line on each hop
Which question suits a graph better than vector search?
Show text similar to this changelog entry
Find docs that loosely mention our refund policy
Which paragraphs read like this error message?
What could break if I change parseConfig?

22. How does Graphify differ from a language server?

A language server answers one lookup at a time inside a running editor session, usually for one language in one project. Graphify keeps the whole picture as a saved graph that works across languages and repositories and can be queried without the editor.

Aspect Language server Graphify
Lives in Your editor session Files on disk or a hosted workspace
Scope One language and project Many languages and repositories
Question style Go to definition, find references Multi-hop: path, affected
Accuracy Compiler-accurate and type-aware Static extraction with confidence tags

They are complements. Keep the language server for exact in-editor navigation and use Graphify when an assistant needs the shape of the system.

Take quiz
Which is a genuine strength of Graphify over a language server?
Compiler-accurate type checking while you type
A saved graph traced across several hops and languages
Live diagnostics for the open file
Automatic refactoring of symbol names
What is a language server still best for?
Ranking the review queue by graph impact
Mapping call paths between repositories
Exact in-editor navigation for one language
Building shared team memory

23. Explain the internal working of Graphify's build pipeline?

The pipeline splits into two data paths that meet in the middle. Structure comes from the code, and meaning comes from documents and media.

flowchart LR
  A["Code and manifests"] --> B["Local structural extraction"]
  C["Docs and media"] --> D["Semantic extraction"]
  B --> E["Merge and resolve relationships"]
  D --> E
  E --> F["Communities and report"]
  F --> G["graph.json"]
  G --> H["CLI and MCP queries"]
  1. Structural extraction. Tree-sitter and dedicated extractors find functions, classes, imports and calls. This runs locally and needs no model.
  2. Semantic extraction. Documents, papers, images and transcripts contribute concepts through a model, which is a separate data path.
  3. Resolve and merge. References are linked across files and fragments are combined, each edge keeping a provenance label.
  4. Cluster. Leiden, or Louvain as a fallback, groups nodes into communities, and names may be added.
  5. Write outputs. graph.json, the report and the HTML view land in graphify-out/.

A SHA256-based cache means later runs reprocess only the files that changed.

Take quiz
Which pipeline step needs no language model?
Structural extraction of code with tree-sitter
Concept extraction from PDFs
Reading image content
Optional community naming
What does the pipeline finally write to graphify-out?
A vector database of embeddings
A Docker image of the repo
graph.json plus the report and HTML view
Compiled bytecode of the project

24. How does Graphify resolve a call to one declaration?

A parser can see that checkout() calls total(), but it cannot tell which total(). Graphify resolves the name from evidence in the code: the imports in the file, where each candidate is declared, and the receiver's type for obj.method() calls.

from billing import total

def checkout(cart):
    return total(cart)   # the import points at exactly one declaration

The rule is deliberately conservative. Graphify draws an edge only when the name resolves to exactly one declaration. If two could match, it leaves the edge out or marks it AMBIGUOUS.

A missing edge is a visible gap. A confidently wrong edge would quietly mislead an assistant, which is the worse failure.

Receiver types matter most in object-oriented code. Two classes can each define save(), so a call like user.save() only earns an edge when the type of user is known.

Take quiz
What does Graphify do when two declarations could match a call?
Asks the user to rename one function
Skips the edge or marks it ambiguous instead of guessing
Picks the alphabetically first declaration
Adds both edges tagged EXTRACTED
What helps resolve an obj.method() call to one declaration?
Line length of the call
File modification time
The commit author
The receiver's type

25. Why can an INFERRED edge exist without an LLM?

Because INFERRED describes how an edge was derived, not who derived it. Static name and import resolution can work out a relationship that is not spelled out literally, for example a method call resolved through a local type, and that edge is tagged inferred.

A semantic backend can also infer links between documents and code. That is a separate path, so the tag alone does not tell you which one produced the edge.

Practical rule: read the evidence and any confidence score, then open the cited source. In the hosted console the same edges show as inferred, and a fourth tag, observed, is reserved for relationships seen at runtime, which a build from source never produces.

Take quiz
Where does an INFERRED code edge usually come from?
Static name and import resolution
Runtime traces
The Git commit history
A human reviewer
What does the observed tag in the console mean?
Seen at runtime, which a source build never produces
Derived by an LLM
Extracted straight from the AST
Flagged ambiguous by the model pass

26. When does Graphify use a model instead of the parser?

Never for code structure. A model appears only in a few clearly labeled places, and most can be switched off.

Where What the model does How to avoid it
Docs, papers, images, transcripts Extracts concepts and how they relate to code --code-only
Community names Gives each group a readable name --no-label with cluster-only
Duplicate entities Breaks ties the deterministic pass cannot Leave --dedup-llm off, it is opt-in
Wiki, answers, reviews (hosted) Writes explanations from the graph Hosted product only

Semantic extraction may send its input to the provider you select, so choose the backend deliberately. A local code parse never sends files to a model.

Take quiz
Which flag turns on model-based tiebreaks for duplicate entities?
--model-names
--dedup-all
--dedup-llm
--semantic-merge
Does the local code parse send source files to a model?
Only when graph.html is open
Only for Java and C#
Yes, for every function
No, it runs locally with tree-sitter

27. How does Graphify keep the graph up to date?

It reprocesses only what changed. Fingerprints in manifest.json and the extraction cache let Graphify skip every unchanged file, so refreshes stay cheap even on large repositories. This is the big difference from RAG pipelines that re-embed content.

Command When it runs
graphify update . On demand, changed files only
graphify watch . Rebuilds as you save files
graphify hook install After commits, pulls, merges and rebases
graphify check-update . Checks whether an update is needed
/graphify . --update Same refresh from inside the assistant

Pick the lightest option that matches how stale you can tolerate the graph being. A hook is usually enough for a team.

Take quiz
Which command rebuilds the graph as files are saved?
graphify hook install
graphify watch .
graphify export html
graphify check-update .
How does Graphify know which files changed?
It reads git blame for every line
Fingerprints stored in manifest.json plus the extraction cache
It compares only file sizes
It asks the model which files look different

28. How does graphify hook install work for teams?

It installs Git hooks that refresh the graph after commits, pulls, merges and rebases, so the graph tracks the repository without anyone remembering to run an update.

graphify hook install
graphify hook status
graphify hook uninstall

Third-party write-ups also describe a merge driver that union-merges graph.json when two developers commit in parallel. Check your installed version before relying on that.

If you commit graphify-out/, hooks mean every teammate's assistant reads a graph that matches the current branch tip, rather than whatever was built last week.

Hooks suit teams because they remove the human step. A graph refreshed on every pull or rebase rarely drifts far from HEAD, which is what makes a shared graph safe to rely on.

If a hook ever gets in the way, graphify hook uninstall removes it cleanly and graphify update . still works by hand.

Take quiz
Which command shows whether the Graphify hooks are active?
graphify hook verify
graphify hook list --all
graphify hook status
graphify watch --hooks
Which Git events trigger a refresh once hooks are installed?
Commits, pulls, merges and rebases
Only npm install runs
Only manual tags
Only force pushes

29. How can you share a Graphify graph across a team?

There are three common routes, and they differ mainly in who builds the graph and where it lives.

  • Commit graphify-out/. One person builds it and everyone's assistant reads the same files. Pair it with graphify hook install to keep it fresh.
  • Self-host the MCP server. Run the open-source server over HTTP in Docker behind an API key you control.
  • Use a hosted workspace. The graph and memory live in the workspace and every connected agent reads them.

Whichever you pick, remember the graph holds labels and context derived from your code. Give it the same access controls as the repository itself.

When several Git worktrees need independent graphs, set GRAPHIFY_OUT to a different directory for each.

Take quiz
Why should a committed graph.json be treated like source code?
It embeds your SSH private keys
It is an executable binary
It stores database passwords by default
It contains labels and context derived from the repository
Which environment variable gives each worktree its own graph output?
GRAPHIFY_ROOT
GRAPHIFY_OUT
GRAPHIFY_CACHE
GRAPHIFY_TREE

30. How does Claude Code integrate with Graphify?

Through a skill, an always-on nudge and an optional MCP server. Set up in this order:

  1. graphify install --platform claude copies the skill to ~/.claude/skills/graphify/.
  2. graphify claude install adds a ## graphify section to CLAUDE.md and writes PreToolUse hooks to .claude/settings.json.
  3. claude mcp add graphify -- graphify-mcp graphify-out/graph.json connects the local MCP server.

The hooks watch Bash|Grep and Read|Glob calls through graphify hook-guard. When a fresh graph exists, the guard adds a reminder to query the graph first.

It never blocks a tool call unless you opt in with hook-guard read --strict, which blocks the first raw read in a session.

Take quiz
Does hook-guard block raw file reads by default?
No, it only adds a reminder when a fresh graph exists
Yes, every read is blocked
Yes, after three reads in a session
Only for files over 1 MB
Which file receives the PreToolUse hooks?
.graphifyignore
graph.json
.claude/settings.json
manifest.json

31. What happens when a symbol name matches several declarations?

Graphify does not silently choose one. In the hosted tools, every match is listed under ambiguous and the result tells you which symbol it used, so you can check that it is the one you meant.

Impact queries behave slightly differently. graphify_impact combines the results for same-named symbols, and the resolved and seeds fields show what went into that answer.

When a name has no exact match, you get an error with similar candidates, or a semantic match instead of an exact one. That is a suggestion, not the symbol you asked for.

The fix is simple. Give the full name, or name the file the symbol lives in.

Take quiz
How does a hosted lookup report several matching symbols?
It silently picks the first one
It returns an HTTP 500 error
It deletes the duplicates
It lists them under ambiguous
A lookup returns a semantic match rather than exact. What should you do?
Check the labels and resolution fields before trusting it
Switch to --undirected
Treat it as the symbol you asked for
Rebuild the graph from scratch

32. Why can Graphify's static analysis miss some dependencies?

Because it maps what the code says, not what runs. Anything resolved only at runtime can fall outside a source-level graph.

  • Dynamic calls: calls by string name, reflection, getattr, dependency injection and plugin registries.
  • Framework wiring: routes, decorators and handlers that a framework invokes may show no caller.
  • External callers: another team's service, a cron job or a public API client outside the indexed repositories.
  • Generated code and missing inputs: files that were never scanned.
  • Missing optional extras: SQL, Terraform and several other languages are parsed only when their extra is installed.
  • Stale scans: the graph is a snapshot.

Treat every result as evidence. Open the cited source, check freshness, and use grep for exact strings such as config keys.

Take quiz
Which kind of call usually escapes static extraction?
A call to a fully qualified function
A call made by string name through reflection
A direct import of a named function
A class inheriting from a declared base class
What is the right way to handle a possibly incomplete result?
Delete graph.json and stop using it
Trust INFERRED edges as facts
Open the cited source and check how fresh the graph is
Disable the extraction cache

33. How can you check a change's impact before editing?

Ask the graph what depends on the thing you plan to change. Locally that is one command, and the hosted MCP tools split the job into three steps.

graphify affected "build_from_json"

  1. graphify_impact lists the callers and callees directly connected to the symbol.
  2. impact_and_risk ranks the riskiest files by combining that with linked test coverage.
  3. graphify_tests_for lists tests linked through imports and calls.

Remember the limits. graphify_impact is a first pass covering direct connections, not every transitive effect, and none of these tools run tests or prove a change is safe. Read the code they point to before you edit.

Use the tests list as your starting point: run those first, then widen. If a pull request is already open, the review step covers the same ground automatically.

Take quiz
Which CLI command inspects the dependents of a node?
graphify blame "<node>"
graphify diff "<node>"
graphify revert "<node>"
graphify affected "<node>"
What does graphify_impact return?
A formal proof that the change is safe
Pass or fail results from running the test suite
Directly connected callers and callees as a first pass
Every transitive dependency, guaranteed

34. How can you detect colliding pull requests with Graphify?

Two pull requests can both pass review and still collide when they change the same part of the code. graphify prs --conflicts groups open pull requests that share a graph community, which flags merge-order risk.

graphify prs --conflicts
graphify prs --triage
graphify prs 482

Option Meaning
--conflicts Group open PRs that share a community
--triage Rank the review queue with a model
--base Only PRs targeting this branch
--repo Read PRs from another repository

It needs the GitHub CLI signed in, and triage reads GRAPHIFY_TRIAGE_BACKEND to pick the model. The result is a risk signal, not a promise of a textual conflict.

A practical routine: run --conflicts before merge day, agree an order for the PRs that share a community, then rebase each remaining branch and rerun tests after every merge. Config and generated files can still collide without showing up in the graph.

Take quiz
What does graphify prs --conflicts group together?
Pull requests older than 30 days
Open pull requests that share a graph community
Pull requests with identical titles
Pull requests by the same author
Which environment variable selects the model backend for triage?
GRAPHIFY_REVIEW_KEY
GRAPHIFY_MODEL_ID
GRAPHIFY_PR_MODEL
GRAPHIFY_TRIAGE_BACKEND

35. How can you reduce token usage with Graphify?

The saving comes from reading less. The assistant asks the graph first and opens only the files and lines the answer names.

  • Run graphify query before the first grep or source read.
  • Cap results with --budget, which defaults to 2000 tokens.
  • Filter by edge type with --context call.
  • Build with --code-only to skip the paid model passes.
  • Exclude bulk folders with .graphifyignore.

To measure it on your own repository, run graphify benchmark. On the Graphify repo it estimated roughly 791 times fewer tokens per query than a naive read-everything baseline.

That figure is an estimate against a deliberately naive baseline, not a measurement of a real session, so expect your own number to vary with repository size.

Take quiz
What does graphify benchmark compare?
A graph query against a naive read-the-whole-corpus baseline
Two different LLM vendors
Two versions of tree-sitter
Build time on different laptops
Which option caps the size of a query result?
--graph
--budget
--dfs
--undirected

36. How can you combine several repositories into one graph?

Locally you merge graph files. In the hosted product you pick repositories with Combine graphs.

graphify merge-graphs first.json second.json --out combined.json
graphify global add graphify-out/graph.json --as my-project
graphify global list

Choose a unique project name when registering globally. graphify global remove undoes a registration.

Across the boundary, Graphify adds edges in two deterministic passes. A call whose receiver type resolves to exactly one declaration in another repository gets a calls edge. Two repositories that declare a type with the same namespace and name are linked with same_type_as.

That second edge links the nodes rather than merging them, so drifted copies of a shared contract stay visible.

A typical use is a web client, an API and an event consumer in separate repositories. After combining them, a path query can cross from a client call into the service that handles it.

Take quiz
Which edge links same-named types declared in two repositories?
same_type_as
duplicate_of
mirrors
inherits_remote
Which command merges two graph files into one?
graphify global merge
graphify combine --files
graphify join
graphify merge-graphs

37. How can you export a Graphify graph for reuse?

graphify export <format> turns the saved graph into other shapes without rebuilding it. The docs cover HTML, JSON and more, so run graphify export with no format to see what your version supports.

graphify export html
graphify export callflow-html --output docs/architecture.html

export html regenerates the interactive visualization on its own. callflow-html writes an architecture call-flow page that you can drop into your docs.

Exports read graph.json, so they are cheap to rerun after an update. The graph holds source-derived context, so check who can see an export before you publish it.

Pick HTML for people and JSON for tools. Both come from the same graph.json, so an export never drifts from the graph it was made from.

Take quiz
Which command writes an architecture call-flow page to docs/architecture.html?
graphify tree --html docs/architecture.html
graphify path --callflow
graphify export callflow-html --output docs/architecture.html
graphify docs build
Which command regenerates only the interactive visualization?
graphify export html
graphify check-update .
graphify update .
graphify cluster-only .

38. How does Graphify parse SQL and Terraform files?

Both have dedicated structural extractors, but they sit behind optional extras. Without the extra installed, those files are simply not parsed.

The same applies to R, Erlang, Solidity, OCaml, Common Lisp, VB.NET, DreamMaker and Robot Framework. Everything else works with the default install.

pip install "graphifyy[sql]"
pip install "graphifyy[all]"

The first command adds one extra. The second adds all of them. If a database schema or Terraform module is missing from your graph, a missing extra is the first thing to check.

If you installed with uv tool install, add an extra by reinstalling with it named, for example uv tool install "graphifyy[all]", then rebuild so the new parsers see your files.

Take quiz
Which command installs every optional language extra?
uv tool install graphify-all
pip install graphifyy --languages
pip install "graphifyy[all]"
pip install graphifyy-extras
What happens to a Terraform file when its extra is not installed?
It is parsed but tagged AMBIGUOUS
It is not parsed until the extra is installed
It is parsed by a model instead
It is parsed with a generic text splitter

39. When should you use Graphify instead of grep?

Use Graphify when the question is about how code connects. Use grep when you are looking for an exact string. The docs say so directly.

Question Better tool
Where does the string ECONNRESET appear? grep
Which config key sets the timeout? grep
What connects auth to the database? Graphify
Who calls createSession? Graphify
What could break if I change this function? Graphify
Where do I start in this unfamiliar repo? Graphify

Grep finds text, so it cannot follow a call across files or tell you what depends on a symbol. The graph cannot see string contents it never indexed. Most days you will use both.

Take quiz
Which task still fits grep best?
Estimating the blast radius of a change
Listing the hub nodes of a repository
Tracing a request from route to database
Finding where an exact error message string appears
Which question is best answered by Graphify?
Which file contains the word TODO?
What is the exact value of this config key?
Where does ECONNRESET appear in logs?
What connects auth to the database?

40. How do you troubleshoot an assistant that ignores the Graphify graph?

Work from the cheapest check to the most involved one.

  1. Confirm graphify-out/graph.json exists at the repository root.
  2. Confirm the skill and hooks are installed. For Claude Code, look for the ## graphify section in CLAUDE.md and the hooks in .claude/settings.json.
  3. Name Graphify in the prompt, for example "Use Graphify to answer".
  4. Check freshness. The guard only nudges when the graph is fresh, so run graphify update . or install the hook.
  5. For MCP, run /mcp in Claude Code to confirm the server is connected, and install graphifyy[mcp] if it fails to start.
  6. For the hosted server, call list_repositories. An empty list means sign-in worked but nothing is indexed.
  7. If answers still never cite graph evidence, ask for a specific tool by name, such as query_graph or graphify_callers, and check that the reply carries file paths and line numbers.
Take quiz
Why might hook-guard stay silent in Claude Code?
No fresh graph exists to point the assistant at
CLAUDE.md contains too many words
The graph is too accurate
The terminal theme is set to dark
What is a quick check that the hosted connection works?
Open graph.html in a browser
Call list_repositories
Run graphify benchmark
Delete .graphifyignore

41. How do you troubleshoot a stale Graphify graph?

First work out which kind of graph you have, because staleness has different causes.

  • Local: graph.json is a snapshot. Run graphify check-update . and then graphify update .. For the long term use graphify watch . or graphify hook install.
  • Hosted: the graph reflects the default branch only. Code on a feature branch or uncommitted work is not in it.

On the hosted side, call graph_stats to see whether the repository is indexed and how old the commit is. Results also carry a freshness field. If the repository shows Out of date, start a reindex from the console.

Before editing, read the local files the graph pointed to. Your checkout can be ahead of the index.

For a local graph, also confirm the hook is still present with graphify hook status. A missing hook is a common reason a graph drifts without anyone noticing.

Take quiz
Which hosted tool reports whether a repository is indexed and how fresh it is?
remember
list_workspaces
graph_stats
graphify_find
Is code on a feature branch present in the hosted graph?
Yes, but only for labeled PRs
No, the graph follows the default branch
Only for branches under 100 commits
Yes, after every push

42. Why does an empty callers result not prove code is unused?

An empty list only describes the indexed graph. It says the index found no callers, not that none exist.

Several things hide real callers: dynamic dispatch and reflection, framework wiring, external consumers such as another team's service, and an index that is out of date.

There is also a default to know about. graphify_callers returns only resolved call edges unless you ask for strict_calls=false, which includes inferred ones.

Before deleting anything, search for dynamic usage and external consumers, then confirm the graph is fresh. The console's dead-code findings ask for the same check.

A better signal combines several checks: callers from the graph, graphify_references for non-call uses such as reads and mentions, linked tests, and a plain text search for the name in config and scripts.

Take quiz
What does strict_calls=false do on graphify_callers?
Includes inferred call edges as well as resolved ones
Deletes ambiguous edges from the graph
Forces a full reindex
Disables the extraction cache
What is the safe step before deleting a symbol with no callers?
Delete it immediately
Switch the graph to undirected mode
Rebuild with --dfs
Search for dynamic usage and external consumers

43. How does hosted Graphify differ from the open-source CLI?

They build the same kind of graph. The difference is who runs it and what sits around it.

Aspect Open-source CLI Hosted Graphify
Setup uv tool install graphifyy Connect a repo at app.graphify.com
Graph lives graphify-out/ on your machine A workspace
Freshness update, watch, hooks Reindexed on each default-branch push
Agent access Skill, CLI, ten-tool local MCP api.graphify.com/mcp, 27 tools, OAuth
Grammars 40 languages 63 grammars
Extras Hooks, PR commands Reviews, formal verification, memory, wiki

The engine is free and needs no account. The hosted product has a Free plan covering up to 3 indexed repositories, with Pro and Teams above it.

Take quiz
Where does the hosted Graphify MCP server live?
http://localhost:8000/mcp
https://app.graphify.com/api/graph.json
https://api.graphify.com/mcp
ssh://graphify.local/mcp
How many indexed repositories does the hosted Free plan allow?
Up to 3
Unlimited
Up to 50
Exactly 1

44. How does the hosted MCP server authenticate agents?

With OAuth in a browser. There is no API key. A person finishes the sign-in once, then the client refreshes tokens on its own.

sequenceDiagram
  participant A as Agent
  participant B as Browser
  participant S as Graphify MCP server
  A->>S: Connect to the MCP endpoint
  S-->>A: 401, sign-in needed
  A->>B: Person opens the sign-in link
  B->>S: OAuth authorization code with PKCE
  S-->>A: Access token and refresh token
  A->>S: Tool calls with the access token
  A->>S: Refresh when the token expires
  S-->>A: New access token and rotated refresh token

Each refresh rotates the refresh token, so a client that reuses an old one must sign in again. There is no device-code or client-credentials flow, which means a headless agent cannot sign itself in.

On a 401 an agent should tell the person which sign-in step to run and stop, not retry in a loop. Limits are 240 requests a minute per client IP and a 256 KB body. For fully headless use, self-host the open-source MCP server behind an API key you control.

In setups with more than one workspace, set_workspace binds a session to one for 24 hours by default. A bot that runs longer should call list_workspaces to check which one is active.

Take quiz
How does the hosted Graphify MCP server authenticate a client?
A client-credentials flow with no human
OAuth sign-in completed once in a browser
A static API key in the config file
An SSH key stored in graph.json
What should an agent do when it receives a 401?
Retry in a tight loop
Delete its refresh token and guess a new one
Tell the person which sign-in step to run, then stop
Switch to a different repository

45. What happens when a push reaches a hosted Graphify repository?

Only a push to the default branch starts a new index. Everything else leaves the graph alone.

flowchart TD
  A["Push or pull request event"] --> B{Default branch push?}
  B -- Yes --> C["Index that commit"]
  B -- No --> D{Pull request?}
  D -- Yes --> E["No new graph, review uses default-branch graph plus diff"]
  D -- No --> F["Nothing happens"]
Event Result
Push to default branch That commit is indexed
Push to another branch Nothing
Pull request No new graph, review reads the default-branch graph and the diff
Retry on a failed build Indexes the current head of the default branch

Only one index of a repository runs at a time, and a later push waits or joins the queued build. A newly connected repository stays Paused and Not indexed until you switch indexing on. Hosted plans can cap push-triggered indexes per UTC day, while a manual reindex does not count.

A change on a feature branch is therefore invisible to hosted queries until it merges. Each result carries a freshness field with the indexed commit and its age, so you can tell when an answer predates your latest merge.

Take quiz
Which push triggers a new hosted index?
Only a push tagged with a release
A push to any branch
A push to a pull request branch only
A push to the default branch
What is the status of a newly connected repository?
Indexed immediately
Paused and Not indexed until indexing is switched on
Failed until retried
Out of date but queryable

46. How does Graphify review a pull request?

It reviews against the graph, so a finding can point past the diff to the callers and dependencies a change reaches. Reviews are advisory and never block a merge.

  1. A review runs when a pull request is opened, reopened or marked ready for review. A draft waits.
  2. Later pushes do not start a new review. Comment @graphify review to review the current head. It works for owners, members and collaborators.
  3. The review uses the indexed default-branch graph plus the pull request's diff. It does not index the PR branch.
  4. Read findings in Reviews, along with optional advisory sections on risky patterns and possibly stale docs.

You can teach it by replying on the pull request:

  • @graphify wrong <finding> dismisses a false positive.
  • @graphify good <finding> confirms a useful finding.
  • @graphify suppress <rule> mutes a rule, optionally for one path.
Take quiz
How do you get a review of the current head after pushing new commits?
Delete graphify-out and push again
Wait for the nightly reindex
Run graphify prs --triage in CI
Comment @graphify review on the pull request
What does @graphify suppress <rule> do?
Stops surfacing findings from that rule
Merges the pull request
Deletes the rule from the graph
Marks formal verification as passed

47. How does Graphify's formal verification work?

It compares a changed function with its previous version and either proves they behave the same within a checked range or finds a concrete input that gives a different result. This is called equivalence checking, and it needs no written spec.

Because proofs are bounded, there are five outcomes rather than pass and fail:

Verdict Meaning
= Proven same No input in scope differs
≠ Behavior changed A counterexample input gives a different result
≈ No change found Sampling found nothing, evidence rather than proof
? Not checked Out of scope or over budget
! Couldn't run The check itself failed

The check compares against the merge base, runs on every push, and appears as an advisory check on GitHub that never blocks a merge. It is GitHub-only for now and can be toggled per repository.

One catch applies to equivalence in general: if the old code had a bug, an equivalent new version has it too.

Take quiz
How does a counterexample verdict appear in Graphify?
Not checked
Proven same
Behavior changed
No change found
Why is No change found not a proof?
It means the function was deleted
It means the tests failed
Sampling found no difference, which is evidence only
It means the verifier crashed

48. How does Graphify Memory work?

Memory keeps what the team and its agents learn about the code, so the next session does not start from zero. Three MCP tools drive it.

Tool What it does
remember Saves one fact to workspace memory
recall Searches memory with a question
memories_about Returns what is remembered about one file or symbol

A saved fact starts as a suggestion that waits for review. Once you keep it in the Memory page it becomes a reviewed memory that every connected agent can recall. Agents should ask before calling remember.

Graphify also records reviews, verifications and merged pull requests automatically, in plain language, with one-click undo.

Take quiz
Which tool returns what is remembered about a single file or symbol?
set_workspace
memories_about
graph_stats
graphify_find
What is the status of a freshly saved fact?
A suggestion that waits for review
A private note deleted after the session
A reviewed memory shared at once
A pinned item in graph.json

49. How can you keep private code private when using Graphify?

Start from the split between the two data paths. The code parse is local and never sends files to a model. The open-source engine also has no cloud backend and sends no telemetry.

The risk sits in semantic extraction, which may send its input to the provider you select. Control it like this:

  • Use --code-only when nothing may leave the machine.
  • Use a local backend such as --backend ollama for documents.
  • Add secrets and sensitive folders to .graphifyignore.
  • Skip model-generated community names with --no-label.

Finally, treat graph.json and the report like source code, since they hold labels and context from your repository. The hosted product builds the graph for the repositories you connect, so choose those deliberately.

Do a quick audit before committing graphify-out/. Labels and report text come from your code, so they can contain internal names you did not intend to publish.

Take quiz
How can document extraction stay entirely on your machine?
Commit graph.json to a public repo
Run graphify watch .
Pass --no-label
Use a local backend such as ollama
Does the open-source Graphify engine send telemetry?
No, it sends none
Yes, anonymized usage data
Only on Windows
Only when hooks are installed

50. How can you optimize Graphify for a large monorepo?

Shrink the input first, then keep refreshes incremental, then keep queries small.

  1. Ignore bulk. Put vendor/, node_modules/, dist/ and generated code in .graphifyignore.
  2. Start structural. Run graphify extract . --code-only for a fast, model-free first graph.
  3. Stay incremental. Use graphify update ., watch or hook install instead of full rebuilds.
  4. Separate worktrees. Set GRAPHIFY_OUT per worktree so graphs do not collide.
  5. Query narrowly. Name a subsystem, filter with --context call and cap output with --budget.

For CI and teams, build the graph in a job and post pull request impact from it, or self-host a shared MCP server over HTTP. On hosted Graphify, prefer query_graph over the canvas for very large graphs, since the console can decline to draw one that is too large to display.

Take quiz
What is the cheapest sensible first build for a huge monorepo?
Building with --dfs on the whole tree
graphify extract . --code-only with ignores in place
/graphify with every PDF attached
A full rebuild on each file save
Which option narrows a query to call edges only?
--backend ollama
--dfs
--undirected
--context call
«
»

Comments & Discussions