Skip to content
HN On Hacker News ↗

GitHub - arnica/depsguard: Harden your package manager configs against supply chain attacks.

▲ 40 points • 7 comments • by eranation • 5mo ago • HN discussion ↗

Pangram verdict · v3.3

We believe that this document is a mix of AI-generated, AI-assisted, and human-written content

66 %

AI likelihood · overall

Mixed
31% human-written 61% AI-generated
SEGMENTS · HUMAN 3 of 7
SEGMENTS · AI 3 of 7
WORD COUNT 1,393
PEAK AI % 99% · §1
Analyzed
Jun 1
backend: pangram/v3.3
Segments scanned
7 windows
avg 199 words each
Distribution
31 / 61%
human / AI fraction
Verdict
Mixed
Pangram v3.3

Article text · 1,393 words · 7 segments analyzed

Human AI-generated
§1 AI · 99%

_ _ __| | ___ _ __ ___ __ _ _ _ __ _ _ __ __| | / _` |/ _ \ '_ \/ __|/ _` | | | |/ _` | '__/ _` | | (_| | __/ |_) \__ \ (_| | |_| | (_| | | | (_| | \__,_|\___| .__/|___/\__, |\__,_|\__,_|_| \__,_| |_| |___/

Guard your dependencies against supply chain attacks. Single static binary, zero Rust crate dependencies. By [arnica] Table of contents

Overview Install Usage What gets checked Config file locations Urgent security fix Backups and restore How it works Troubleshooting Help & feedback See also License

Overview DepsGuard looks for npm, pnpm, yarn, bun, and uv on your machine, reads their config files, compares them to recommended supply-chain settings, and can apply fixes interactively. It also scans for Renovate and Dependabot configs in your repos. It never runs package installs; it only edits config files you approve, and it writes backups before any change. Key features

Interactive TUI: scan, review, toggle fixes, apply scan subcommand for read-only reporting restore subcommand to pick a backup and roll back a file Cross-platform: Linux, macOS, Windows No bundled third-party Rust crates (stdlib + small amount of platform FFI for the terminal)

Tech stack

Area Details

Language Rust (MSRV 1.74, see Cargo.toml)

CLI / TUI src/main.rs, src/ui.rs, src/term.rs

Config logic src/manager.rs, src/fix.rs

Website Static site under docs/ (separate from the binary)

Install Prebuilt binaries Each GitHub Release includes archives for:

Linux: x86_64 (glibc), x86_64 (musl), aarch64 (glibc) macOS: Intel and Apple Silicon Windows: x86_64 ZIP containing depsguard.exe

Download the archive for your platform, unpack it, and put the binary on your PATH.

§2 AI · 97%

Verify integrity using the matching .sha256 file next to each asset on the release page. Install by platform Linux (Debian/Ubuntu via APT) sudo install -d -m 0755 /etc/apt/keyrings curl -fsSL https://depsguard.com/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/depsguard.gpg echo "deb [signed-by=/etc/apt/keyrings/depsguard.gpg] https://depsguard.com/apt stable main" | sudo tee /etc/apt/sources.list.d/depsguard.list >/dev/null sudo apt update sudo apt install depsguard macOS (Intel / Apple Silicon) # Homebrew tap brew tap arnica/depsguard https://github.com/arnica/depsguard brew install depsguard Windows # WinGet winget install Arnica.DepsGuard

# Scoop scoop bucket add depsguard https://github.com/arnica/depsguard scoop install depsguard Or download manually via PowerShell: $zip = "$env:TEMP\\depsguard.zip" Invoke-WebRequest -Uri "https://github.com/arnica/depsguard/releases/latest/download/depsguard-x86_64-pc-windows-msvc.zip" -OutFile $zip Expand-Archive -LiteralPath $zip -DestinationPath "$env:TEMP\\depsguard" -Force Copy-Item "$env:TEMP\\depsguard\\depsguard.exe" "$HOME\\AppData\\Local\\Microsoft\\WindowsApps\\depsguard.exe" -Force depsguard.exe --help crates.io cargo install depsguard Requires a Rust toolchain with cargo. Package managers (when published by your vendor) If your organization ships DepsGuard via Homebrew, Scoop, or WinGet, use their instructions. Setting up or automating those channels (Homebrew core PRs, buckets, WinGet PRs, CI secrets) is maintainer documentation — see AGENTS.md under Release & distribution.

§3 AI · 94%

App stores / package managers

Channel Linux macOS Windows Install command

APT (custom repo) yes no no sudo apt install depsguard (after repo setup above)

crates.io yes yes yes cargo install depsguard

Homebrew (custom tap) yes yes no brew tap arnica/depsguard https://github.com/arnica/depsguard ; brew install depsguard

Scoop (custom bucket) no no yes scoop bucket add depsguard https://github.com/arnica/depsguard ; scoop install depsguard

WinGet no no yes winget install Arnica.DepsGuard

Build from source git clone https://github.com/arnica/depsguard.git cd depsguard cargo build --release The binary is target/release/depsguard (.exe on Windows). Rust 1.74+ is required. Usage depsguard # interactive: scan, choose fixes, apply depsguard scan # report only; no writes depsguard --no-search # skip recursive file search, check local configs only depsguard restore # restore from a previous backup depsguard --help # CLI help How to use

Install – pick your platform above. Run depsguard to launch the interactive TUI. It scans your system and shows a table of findings. Press any key to continue to the fix selector. Repo-level config discovery starts from the current directory and searches downward. Use depsguard scan for a read-only report, or depsguard --no-search to skip the recursive file search and only check user-level configs.

Note: some settings require a minimum version. If your version is too old you'll see: ℹ min-release-age – requires npm ≥ 11.10 (have 10.2.0). Upgrade with npm install -g npm@latest and re-run.

Navigate & select – use ↑ ↓ to move through the list (^u ^d to page). Press Space to toggle a fix on or off. Use quick-filter keys to bulk-select by file: a all, n .npmrc, u uv.toml, etc. – press once to select, again to deselect, a third time to clear the filter.

§4 Mixed · 38%

Press f to show only currently selected fixes. Preview – press d to see a diff of what will change before you commit to anything. Apply – press Enter to apply the selected fixes. A timestamped backup is created before any file is written. Rescan – DepsGuard automatically reruns the scan after applying, so you can verify everything is green. Restore – run depsguard restore at any time to roll back from the backup list. Press q or Esc to quit.

What gets checked

Manager Config Setting Target Why

npm ~/.npmrc min-release-age 7 (days) Delay brand-new releases (requires npm >= 11.10)

npm/pnpm ~/.npmrc ignore-scripts true Reduce install-script risk

pnpm ~/.npmrc minimum-release-age 10080 (minutes) Delay new versions by 7 days (requires pnpm >= 10.16)

pnpm global rc (pnpm <= 10) minimum-release-age 10080 (minutes) Delay new versions by 7 days (requires pnpm >= 10.16)

pnpm global rc (pnpm <= 10) block-exotic-subdeps true Block untrusted transitive deps (requires pnpm >= 10.26)

pnpm global rc (pnpm <= 10) trust-policy no-downgrade Block provenance downgrades (requires

§5 Human · 3%

pnpm >= 10.21)

pnpm global rc (pnpm <= 10) strict-dep-builds true Fail on unreviewed build scripts (requires pnpm >= 10.3)

pnpm global rc (pnpm <= 10) ignore-scripts true Block malicious install scripts

pnpm global config.yaml (pnpm >= 11) minimumReleaseAge 10080 (minutes) Delay new versions by 7 days

pnpm global config.yaml (pnpm >= 11) blockExoticSubdeps true Block untrusted transitive deps

yarn .yarnrc.yml npmMinimalAgeGate 7d Delay new versions by 7 days (requires yarn >= 4.10)

pnpm pnpm-workspace.yaml minimumReleaseAge 10080 (minutes) Delay new versions by 7 days (requires pnpm >= 10.16)

pnpm pnpm-workspace.yaml strictDepBuilds true Fail on unreviewed build scripts (requires pnpm >= 10.3)

pnpm pnpm-workspace.yaml trustPolicy no-downgrade Block provenance downgrades (requires pnpm >= 10.21)

pnpm pnpm-workspace.yaml blockExoticSubdeps true Block untrusted transitive deps (requires pnpm >= 10.26)

bun ~/.bunfig.toml install.minimumReleaseAge 604800 (seconds) ~7 day delay

uv uv.toml exclude-newer 7 days Delay new publishes (requires uv >= 0.9.17)

renovate renovate.json etc.

§6 Human · 16%

minimumReleaseAge 7 days Delay dependency update PRs by 7 days

dependabot .github/dependabot.yml cooldown.default-days 7 Delay dependency update PRs by 7 days

Config file locations

Manager Linux macOS Windows

npm/pnpm ~/.npmrc ~/.npmrc %USERPROFILE%\.npmrc

pnpm global $XDG_CONFIG_HOME/pnpm/rc or ~/.config/pnpm/rc $XDG_CONFIG_HOME/pnpm/rc or ~/Library/Preferences/pnpm/rc %LOCALAPPDATA%\pnpm\config\rc

yarn ~/.yarnrc.yml ~/.yarnrc.yml %USERPROFILE%\.yarnrc.yml

pnpm pnpm-workspace.yaml pnpm-workspace.yaml pnpm-workspace.yaml

bun $XDG_CONFIG_HOME/.bunfig.toml or ~/.bunfig.toml $XDG_CONFIG_HOME/.bunfig.toml or ~/.bunfig.toml %USERPROFILE%\.bunfig.toml

uv $XDG_CONFIG_HOME/uv/uv.toml or ~/.config/uv/uv.toml $XDG_CONFIG_HOME/uv/uv.toml or ~/.config/uv/uv.toml %APPDATA%\uv\uv.toml

renovate renovate.json, .renovaterc, .github/renovate.json, etc. (same) (same)

dependabot .github/dependabot.yml (same) (same)

User-level config files are read from their standard locations (including XDG-based paths where the tool supports them).

§7 Human · 20%

Repo-level configs are discovered by searching downward from the current directory, skipping known large directories (node_modules, .git, target, Library, .cache, and others) so scans stay fast. Repo-level .npmrc, .yarnrc.yml, pnpm-workspace.yaml, Renovate configs, and Dependabot configs are all searched. pnpm settings can live in ~/.npmrc, the pnpm global config file (rc on pnpm <= 10, config.yaml on pnpm >= 11), or pnpm-workspace.yaml; DepsGuard checks all three locations independently. If multiple user-level uv or bun config files exist (for example both an XDG path and a home-directory path), DepsGuard scans each existing file separately instead of merging them. When ~/.npmrc is missing, DepsGuard uses pnpm's global config path so fixes can create the config file directly. Urgent security fix If the patched version is newer than your cooldown window, add a narrow exception, install the fix, and then remove the exception. Prefer a package-specific exception over lowering the global cooldown. That keeps the delay in place for every other dependency.

Manager How to bypass the cooldown

npm npm install <pkg>@<ver> --min-release-age=0

pnpm Add an entry to minimumReleaseAgeExclude in pnpm-workspace.yaml, run pnpm add <pkg>@<ver>, then remove the entry. Excluding by package name works on pnpm 10.16+; pinning a specific version (<pkg>@<ver>) additionally requires pnpm 10.19+. pnpm has no documented CLI override for minimumReleaseAge.

yarn Add <pkg> (or a glob) to npmPreapprovedPackages in .yarnrc.yml, or run YARN_NPM_MINIMAL_AGE_GATE=0s yarn up <pkg>@<ver> for one command. npmPreapprovedPackages exempts matches from all Yarn package gates, not only the age gate.

bun Add <pkg> to install.minimumReleaseAgeExcludes in a repo-level bunfig.toml or user-level ~/.bunfig.toml, or run bun add <pkg>@<ver> --minimum-release-age 0.