Dexter is an interactive, browser-based tool for visualizing and exploring the artifact dependency graph of JVM projects.
Even trivial projects accumulate dozens—sometimes hundreds—of transitive dependencies, making it impossible to produce a meaningful static graph or to easily diagnose version conflicts buried deep in the tree. Dexter addresses this by letting you navigate the dependency hierarchy interactively: select any artifact to see what depends on it (dependants) and what it depends on (dependencies), with version mismatches highlighted at a glance.
Mousing over a dependency arrow expands it and, for non-exact matches, displays the requested version.
- Three-column explorer — select an artifact to see its dependants (left), the artifact itself (center), and its dependencies (right)
- Multiple tabs — open independent views into different parts of the dependency tree; each tab has its own navigation history
- Version mismatch detection — arrows and box borders are color-coded by compatibility: black (exact match), green (compatible), red (incompatible), yellow (unknown/git SHA)
- Properties panel — always-visible sidebar showing artifact details, Maven metadata, and dependency/dependant breakdowns by version compatibility
- Keyboard navigation —
⌘F/Ctrl+Fto search,⌘H/Ctrl+Hhome,⌘B/Ctrl+Bback,⌘1/⌘2/⌘3to browse compatible/incompatible/unknown dependencies - Animated transitions — boxes animate smoothly when navigating; arrows fade out and redraw
- Dynamic layout — columns resize automatically to fill the viewport
- Windowed columns — large dependency lists are windowed with scroll indicators so the display stays readable
| Build Tool | Status |
|---|---|
tools.deps (deps.edn) |
✅ Supported |
Leiningen (project.clj) |
✅ Supported |
Maven (pom.xml) |
✅ Supported |
Gradle (build.gradle) |
🔜 Planned |
Install with brew install hlship/brew/dexter.
Install with Scoop:
scoop bucket add java
scoop install java/temurin-lts-jdk
scoop bucket add hlship https://github.com/hlship/scoop-bucket
scoop install dexter
Download Dexter from GitHub Releases
and unpack the distribution, which includes launcher scripts (dexter for
macOS/Linux, dexter.cmd for Windows) and the JAR file containing the code.
Copy the files to a directory on your PATH. On macOS/Linux you can alternatively
create a symlink for the dexter script (it will follow symlinks to find the JAR).
The dexter command auto-detects the project type, resolves the full transitive dependency graph, starts a local web server, and opens a browser.
-p, --port NUMBER Port for the web server (default: random free port)
-f, --file PATH Path to a dependency file (default: current directory)
-a, --alias NAME Add a build alias/profile (repeatable)
--no-open Don't automatically open a browser
# Explore the current project
dexter
# Explore a specific project with dev dependencies included
dexter -f /path/to/project -a dev
# Leiningen project with dev and test profiles
dexter -f /path/to/project.clj -a dev -a test
# Maven project with a specific profile
dexter -f /path/to/pom.xml -a development
# Use a specific port, don't open browser
dexter -p 8080 -O| Left | Center | Right |
|---|---|---|
| Dependants — artifacts that depend on the selected artifact | Selected — the artifact being examined | Dependencies — artifacts the selected artifact depends on |
Click any artifact to make it the new selection. The display animates to show its dependants and dependencies.
The properties panel is always visible on the right side of the display, showing detailed information about the selected artifact: Maven coordinates, version, JAR size, description, licenses, and links. It also breaks down the artifact's dependencies and dependants by version-match category.
The exact information displayed will vary depending on what information is available in the Maven POM file for the dependency (if it even exists).
Dexter supports multiple tabs, each providing an independent view into the dependency tree.
- The ROOT tab is always present and cannot be closed; it shows the full project dependency tree
- Use the button in the property panel to open a new tab rooted in that dependency
- Each tab maintains its own navigation history — the Home and Back buttons apply to the current tab
- Tabs that are no longer needed can be closed with the × button; closing a tab switches to the most recently viewed tab
- When many tabs are open, they scroll horizontally (but the root tab stays pinned to the left side)
Arrows represent dependency relationships. Their color indicates whether the version requested by the parent matches the version actually resolved:
| Color | Meaning |
|---|---|
| Black | Exact match — requested version equals resolved version |
| Green | Compatible — same major version (or same major.minor for 0.x) |
| Red | Incompatible — different major version |
| Yellow | Unparseable version, or a Git coordinate, or a local root |
Hover over any arrow to highlight it and see the requested version.
The right border of each dependency provides information on that artifact's dependencies:
- Wide colored right border — the artifact has a dependency with a version mismatch (color reflects the worst mismatch)
- Wide grey right border — the artifact is a leaf node (no further dependencies)
The footer bar displays summary counts of compatible, incompatible, and unknown dependency relationships. Click any count (or use ⌘1/⌘2/⌘3) to open a popup listing all artifacts in that category:
- Filter — type to narrow the list (appears when there are more than eight items)
- Navigate — click an artifact or press
Enterto navigate to it - Keyboard —
↑/↓arrow keys andTabcycle through the list;Home/Endjump to the first/last item;Escapecloses the popup
An artifact may appear in more than one category if different dependants request it with different version compatibility outcomes.
- Clojure CLI
- Tailwind CSS CLI (for CSS rebuilds)
- Babashka (for task runner)
# Terminal 1: Tailwind CSS watcher
bb tailwind
# Terminal 2: Clojure REPL
clojure -M:devFrom the REPL:
;; Load a deps.edn project
(require '[net.lewisship.dex.deps-reader :as deps-reader])
(require '[net.lewisship.dex.deps :as deps])
(def db (-> (deps-reader/read-deps "deps.edn" {:aliases [:dev :test]})
deps/build-db))
;; Start the server
(require '[net.lewisship.dex.service :as service])
(service/start! {:db db})
;; Stop
(service/stop!)bb testCopyright © Howard Lewis Ship
Distributed under the Apache Software License 2.0.