Project study / Developer Tools

Active Development

Untangled

Dependency health your whole team can understand.

A static source-code dependency analysis toolkit that turns language-specific scans into shared graphs, structural evidence, and readable reports.

PHPPythonGraphvizStatic AnalysisHTML / JavaScript
Repository private

01 / System portrait

Make dependency structure observable.

  1. 01Source
  2. 02Scan
  3. 03Dependency pairs
  4. 04Filter / cluster
  5. 05Analyze
  6. 06Report
The scanner is language-specific. Everything after dependency pairs follows shared semantics.

02 / Problem and response

Architectural drift happens quietly.

Constraint

Architectural drift happens quietly: dependencies accumulate, modules become interconnected, and changes begin affecting areas that were never part of the original task.

Formatting, correctness, and isolated implementation checks do not explain those structural relationships to the whole team.

Approach

Untangled separates language-specific discovery from language-neutral interpretation. Scanners produce dependency pairs, then a shared pipeline filters, clusters, analyzes, and reports them.

The output is architectural evidence rather than a defect score: it helps teams see where coupling exists and decide what context matters next.

03 / Dependency pipeline

Separate discovery from interpretation.

PHP and Python implementations follow one shared specification and conformance fixture set while keeping their native source-analysis boundaries independent.

The current report surface produces dependency pairs, analysis JSON, Graphviz DOT, and self-contained interactive HTML without executing the analyzed project.

Built from an idea worth preserving.

Untangled is a re-imagining of Snakefood, created by Martin Blais. Snakefood's small, composable pipeline — scan source into dependency pairs, then filter, cluster, and render those relationships — is the architectural inspiration behind Untangled.

Untangled carries that idea into modern PHP and Python tooling while adding shared metrics, cross-language conformance, and accessible reporting.

Thank you, Martin.

04 / Structural signals

Evidence, not a score.

Cycles

Closed loops

Parts that depend on each other, directly or indirectly.

Fan-in

Who relies on this?

How many other components depend on a unit.

Fan-out

What does it rely on?

How many other components a unit depends on.

Instability

I = Ce / (Ca + Ce)

How much a unit leans outward versus being relied upon.

These metrics describe architectural relationships. They require context; they are not defect scores.

05 / One model, independent implementations

Shared semantics across languages.

Different scanners normalize source relationships into the same dependency-pair and analysis contracts.

Untangled language implementation status
ImplementationCurrent stateBoundary
PHPImplemented / unreleasedScanner, pairs, analysis, HTML, DOT
PythonImplemented / unpublishedAST scan, analysis, HTML, DOT
JavaScript / TypeScriptPlannedNative scanner not implemented
Git historyPlannedTrend analysis not implemented

06 / Implementation evidence

Reports made for reading.

Untangled can emit dependency pairs, analysis JSON, Graphviz DOT, and self-contained interactive HTML reports. The report combines dependency visualization, cycle detection, coupling metrics, clustering, and plain-language explanations.

The goal is interpretability, not graph spectacle.

Three-cycle conformance fixtureCart depends on Order, Order depends on Cart and Customer, and Customer depends on Cart. Catalog is isolated.Cart.phpOrder.phpCustomer.phpCatalog.phpCYCLE / 3 MEMBERS · CATALOG ISOLATED
Actual fixture shape from conformance/cases/three-cycle; the red edges represent the closed dependency loop.
Read the fixture relationships
  • Cart.php → Order.php
  • Order.php → Cart.php and Customer.php
  • Customer.php → Cart.php
  • Catalog.php has no internal dependencies

07 / Current state and next work

What exists, and what follows.

Active Development

PHP v1 is feature-complete but unpublished. Python scanning, analysis, and reporting work exists but is not published. TypeScript and history analysis remain planned.

Started 2026 · Last updated October 2026

Next direction

  • Publish and harden the PHP and Python v1 surfaces.
  • Build a native JavaScript / TypeScript scanner against the shared specification.
  • Add git-history trend analysis after the structural model is stable.

The useful boundary is between discovering relationships and deciding what those relationships mean.

Working lesson / Untangled