Incremental analysis · import graphs · blast radius
Index Django's 883 files once, then pay milliseconds per change. A stateless analyzer pays the first cost every time. What a change reaches is a different question: the median file reaches 3 others, the worst reaches 588, and the average describes neither.
Timed for all 883 files, not sampled. The cheapest edit is 79% of the mean, so an edit costs about the same whichever file you touch.
Every square is one file. Click one: the lit squares are its blast radius, the files that import it transitively, coloured by how many hops away.
Blast radius computed for every file in each package, not two hand-picked ones. Where the median sits far below the mean, the median change touches a handful of files while the mean is dragged upward by a small set of hub modules inside the largest import cycle, and the average tells you nothing about either.
One square per Python file, grouped into blocks by top-level directory and ordered by path. Block size is just file count, so this is a census rather than a treemap of importance.
Clicking a file runs a breadth-first walk over the reverse import edges. Squares light in waves, one wave per hop, which is exactly the order a dirty-propagation pass would visit them in.
A diff is what you changed; blast radius is what your change reached. A one-line edit to a hub module is a one-line diff and a several-hundred-file impact. Only the second needs a graph.
Pinned source distributions from PyPI, indexed by aic, with imports
resolved exactly rather than by suffix matching. Every number here is generated, none
typed in by hand.