guget lets you browse, update, and add NuGet packages across all .csproj, .fsproj, and .vbproj files in a directory — without leaving the terminal. It fetches live version data from your configured NuGet sources and shows you at a glance what's out of date.
| Feature | Description | |
|---|---|---|
| 📁 | Browse projects | Scans recursively for .csproj / .fsproj / .vbproj files, with support for Central Package Management (Directory.Build.props) and imported .props files |
| 🚀 | Live version status | Fetches latest versions from NuGet v3 API |
| 🛡️ | Vulnerability & deprecation tracking | Surfaces CVE advisories and deprecated status per package version, with severity-coloured indicators in the list, detail panel, and version picker. Packages from private/Azure feeds are automatically enriched with vulnerability data from nuget.org |
| ⬆️ | Update packages | Bump to the latest compatible or latest stable version |
| 📋 | Version picker | Choose any specific version with target-framework and vulnerability indicators |
| 🌳 | Dependency tree | t shows declared dependencies; T runs dotnet list --include-transitive for the full transitive tree with status icons |
| ➕ | Add packages | Search NuGet and add new package references |
| 🔄 | Bulk operations | Update a package across all projects at once |
| 🔧 | Restore | Run dotnet restore without leaving the TUI |
| 🌐 | Multi-source | Respects NuGet.config and global NuGet source configuration. Private feed packages are supplemented with metadata from nuget.org |
| 🔗 | Clickable hyperlinks | Package names, advisory IDs, versions, and source URLs are clickable in terminals that support OSC 8 hyperlinks |
| 🎨 | Themes | Built-in colour themes: auto, dracula, nord, everforest, gruvbox. Select with --theme / -t |
| Responsive layout | Columns hide progressively on narrow terminals to keep the UI usable at any width | |
| 📜 | Log panel | Real-time internal logs, toggleable with l |
| 🔌 | Sources panel | View configured NuGet sources, toggleable with s |
| ❓ | Help overlay | Full keybinding reference, press ? |
| ⌨️ | Headless CLI | Inspect, plan, edit, and restore packages from scripts without starting the TUI |
To run:
To build:
Linux / macOS
Installs to /usr/local/bin if writable, otherwise ~/.local/bin. Override the install location with GUGET_INSTALL=/your/path.
curl -fsSL https://raw.githubusercontent.com/nulifyer/guget/main/install.sh | bashwget -qO- https://raw.githubusercontent.com/nulifyer/guget/main/install.sh | bashWindows (PowerShell)
irm https://raw.githubusercontent.com/nulifyer/guget/main/install.ps1 | iexFetches the latest release from GitHub, installs to %LOCALAPPDATA%\Programs\guget, and adds it to your user PATH automatically. Override the install location with $env:GUGET_INSTALL.
Windows note: The binary is not yet code-signed, so Windows SmartScreen may warn on first run. Running from a terminal (PowerShell or cmd) bypasses this.
Manual download
Grab the archive for your platform from the Releases page and place the binary somewhere on your PATH.
Build from source
git clone https://github.com/nulifyer/guget
cd guget/guget
go build -o guget # Linux / macOS
go build -o guget.exe # Windowsguget [options] [project]
Usage:
no-color -nc, --no-color
Disable colored output in the terminal
verbosity -v, --verbose
Set the logging verbosity level
[<empty>, none, error, err, warn, warning, info, debug, dbg, trace, trc]
project -p, --project
Set the target project directory (defaults to current working directory)
theme -t, --theme
Color theme
[auto, dracula, nord, everforest, gruvbox, etc]
sort-by -o, --sort-by
Initial sort order: status, name, source, current, available
Append :asc or :desc for direction (default: status:asc)
log-file -lf, --log-file
Write all log output to this file (in addition to the TUI log panel)
no-mouse -nm, --no-mouse
Disable mouse navigation in the TUI
version -V, --version
Print the version and exit
Examples:
# Scan the current directory
guget
# Scan a specific solution folder
guget ~/src/MyApp
# Enable verbose logging
guget -v debug
# Use the dracula theme
guget -t dracula
# Leave clicks and wheel events to the terminal
guget --no-mouse
# Sort by available updates, newest first
guget -o available:descSupplying a command runs Guget without initializing Bubble Tea. Read commands
support table, tsv, json, and jsonl; redirected output defaults to TSV.
Diagnostics stay on stderr, and --output replaces its destination atomically.
# Declared, evaluated, and restore-resolved package state
guget list --project ./src --format json
guget show Newtonsoft.Json --project ./src
# NuGet sources, source mappings, and restore-only local feeds
guget sources --project ./src
# Preview and then apply the same transactional edit plan
guget update Newtonsoft.Json --version 13.0.4 --file App/App.csproj --dry-run
guget update Newtonsoft.Json --version 13.0.4 --file App/App.csproj --restore
# Workspace scope is always explicit
guget remove Old.Package --project ./src --all --dry-run
guget restore --project ./src --allRun guget help or guget help update for command usage. Mutation commands
require repeatable --file targets or an explicit --all; add always requires
at least one --file. A dry run performs the same ownership checks and planning
path as an apply. See CLI design for JSON and exit-code
contracts.
| Key | Action |
|---|---|
Tab / Shift+Tab |
Cycle panel focus (Projects → Packages → Detail → Logs) |
↑ / k |
Move up |
↓ / j |
Move down |
Enter |
Confirm / move focus from Projects to Packages |
Esc / q / Ctrl+C |
Quit (main screen) / Close (overlay) |
Mouse navigation is enabled by default. A left click selects project and package rows, sorts package columns, opens links, switches release-note tabs, and operates visible overlay buttons. Picker rows select or toggle their item; file-changing actions still require an explicit Add, Apply, Update, or Remove button. In the package header, click the bracketed sort mode to cycle through the modes and click its arrow to reverse direction. Requested, Available, and Source are direct sort shortcuts. The wheel navigates or scrolls the panel under the pointer without changing keyboard focus. Overlays remain modal, so clicks cannot reach the main screen underneath them.
Mouse reporting can take over clicks that the terminal would otherwise use for
text selection. Use the terminal's mouse-bypass modifier, commonly Shift, for
native handling. Run guget --no-mouse to leave all mouse input with the
terminal.
| Key | Action |
|---|---|
u |
Update to latest compatible version (this project) |
U |
Update to latest compatible version (all projects) |
a |
Update to latest stable version (this project) |
A |
Update to latest stable version (all projects) |
v |
Open version picker overlay |
o |
Cycle sort mode (status, name, source, current, available) |
O |
Toggle sort direction (asc / desc) |
d |
Remove selected package (prompts for confirmation) |
t |
Show declared dependency tree for the selected package |
| Key | Action |
|---|---|
Ctrl+R |
Reload projects from disk |
r |
Run dotnet restore (selected project) |
R |
Run dotnet restore (all projects) |
T |
Show full transitive dependency tree |
/ |
Search NuGet and add a new package |
| Key | Action |
|---|---|
l |
Toggle log panel |
s |
Toggle sources panel |
? |
Toggle keybinding help |
[ / ] |
Resize focused panel |
| Key | Action |
|---|---|
↑ / Ctrl+P |
Previous result |
↓ / Ctrl+N |
Next result |
Enter |
Select package |
Esc |
Close |
| Key | Action |
|---|---|
↑ / k |
Previous version |
↓ / j |
Next version |
u |
Apply version (this project) |
U |
Apply version (all projects) |
Enter |
Apply version |
Esc / q |
Close |
| Icon | Meaning |
|---|---|
▲ |
Installed version has known CVE vulnerabilities |
✗ |
Error fetching version info |
. |
Package metadata is still loading |
↑ |
Newer compatible version available |
⬆ |
Newer stable version available (beyond compatible) |
~ |
Package is deprecated in the registry |
✓ |
Up to date |
- On startup,
gugetwalks the target directory and parses every.csproj/.fsproj/.vbprojit finds (skippingbin,obj,node_modules,.git, etc.). - A background goroutine queries your configured NuGet sources for the latest version data for each package.
- A background watcher polls project files,
.props, andnuget.config, then reloads the workspace when those files change on disk. - You can force the same rescan manually at any time with
Ctrl+R. - The UI updates as results arrive — no waiting for a full scan before you can start navigating.
- Mutations are planned against file hashes, written with same-directory atomic replacement, and rolled back best-effort if a multi-file operation fails.
