depup
Check dependency versions across multiple ecosystems.
depup auto-detects project ecosystems in a directory tree and checks all dependencies for newer versions. It supports Maven and npm (with npm, pnpm, yarn classic, and bun package managers).
Installation
Precompiled binaries are available for macOS (Intel & Apple Silicon), Linux, and Windows.
Brew
brew tap hpehl/tap
brew install depup
Cargo
cargo install depup-cli
Build from source
- Install Rust and Cargo
git clone git@github.com:hpehl/depup.gitcd depupcargo build --release && cargo install --path .
This installs the depup binary to ~/.cargo/bin/ which should be in your $PATH.
Usage
Check
# Check current directory (auto-detects ecosystems)
# Check a specific project
# JSON output (for scripting)
# Only show outdated versions
# Exclude pre-release versions (alpha, beta, RC, milestone)
# Filter by ecosystem
# Filter by kind
# Filter by version property (Maven only)
# Filter by artifact name (glob wildcards)
Update
# Update all outdated dependencies
# Update a specific project
# Preview what would be updated (no changes made)
# Only update to stable releases (exclude pre-release versions)
# Filter by ecosystem
# Filter by kind
# Filter by version property (Maven only)
# Filter by artifact name (glob wildcards)
# JSON output
For Maven, depup update rewrites version numbers in POM files while preserving all formatting, comments, and indentation. Both managed properties (${...} references in <properties> blocks) and plain inline versions (<version>5.10.0</version> inside dependency/plugin blocks) are updated.
For npm, depup update delegates to the detected package manager's native update command (npm update, pnpm update, yarn upgrade, bun update).
The exit code is 0 when all updates succeed, 1 when any update fails.
Audit
# Audit all dependencies for known vulnerabilities
# Audit a specific project
# JSON output
# Filter by minimum severity level
# Filter by ecosystem
# Filter by kind
# Filter by version property (Maven only)
# Filter by artifact name (glob wildcards)
The audit subcommand queries OSV.dev for known vulnerabilities in all discovered dependencies. It works for both Maven and npm ecosystems using the same unified API. Tool versions (Node.js, package manager versions) are excluded — they aren't registry packages with OSV vulnerability advisories, so the --tools filter is not available for audit.
The exit code is 0 when no vulnerabilities are found, 1 when any are detected.
Completions
# Generate shell completions (auto-detects shell)
# Install shell completions
# Generate completions for a specific shell
If both Maven and npm ecosystem projects are found in the target path, both are checked and results are combined.
Subcommands
| Command | Description |
|---|---|
check |
Check dependencies for newer versions |
update |
Update outdated dependencies in place |
audit |
Audit dependencies for known vulnerabilities via OSV.dev |
completions |
Generate and install shell completions |
Ecosystems
Maven
Scans multi-module Maven projects and checks dependency versions against upstream Maven repositories. Discovers:
- Property references — any
${...}property used as a version (e.g.,${junit.version},${version.wildfly},${my.lib.version}). The only exclusion is${project.*}properties which are Maven built-ins. - Plain inline versions — artifacts with hardcoded version numbers (e.g.,
<version>5.10.0</version>) are also checked. - Tool versions — Node.js and package manager version properties in Maven POMs (e.g.,
version.node,version.npm,version.pnpm,version.yarn).
Works where Maven's versions:display-property-updates fails — when properties are defined in a parent POM but referenced in child POMs.
npm
Discovers npm ecosystem projects in the directory tree by detecting the package manager via lock file (pnpm-lock.yaml, package-lock.json, yarn.lock, bun.lock/bun.lockb) or the packageManager field in package.json. Runs the appropriate package manager's outdated command on each discovered project and aggregates results. Workspace members are skipped — only root projects are checked.
Supported package managers: npm, pnpm, yarn (classic), bun.
Note: pnpm catalogs (
"catalog:<name>"version specifiers defined inpnpm-workspace.yaml) are resolved transparently by pnpm's own commands — depup does not need to handle them explicitly.
Example Output
[2/4] ████████████████████████████▓░ org.junit.jupiter:junit-jupiter
Dependencies
✓ org.apache.maven.plugins:maven-compiler-plugin 3.13.0 up-to-date
→ org.junit.jupiter:junit-jupiter 5.10.0 → 5.12.2
Plugins
✓ org.apache.maven.plugins:maven-javadoc-plugin 3.12.0 up-to-date
✓ org.mockito:mockito-core 5.18.0 up-to-date
4 checked: 3 current, 1 outdated (● Dependency, ■ Plugin)
Done in 1s
The exit code is 0 when all versions are current, 1 when any are outdated.
Update Output
[1/1] ████████████████████████████████ pom.xml
✓ org.junit.jupiter:junit-jupiter 5.10.0 → 5.12.2 pom.xml updated
✓ org.mockito:mockito-core 5.14.0 → 5.18.0 pom.xml updated
2 updated (● Dependency)
Done in 2s
Dry-run preview (depup update --dry-run):
Dry run — no changes made:
✓ org.junit.jupiter:junit-jupiter 5.10.0 → 5.12.2 pom.xml updated
✓ org.mockito:mockito-core 5.14.0 → 5.18.0 pom.xml updated
2 updated (● Dependency)
Done in 1s
The exit code is 0 when all updates succeed, 1 when any update fails.
Audit Output
[2/2] ████████████████████████████████ Fetching vulnerability details...
✓ org.wildfly:wildfly-ee 35.0.0 pom.xml no vulnerabilities
✗ com.fasterxml.jackson.core:jackson-databind 2.15.0 pom.xml 2 vulnerabilities
[CRITICAL] GHSA-xxxx-yyyy (CVE-2024-1234) Deserialization of untrusted data
[HIGH] GHSA-aaaa-bbbb (CVE-2024-5678) Server-side request forgery
2 audited: 1 clean, 1 vulnerable (1 critical, 1 high) (● Dependency)
Done in 3s
The exit code is 0 when no vulnerabilities are found, 1 when any are detected.
JSON Mode
Use --json for machine-readable output. Progress bars are suppressed, and errors produce structured JSON:
Error codes: POM_NOT_FOUND, POM_PARSE_FAILED, HTTP_REQUEST_FAILED, CLAP_PARSE_ERROR, INTERNAL.
How It Works
Maven
- Parses the root
pom.xmland recursively follows<modules>declarations - For every
<dependency>and<plugin>, extracts the version — either a${...}property reference (any name, not justversion.*) or a plain inline version number - Resolves property values from the root POM's
<properties>block (supports chained references up to 10 levels) - Queries Maven Central for the latest version of each artifact (via
maven-metadata.xml) - If not found on Maven Central, queries all
<repositories>and<pluginRepositories>defined in the POMs in parallel - Compares versions using Maven-aware ordering (handles
.Final,-SP1, and other qualifiers)
npm
- Walks the directory tree finding directories with a recognized lock file or
packageManagerfield inpackage.json - Auto-detects the package manager (npm, pnpm, yarn, or bun) from the lock file type or
packageManagerfield - Skips
node_modules/and workspace members - Runs each package manager's list and outdated commands in JSON mode
- Parses and aggregates results across all discovered projects
Version Filtering
By default, depup includes pre-release versions but always excludes SNAPSHOTs (Maven). Use --stable (alias --releases-only) to also exclude pre-release versions matching these patterns:
*-alpha*,*-beta**-RC*,*-CR**-M*(milestones)*-preview*,*-dev*,*-incubating*
SNAPSHOTs are always excluded regardless of flags.
Shell Completions
Generate and install shell completions for tab-completion of subcommands and flags:
Supported shells: bash, zsh, fish, elvish, powershell.
Requirements
- Rust 1.85+ (edition 2024)
- Network access to Maven Central (
repo1.maven.org) and any custom repositories defined in the project's POMs - For npm ecosystem checks: the respective package manager (npm, pnpm, yarn, or bun) must be installed and on PATH
License
Apache License 2.0