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:
| Command | Purpose |
|---|---|
mix reach.map | Project-level map: modules, coupling, hotspots, effects, depth, and data-flow summaries |
mix reach.inspect TARGET | Target-local explanations: dependencies, impact, graph, context, data, candidates, and why paths |
mix reach.trace | Data-flow, taint, and slicing workflows |
mix reach.check | CI/release checks: architecture, changed-code risk, dead code, smells, and candidates |
mix reach.otp | OTP/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.