Reach builds a program dependence graph for Elixir, Erlang, Gleam, JavaScript, and TypeScript projects and turns it into command-line reports and interactive HTML visualizations.

Use Reach when you want to answer questions such as:

  • What are the riskiest functions to change?
  • Which modules are tightly coupled?
  • Where does a value, tainted input, or return shape flow?
  • Which functions mix unrelated side effects?
  • Which OTP processes hide state, message, or coupling risks?

Reach 2.x is organized around five canonical Mix tasks:

CommandPurpose
mix reach.mapProject-level map: modules, coupling, hotspots, effects, depth, and data-flow summaries
mix reach.inspect TARGETTarget-local explanations: dependencies, impact, graph, context, data, candidates, and why paths
mix reach.traceData-flow, taint, and slicing workflows
mix reach.checkCI/release checks: architecture, changed-code risk, dead code, smells, and candidates
mix reach.otpOTP/process analysis: behaviours, state machines, supervision, concurrency, and coupling

For machine consumers, use --format json. Canonical commands emit pure JSON envelopes with stable command names.

Design goals

Reach reports evidence. It does not auto-edit your code. Refactoring candidates are advisory and include graph/effect/architecture evidence so humans can decide what is safe.