laboiteacode/filament-dependency-graph
Visual architecture explorer for Filament that automatically discovers Eloquent models, relations, Livewire components, resources and panels with no configuration, then presents them in an interactive graph, tree, table and inspector with search, filtering and exports.
render(), #[Layout], conventional layouts, Filament custom $view, mailables, Route::view/Route::livewire) make ownership visible. Useful when negotiating team boundaries or arguing that a "small UI change" is actually cross-cutting.Adopt when most of the following hold:
file:line references — for design docs, ADRs, or review checklists, not just an interactive toy.Look elsewhere, or treat it as partial, when:
view() called with a computed name, or dispatch through variables will show up as dynamic references or "no reference found." For real traces, pair it with Telescope, Xdebug or a profiler.1.4 with automatic cache rebuild, and the Filament/Laravel scopes are built without HTTP and view maps. If you have custom plugins or code reading the snapshot, budget a verification pass.For executives: We have a recurring, expensive problem — nobody can say with confidence what a change will touch until an engineer spends days tracing it. This adds two new maps to an existing dev-only tool: one for HTTP (route → controller → form request → model → policy → event/listener → job/mailable/notification) and one for views (Blade templates, components and Livewire, plus what renders them and where they are used). It is read-only, static, and never executes our code — controllers are not instantiated, templates are not compiled. Cost is a Composer dependency; the return is faster, better-scoped estimates on refactors and a defensible list of dead code we can retire.
For engineering: It answers the questions you currently answer from memory. Middleware is resolved the way the router resolves it and is filterable in the explorer, in GraphQuery::$middleware, and via --middleware on export. Dispatches and model references are detected statically with file:line locations, one level deep into injected classes. The Views scope reads @extends, the @include family, @each, @component, @livewire, <x-…> and <livewire:…> with line numbers, resolved through the view finder, Blade's component tag compiler and Livewire's registry — and it handles Livewire 4 single-file and multi-file components. Package views are treated as leaves so vendor code does not pollute the map. Form request rule reading is opt-in (http.form_request_rules) because it is the one place where scope creeps.
Constraints to state up front, so nobody is surprised: it is static, so treat gaps as questions rather than answers — the "no reference found" and "no dispatcher found" badges mean we could not see it statically, which is itself useful signal about dynamic magic in the codebase. Filament and Laravel scopes are unchanged and now deliberately exclude the HTTP and view maps, so existing views of those scopes stay stable. The snapshot schema moved to 1.4 and caches rebuild automatically on upgrade; expect a one-time warm-up. Requires PHP 8.3+, Laravel 12/13, Filament 4/5, Livewire 3/4 — confirm we are inside that window before we commit. Ship it as a dev dependency, verify explorer performance against our largest panel, and use it to produce one Mermaid diagram for a real upcoming decision as the pilot.
How can I help you explore Laravel packages today?