AI / Graphify Interview questions
Last updated
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
A vector index of embedded text chunks
A generated unit-test suite
A compiled binary of the codebase
A persistent, queryable knowledge graph
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
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
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:
uv tool install graphifyyinstalls the package and thegraphifycommand.graphify installregisters the/graphifyskill with Claude Code.- For other assistants run
graphify install --platform codex(swap in your platform name). - Check the setup with
graphify --version. - 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
graphify install
graphify register --claude
pip install claude-graphify
uv run graphify skill
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
Into the address bar of graph.html
In the AI assistant's chat
In a .graphifyignore file
In bash or PowerShell
--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
cost.json
graph.html
converted/
manifest.json
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
pairs
links
relations
calls
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
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
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
Claude Code
GitHub Copilot
Cursor
Gemini CLI
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
Python source files
Every file, including code
PDFs, images and transcripts
Only files listed in .graphifyignore
--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
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
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
--backend ollama
--serve
--assistant chat
--model-free
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
OBSERVED
INFERRED
AMBIGUOUS
EXTRACTED
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
500
2000
Unlimited
10000
--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
--undirected
--directed
--budget
--global
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
graphify watch
graphify export
graphify god-nodes
graphify explain
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
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
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
File modification dates
How densely nodes are connected
Folder names
Commit author names
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
Model-based extraction of docs, papers and images
Resolving imports between files
Writing graph.json
tree-sitter parsing of source files
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
Makefile
package.json
robots.txt
.gitignore
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
Named pipes
stdio
gRPC
WebSocket
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
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
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
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
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"]
- Structural extraction. Tree-sitter and dedicated extractors find functions, classes, imports and calls. This runs locally and needs no model.
- Semantic extraction. Documents, papers, images and transcripts contribute concepts through a model, which is a separate data path.
- Resolve and merge. References are linked across files and fragments are combined, each edge keeping a provenance label.
- Cluster. Leiden, or Louvain as a fallback, groups nodes into communities, and names may be added.
- Write outputs.
graph.json, the report and the HTML view land ingraphify-out/.
A SHA256-based cache means later runs reprocess only the files that changed.
Take quiz
Structural extraction of code with tree-sitter
Concept extraction from PDFs
Reading image content
Optional community naming
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
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
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
Static name and import resolution
Runtime traces
The Git commit history
A human reviewer
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
--model-names
--dedup-all
--dedup-llm
--semantic-merge
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
graphify hook install
graphify watch .
graphify export html
graphify check-update .
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
graphify hook verify
graphify hook list --all
graphify hook status
graphify watch --hooks
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 withgraphify hook installto 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
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
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:
graphify install --platform claudecopies the skill to~/.claude/skills/graphify/.graphify claude installadds a## graphifysection toCLAUDE.mdand writes PreToolUse hooks to.claude/settings.json.claude mcp add graphify -- graphify-mcp graphify-out/graph.jsonconnects 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
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
.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
It silently picks the first one
It returns an HTTP 500 error
It deletes the duplicates
It lists them under ambiguous
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
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
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"
graphify_impactlists the callers and callees directly connected to the symbol.impact_and_riskranks the riskiest files by combining that with linked test coverage.graphify_tests_forlists 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
graphify blame "<node>"
graphify diff "<node>"
graphify revert "<node>"
graphify affected "<node>"
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
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
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 querybefore 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-onlyto 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
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
--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
same_type_as
duplicate_of
mirrors
inherits_remote
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
graphify tree --html docs/architecture.html
graphify path --callflow
graphify export callflow-html --output docs/architecture.html
graphify docs build
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
uv tool install graphify-all
pip install graphifyy --languages
pip install "graphifyy[all]"
pip install graphifyy-extras
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
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 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.
- Confirm
graphify-out/graph.jsonexists at the repository root. - Confirm the skill and hooks are installed. For Claude Code, look for the
## graphifysection inCLAUDE.mdand the hooks in.claude/settings.json. - Name Graphify in the prompt, for example "Use Graphify to answer".
- Check freshness. The guard only nudges when the graph is fresh, so run
graphify update .or install the hook. - For MCP, run
/mcpin Claude Code to confirm the server is connected, and installgraphifyy[mcp]if it fails to start. - For the hosted server, call
list_repositories. An empty list means sign-in worked but nothing is indexed. - If answers still never cite graph evidence, ask for a specific tool by name, such as
query_graphorgraphify_callers, and check that the reply carries file paths and line numbers.
Take quiz
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
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.jsonis a snapshot. Rungraphify check-update .and thengraphify update .. For the long term usegraphify watch .orgraphify 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
remember
list_workspaces
graph_stats
graphify_find
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
Includes inferred call edges as well as resolved ones
Deletes ambiguous edges from the graph
Forces a full reindex
Disables the extraction cache
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
http://localhost:8000/mcp
https://app.graphify.com/api/graph.json
https://api.graphify.com/mcp
ssh://graphify.local/mcp
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
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
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
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
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.
- A review runs when a pull request is opened, reopened or marked ready for review. A draft waits.
- Later pushes do not start a new review. Comment
@graphify reviewto review the current head. It works for owners, members and collaborators. - The review uses the indexed default-branch graph plus the pull request's diff. It does not index the PR branch.
- 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
Delete graphify-out and push again
Wait for the nightly reindex
Run graphify prs --triage in CI
Comment @graphify review on the pull request
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
Not checked
Proven same
Behavior changed
No change found
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
set_workspace
memories_about
graph_stats
graphify_find
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-onlywhen nothing may leave the machine. - Use a local backend such as
--backend ollamafor 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
Commit graph.json to a public repo
Run graphify watch .
Pass --no-label
Use a local backend such as ollama
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.
- Ignore bulk. Put
vendor/,node_modules/,dist/and generated code in.graphifyignore. - Start structural. Run
graphify extract . --code-onlyfor a fast, model-free first graph. - Stay incremental. Use
graphify update .,watchorhook installinstead of full rebuilds. - Separate worktrees. Set
GRAPHIFY_OUTper worktree so graphs do not collide. - Query narrowly. Name a subsystem, filter with
--context calland 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.