The loop
Documentation that keeps itself honest
Every other architecture map is a snapshot someone took once. This one is a loop: read the source of truth, propose the difference, wait for you, and admit when it has aged.
System Architecture
A repository is not your whole system. SourceAnt records the services, components, queues and datastores that work together. You can see where changes are pushing the architecture and decide whether to keep that direction. Your agents can understand the connections before they edit code.
Self-host free · Bring your own tools
The loop
Every other architecture map is a snapshot someone took once. This one is a loop: read the source of truth, propose the difference, wait for you, and admit when it has aged.
package.json, composer.json, go.mod, requirements.txt, and pyproject.toml, fetched through the GitHub API. Nothing is cloned and nothing is executed.
A dependency is proposed where one repository declares a name another publishes itself under. Every proposal names the manifest it came from, so you can check it by opening one file.
Proposals arrive pending and stay pending. Nothing here approves itself. Send persist: false first if you want to see the proposal without touching the graph at all.
A part believed out of date is marked stale rather than deleted. The record says it is unsure instead of going quietly wrong, which is the failure every architecture diagram has.
What it reads
No agent walks your tree and no model guesses. The inference is deterministic, and a manifest that will not parse proposes nothing rather than failing the whole system.
package.json npm · dependencies, devDependencies, peerDependencies, optionalDependencies composer.json Composer · require and require-dev, with PHP platform requirements skipped go.mod Go · the module line and every require, block form or single requirements.txt PyPI · requirement lines, with options and includes skipped pyproject.toml PyPI · project dependencies, plus entry points as extension groups Names are compared by the rules of the ecosystem that issued them. On PyPI, friendly.bard and Friendly_Bard are one project, not two. A naive string match gets that wrong and quietly loses the edge.
{
"assets": [
{ "entity_id": "billing-api",
"repository": "acme/billing-api" },
{ "entity_id": "shared-auth",
"repository": "acme/shared-auth" }
],
"persist": false
} persist: false returns the proposal and leaves the graph exactly as it was. Nothing to undo.
Evidence, not assertion
A relationship you cannot check is a rumour. Each one carries where it came from, how sure it is, and whether anyone has signed it off.
billing-api depends_on shared-auth pending
A bare name is not proof the dependency resolves to you. A public registry can carry the same name, which is how dependency confusion works, so an unowned name is proposed with lower confidence rather than asserted.
Bounded on purpose
A traversal returns a subgraph you can inspect or give to a model. It tells you when it had to stop rather than quietly returning half a graph.
| Field | Default | Range |
|---|---|---|
| depth | 2 | 1 to 3 |
| direction | both | outbound, inbound, both |
| minimum_confidence | 0.0 | 0 to 1 |
| include_stale | false | on or off |
| entity_limit | 50 | up to 50 |
| relationship_limit | 100 | up to 100 |
Read the graph directly with /api/topology/search and /api/topology/traverse, or let an agent pull the same subgraph through a context pack over MCP.
Why not a catalog
Developer portals ask a person to register each service and then trust the entry forever. The entry does not rot loudly. It just stops matching the code, and nobody finds out until an incident.
Graph snapshots are portable, streamed, and validated on the way in, and an interrupted write is recovered rather than left half applied.
Over MCP the scope is the authenticated principal. Over HTTP it is a workspace claim on the token, and a token without one is refused.
A part is whatever your architecture calls a part: a service, a queue, a datastore, a job. SourceAnt does not impose a kind list on you.
Point it at the repositories you already have and read the first proposal in a few minutes. The graph, the endpoints, and the inference are all in the open core.