v3.8.0: interactive codebase map (fallow viz)
fallow viz: your codebase as an interactive map
fallow viz runs one analysis and writes a single self-contained HTML file (no server, no external assets) styled like the rest of fallow. It gives you two views over the same project:
- Treemap of files sized by bytes, nested by directory.
- Force-directed import graph with directory and import-community clustering.
Both views share four lenses that recolor the same map:
- Dead code: unused files, unused exports, entry points.
- Duplication: share of duplicated lines per file, with clone previews.
- Boundaries: architecture zones from your
boundariesconfig, with violating imports drawn in red. - Complexity hotspots: per-function cyclomatic and cognitive scores, including React context (hook counts, JSX depth).
Click any file to open a detail panel with the evidence behind each finding: unused export names, clone groups and their other locations, boundary crossings, cycle membership, importers and imports as click-through navigation, and a runnable fallow ... --trace command to verify the finding yourself.
Search, breadcrumb drill-down, keyboard shortcuts, shareable URL deep links, and dark/light themes are built in. Findings carry a hatch texture and [E]/[W] prefixes so color is never the only signal, and all motion honors prefers-reduced-motion.
fallow viz # opens the HTML report in your browser
fallow viz --out map.html --no-open
fallow viz --viz-format dot # emit the import graph as Graphviz DOT
fallow viz --viz-format mermaidIt is read-only and respects --production, --config, and --no-cache like the analysis commands.
Bug fixes
- Next.js fallback metadata exports are no longer reported as unused. App Router
not-found,default,forbidden,unauthorized, and experimentalglobal-not-foundfiles now creditmetadata,generateMetadata,viewport, andgenerateViewport, matching the modules Next.js reads while resolving fallback head content. Arbitrary helper and route segment config exports remain reportable. (Closes #1987.) - Audit and dead-code results stay accurate across deeper class hierarchies and materialized project context. Multi-hop generic inheritance and class-scoped
thisreferences now credit the correct members, nested production TypeScript configs activate alias resolution, audit snapshots invalidate when relevant install or generated-framework state changes, and GitHub Action fallback annotations safely encode workflow-command paths. Audit JSON now also attributes every styling finding as introduced or inherited and reports matching styling totals in the attribution block.
Under the hood
- Upgraded the Rust toolchain to 1.97.1 and narrowed internal crate visibility.
- Made fuzzing operational and repaired dependency-validation gaps in CI.
- Routine dependency updates across the workspace and tooling.
Full Changelog: v3.7.1...v3.8.0