Skip to content
Thicket

Knowledge graphs for repositories that outgrew the diagram.

Start free

01 The map

Your repository has neighbourhoods. Nobody drew them.

Thicket reads every file once and builds a graph of what it found: imports, calls, routes, migrations, the lot. Then it detects the communities those edges fall into and names them. There is no diagram to redraw after a refactor, because the map is the repository.

Build the graph
files read
1,184
edges found
8,402
communities
6
orchard/ledger-api1,184 files8,402 edgesbuilt in 41s
router.tspostEntry.tsGatewayAdapter.tssession.tswarehouse.tsconfig.tshttp edgeledger corepaymentsidentityreportinginfrastructure
  • http edge214 files
  • ledger core268 files
  • payments231 files
  • identity152 files
  • reporting173 files
  • infrastructure146 files

02 The route

Ask where a change lands. Get the route, not a hunch.

Name two ends and Thicket prints the path between them: every hop, the kind of edge it took, and the file it took it in. Where the answer had to be worked out rather than read, the hop says so and says what made it guess. You get the route and the reason to trust it in the same sheet.

Trace a path
graphify path "POST /v2/refunds" "ledger.postEntry"
  1. routes/refunds.tsrouter.post

    routehttp edgeextracted

    Also touches: http/middleware/auth.ts http/middleware/idempotency.ts

  2. http/RefundController.tscreate

    handleshttp edgeextracted

    Also touches: http/serialise.ts http/errors.ts

  3. payments/RefundService.tsauthorise

    callspaymentsextracted

    Also touches: payments/mandate.ts payments/fees.ts infra/flags.ts

  4. payments/gateways/registry.tsfor(mandate.scheme)

    dispatchespaymentsinferred

    Resolved at runtime from a string key. Three gateways register for it; all three are on the route until you pin the scheme.

    Also touches: payments/gateways/stripe.ts payments/gateways/adyen.ts

  5. payments/GatewayAdapter.tsvoid

    callspaymentsextracted

    Also touches: payments/retry.ts payments/dispute.ts

  6. ledger/EntryBuilder.tsreversal

    constructsledger coreextracted

    Also touches: ledger/currency.ts ledger/rounding.ts ledger/validate.ts

  7. ledger/postEntry.tspostEntry

    writesledger coreinferred

    The write is a template string assembled in infra/db/pool.ts. The table name is the migration's, not the caller's.

    Also touches: infra/db/pool.ts ledger/audit.ts

edges scanned
8,402
nodes visited
31
hops kept
7
answered in
180 ms

03 The receipts

Every edge shows how it was found.

Most of a graph is read straight off the source and can be proved. Some of it is assembled from more than one file, and a little of it is a genuine coin toss. Thicket keeps the three apart and shows you where the doubt collects, so you know the difference between something it read and something it worked out.

Read the audit trail
8,402 edgesone cell = 10 edges
http edgeledger corepaymentsidentityreportinginfrastructure
Extracted
6,908
82.2%
Read straight off the source. An import, a call, a route table.
Inferred
1,244
14.8%
Assembled from more than one file, or from a name resolved at runtime.
Ambiguous
250
3.0%
More than one target fits and nothing in the repository picks one.

04 The seams

The edges worth arguing about are the ones that leave.

Most edges stay inside their own community, which is what makes it a community. The 1,064 that cross are the ones that make a change expensive. Thicket weighs every boundary in the repository, so you can see which two neighbourhoods have quietly become one.

Weigh a boundary
1,064 crossing edges12.7% of the graph
http edge385ledger core528payments494identity202reporting253infrastructure266
  1. 01payments againstledger core236 edges
  2. 02http edge againstpayments168 edges
  3. 03reporting againstledger core143 edges

05 The answer

Ask in English. See exactly what it read.

Thicket answers from the graph rather than from a search over your files, and it shows the bill: fifteen nodes, 1,437 tokens of a 1,500 budget, each one sized by how much of the answer it paid for. The five that matched and did not fit are printed underneath, because an answer that drops its tail quietly is the thing this whole page is against.

Ask a question
How does a refund reach the ledger?1,437 / 1,500 tokens
RefundService.ts214registry.ts186postEntry.ts171EntryBuilder.ts148GatewayAdapter.ts132RefundController.ts118reversal.ts96refunds.ts74pool.ts68retry.ts61curren…52mandate.ts44audit.ts312418
  • http edge
  • ledger core
  • payments
  • infrastructure

5 more matched and did not fitpayments/settlement.ts 47ledger/rounding.ts 38payments/fees.ts 34ledger/period.ts 29infra/queue.ts 21

06 The drift

It stays true after the merge.

A graph that is right on Tuesday and stale on Friday is a diagram again. Thicket rebuilds on every push, in forty-one seconds, and tells you when the repository got harder to read rather than waiting to be asked. It flagged the gateway refactor the afternoon it landed.

Turn on watch
Twelve weeksrebuilt on every push
edges added214ambiguous share2.2% before4.8%3.0% now0%19 Jun7 Aug4 Sep

Gateway registry refactor

Three gateways moved behind one string key. 214 edges arrived, 58 of them unprovable, and the rebuild said so 41 seconds after the merge.

rebuilds
312
median
38s
longest
1m 04s
pushes missed
0