Skip to content
Static analysis for Laravel

Loose coupling is beautiful. Until you have to trace it.

Events, listeners, jobs, mail and schedules hide the path from cause to effect. Loom reads your code and writes one deterministic index that follows every thread. No boot, no runtime, no guessing.

Static, never booted

Everything comes from the AST. Your app does not run, so scans are safe in CI and on a laptop.

Deterministic output

Two scans of the same source are byte-identical, so the index diffs cleanly and gates a pull request.

Browse it, ask it, gate on it

A local UI, an MCP server for agents, and a CI check all read the same index.

One command, one file.

Run the scan, then point anything at loom.json. Unresolved calls are listed, never guessed.

terminal
$ php artisan loom:scan --output=loom.json
Scanned 214 files in 0.4s
  events 18 · listeners 24 · jobs 11 · routes 63
  unresolved dispatches: 2 (-v lists them)