Located, not scored
Every row is a file and a 1-based line. An edge carries its emitter, its rule and the site it was read at, so an answer can be opened and checked rather than trusted.
A model, a project, research, whatever. You know how some people win through unbelievable left-field ideas or odd connections? glia takes that mechanism itself and makes it usable for everyone and everything. Code first, then branching into every other domain.
Under it: 17 languages parsed into one graph of calls, routes, queues, contracts, tests and docs. Every answer located at a file and line, every row saying how it knows. Rust, deterministic, no server.
Free for individuals, researchers, nonprofits, open source and organisations under 500 STEM workers. Why that shape of licence? See the current economy and the general state of the world. The licence.
I dreamed slightly too much about graphs while unemployed and upskilling.
I designed this, tested it, and had to convince Claude it was possible. Claude wrote most of the code.
Hopefully the idea isn't delusionally shit, and I didn't make a poor, possibly sentient, silicon being write 680,619 lines of Rust, and counting, for nothing.
James Chahwan
Grep finds text. A graph finds structure: which handler serves a route, which struct the frontend's model mirrors, which tests touch a change, what breaks when a field is renamed. glia builds that graph once, across every language in the repo, and answers from it in one call.
Building a lot of different projects, I kept hitting the same wall. Once you have lived in a codebase you know how it all connects, but handing that to someone else, or to an agent, meant watching them read and test, read and test, and check again to get there. Explaining the process just left people bewildered. This pattern wasn't out there, so.
Every row is a file and a 1-based line. An edge carries its emitter, its rule and the site it was read at, so an answer can be opened and checked rather than trusted.
Fact was read at a site. Derived was paired by a resolver: an endpoint to its route, a client model to the server struct. Heuristic is a name guess or git history. An answer inherits the weakest tier it crossed.
An empty answer says why: the symbol is unknown, the mechanism is not covered, or the files did not parse. glia coverage prints the blind spots of the repo you point it at.
The same walk runs at every size. What changes is how many layers it crosses and where the glue edges come from.
.gmap.glia arch draws.A small set of projects, maybe to make a simple system or a specialised thing. Modules, functions, routes, models, tests, docs: what one repository declares, in every language it holds.
When it is quite big: real-world domains hanging off it and an enterprise stack. Repo graphs merged, with the 15 cross-graph resolvers pairing HTTP, gRPC, queues, GraphQL, contracts, config and IaC across them.
Entirely different from what people usually mean by it. This is the computer's end of rationalisation: how a machine accesses and recalls. "Code isn't just one domain. It's multi domains of graphs interconnecting to form knowledge about what is to be made, why, what and how and because, and issues, plus the connective glue between domains, software and the real world." One regulation change, walked end to end.
Unedited answers over a small demo shop: an Angular storefront, a GraphQL admin console, a Go API and an escrow contract. More on the examples page.
GET /api/orders: a derived identity class.customerName; the server sends customer_name. Breaking, found before anyone runs the app.| # | hop | edge | to | file:line |
|---|---|---|---|---|
| 1 | 1 | handled_by | Orders.Place | handlers/orders.go:45 |
| 1 | 2 | calls | Publisher.OrderPlaced | events/publisher.go:22 |
| 1 | 3 | uses | queue_producer:nats | events/publisher.go:32 |
| 2 | 2 | calls | Memory.SaveOrder | store/memory.go:38 |
| 3 | 2 | calls | Hub.Broadcast | live/hub.go:32 |
| 4 | 2 | calls | newID | handlers/orders.go:77 |
Every cell of the language x mechanism matrix is graded by a fixture repo with a key of what must and must not be produced. A cell is full, partial, blind or not yet probed, and the matrix is regenerated by the test suite, never typed by hand.
The whole matrix, rendered from the same file the test suite writes.
Who it's for: people with a complicated idea in their head who want to get it out and built. And anyone who would just like software to be less of a chore. glia is the engine; pick the surface that fits how your agent works. The rule for what goes where: "anything of cross benefit should come to glia, always." The wrappers carry transport and conversation, never graph logic. The docs map every question to its command.
For when you want full control and need everything, or complex control. About forty commands, each one question. The glia skill maps a question to its command and teaches the agent to open the file:line an answer gives instead of grepping.
git clone https://github.com/James-Chahwan/glia
cargo build --release -p glia-cli
cp target/release/glia ~/.local/bin/
glia review . --base main
A zero-install glia-cli package and a Claude Code plugin are in progress for 0.5.4.
The simple one: easy to get into any workplace, easy to say "it's an MCP for project context". Six tools over the same engine: orient, find, impact, trace, read, refresh.
uvx mcp-repo-graph install
repo-graph on GitHub, one-click installs for VS Code and Cursor.
The engine as a pyo3 wheel for Linux, macOS and Windows. Build a graph, keep it loaded, ask it questions as native dicts. Every answer the CLI gives, as a method.
pip install glia-py
import glia_py
g = glia_py.generate(".")
g.blast_radius("Order")