Introduction
Syne is a local-first code-context compiler. It reads a Java or PL/SQL project from a git reference, parses it, and stores a queryable code graph in an embedded graph database that speaks Cypher. Nothing is sent anywhere: parsing, storage, and querying all happen on your machine.
Status: early prototype, no public release yet. The command surface and the graph schema are expected to change.
The name
Syne is short for synecdoche — the figure of speech where a part stands for the whole, or the whole for a part. That is the operation: expand a part of a codebase (a reference, an entry point, a commit) into the whole picture, or collapse a whole codebase down to the parts that matter for one question.
What gets stored
The graph holds five kinds of node — File, Type, Callable, Statement, and DataEntity (a table or view) — joined by four kinds of edge: structural containment, references, call flow, and data access.
Two rules shape everything:
- Metadata only. Signatures, source spans, and docstrings are stored; method bodies are not. Source is hydrated on demand from the git ref when something actually needs to read it. The one exception is PL/SQL statement text, which is stored verbatim.
- Accuracy over completeness. Every edge carries a confidence score, and unresolved calls are recorded as unresolved rather than guessed. A missing edge means not seen, never does not exist.
The three questions
Syne is built around three queries, each available as a CLI command and as an MCP tool:
| Question | Command | Answers |
|---|---|---|
| Blast radius | syne blast-radius <type> | What transitively depends on this type — or, for table:NAME, what reads and writes this table |
| Blueprint | syne blueprint <pkg> | The structural skeleton of a package, without any method bodies |
| Call stack | syne call-stack <entry> | The forward call flow from an entry point, down to the statements and tables it touches |
Commands
syne index [<target>] build a code graph from a git branch into the configured store
syne wire [<target>] wire this repo's map into AGENTS.md/CLAUDE.md, .claude/skills/, .mcp.json
syne query <cypher> run a Cypher query against the graph
syne blueprint <pkg> render a package's structural skeleton
syne blast-radius <type> find transitive dependents of a type, or readers/writers of a table
syne call-stack <entry> trace call flow forward from an entry point
syne diff <twinA> <twinB> compare two JSON exports of the graph
syne mcp [<target>] serve the graph to an LLM or IDE over MCP (stdio, read-only)
syne clean <target> remove syne artifacts: logs | db | all<target> is a local repository path (default .) or a remote URL, which is cloned to a temporary directory, indexed, and cleaned up.
Reading from git, not from disk
By default syne reads files from the requested git ref (--branch, default HEAD), straight from the object database. Uncommitted edits in your working tree are therefore invisible — which is what makes an index deterministic and rebuildable from history. Pass --working-tree to index the on-disk files instead, including untracked ones.
Serving the graph to an agent
syne mcp starts a Model Context Protocol server on stdio and exposes five tools: blueprint, blast_radius, call_stack, get_source (on-demand source hydration), and cypher (a bounded read-only escape hatch). Read-only is enforced by the store itself, not by convention, so a write attempted through cypher is rejected.
syne wire sets this up for you: it writes a pointer block into AGENTS.md or CLAUDE.md, projects a repository skill into .claude/skills/, and with --mcp adds a syne entry to .mcp.json.
Next: Installation.