cheat sheet
Scoop
Install dev tools without admin rights using Scoop — buckets, manifests, multi-version installs, and reproducible setups.
Scoop — User-Scope Package Manager
What it is
Scoop is a command-line installer for Windows that focuses on developer tools and CLI utilities, maintained by the community via the ScoopInstaller/Scoop repository. Unlike winget and choco, it installs everything under %USERPROFILE%\scoop\ — no admin rights, no UAC prompts, no Program Files clutter — and exposes binaries by adding their shim folder to your PATH. Reach for Scoop when you want a single command to install Git, Node, Python, ffmpeg, ripgrep, fd, and a Nerd Font onto a fresh user account, or when you need multiple versions of the same tool side-by-side (scoop install nodejs@18 nodejs@20); the alternatives are winget (first-party, system-scope) and choco (broader app coverage, admin-required).
Install
Scoop bootstraps itself from a PowerShell one-liner. The default install path is %USERPROFILE%\scoop\; override with $env:SCOOP before running the installer if you want a different location. No administrator privileges required.
# Allow the installer script for this shell only
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# Run the bootstrap
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
Output:
Initializing...
Downloading ...
Creating shim...
Adding ~\scoop\shims to your path.
Scoop was installed successfully!
Type 'scoop help' for instructions.
To install to a custom path (or for shared multi-user installs, run elevated):
# Per-user install at a custom path
$env:SCOOP = 'D:\Tools\scoop'
[Environment]::SetEnvironmentVariable('SCOOP', $env:SCOOP, 'User')
Invoke-RestMethod get.scoop.sh | Invoke-Expression
# Shared install for all users (run as Administrator)
$env:SCOOP_GLOBAL = 'C:\ProgramData\scoop'
[Environment]::SetEnvironmentVariable('SCOOP_GLOBAL', $env:SCOOP_GLOBAL, 'Machine')
iex "& {$(irm get.scoop.sh)} -RunAsAdmin"
Output:
Scoop was installed successfully!
Verify the install:
scoop --version
Output:
Current Scoop version:
v0.4.2 - Released at 2026-04-15
'main' bucket:
55432f1c2 (HEAD -> master, origin/master) ripgrep: Update to 14.1.0
Syntax
Every Scoop command follows scoop <verb> [args]. Most installs are unattended by default — no -y flag needed.
scoop <command> [<app>...] [--option=<value>]
Output: (none — exits 0 on success)
Essential commands
These cover almost every day-to-day task; full list is scoop help.
| Command | Meaning |
|---|---|
scoop install <app> | Install one or more apps |
scoop update | Update Scoop itself and all bucket manifests |
scoop update <app> | Update one app |
scoop update * | Update every installed app |
scoop uninstall <app> | Remove an app |
scoop list | List installed apps |
scoop search <term> | Search across all buckets |
scoop info <app> | Show manifest details |
scoop status | Show outdated apps |
scoop cleanup <app> / * | Delete old versions |
scoop cache rm <app> | Clear download cache |
scoop hold <app> | Pin an app (skip updates) |
scoop unhold <app> | Unpin |
scoop reset <app> | Switch active version / re-link shims |
scoop bucket add/list/rm | Manage buckets |
scoop checkup | Diagnose common config issues |
scoop export | Print a JSON manifest of installed apps |
scoop import | Re-install from an exported JSON |
Install
scoop install downloads the tool's archive, extracts it into %USERPROFILE%\scoop\apps\<app>\<version>\, creates a shim (a tiny .exe proxy on the PATH that forwards to the real binary), and writes a JSON install record. No registry edits, no Program Files write.
scoop install ripgrep
Output:
Installing 'ripgrep' (14.1.0) [64bit] from 'main' bucket
ripgrep-14.1.0-x86_64-pc-windows-msvc.zip (2.5 MB) [================] 100%
Checking hash of ripgrep-14.1.0-x86_64-pc-windows-msvc.zip ... ok.
Extracting ripgrep-14.1.0-x86_64-pc-windows-msvc.zip ... done.
Linking ~\scoop\apps\ripgrep\current => ~\scoop\apps\ripgrep\14.1.0
Creating shim for 'rg'.
'ripgrep' (14.1.0) was installed successfully!
Install multiple apps at once:
scoop install git nodejs python fd bat fzf gh
Output:
Installing 'git' (2.44.0) ...
'git' (2.44.0) was installed successfully!
Installing 'nodejs' (22.1.0) ...
'nodejs' (22.1.0) was installed successfully!
Installing 'python' (3.12.3) ...
'python' (3.12.3) was installed successfully!
Installing 'fd' (10.1.0) ...
'fd' (10.1.0) was installed successfully!
Installing 'bat' (0.24.0) ...
'bat' (0.24.0) was installed successfully!
Installing 'fzf' (0.52.1) ...
'fzf' (0.52.1) was installed successfully!
Installing 'gh' (2.49.0) ...
'gh' (2.49.0) was installed successfully!
Install a specific version (most manifests support this):
scoop install nodejs@20.12.2
Output:
Installing 'nodejs' (20.12.2) [64bit] from 'main' bucket
node-v20.12.2-win-x64.7z (24.1 MB) [============] 100%
'nodejs' (20.12.2) was installed successfully!
Buckets
A bucket is a Git repository of JSON manifests; each manifest describes one app. The main bucket ships with the installer and covers the popular dev tools; community buckets add categories that don't fit main's scope (GUI apps, fonts, games, JetBrains tooling, betas, nightlies).
scoop bucket list
Output:
Name Source Updated
---- ------ -------
main https://github.com/ScoopInstaller/Main 5/24/2026 09:14:22
Add the most useful community buckets:
scoop bucket add extras # GUI apps, useful misc tools
scoop bucket add nerd-fonts # Patched fonts for terminals
scoop bucket add versions # Past versions of major apps
scoop bucket add games # Open-source games
scoop bucket add java # JDK distributions
scoop bucket add nonportable # Apps that can't be relocated cleanly
Output:
Checking repo... ok
The extras bucket was added successfully.
Checking repo... ok
The nerd-fonts bucket was added successfully.
Checking repo... ok
The versions bucket was added successfully.
...
After adding a bucket, scoop search finds anything in it:
scoop search firefox
Output:
'extras' bucket:
firefox 125.0.1
firefox-beta 126.0.b3
firefox-esr 115.10.0esr
firefox-nightly 127.0a1
'versions' bucket:
firefox-developer 126.0.b3
What the main buckets are for
A practical breakdown of when to reach for each official-ish bucket. Adding all four covers about 95% of dev installs.
| Bucket | Contents | Add when… |
|---|---|---|
main | CLI dev tools, runtimes, compilers, shells | Always (preinstalled) |
extras | GUI apps (VS Code, Firefox, Notepad++), utilities | Installing user-facing apps |
nerd-fonts | Patched fonts with powerline glyphs & devicons | Setting up a fancy shell prompt |
versions | Old / pinned releases (nodejs18, python311) | You need a specific older version |
Update
scoop update first updates Scoop itself and every bucket (a git pull under the hood), then optionally updates the listed apps. scoop update * updates every installed app.
scoop update
Output:
Updating Scoop...
Updating 'main' bucket...
55432f1c2..a6b7c8d9e master -> origin/master
Scoop was updated successfully!
scoop update *
Output:
Updating one outdated app:
Updating 'nodejs' (20.12.2 -> 20.13.1)
Uninstalling 'nodejs' (20.12.2)
Installing 'nodejs' (20.13.1) [64bit] from 'main' bucket
node-v20.13.1-win-x64.7z (24.2 MB) [============] 100%
'nodejs' (20.13.1) was installed successfully!
List outdated apps without updating:
scoop status
Output:
Scoop is up to date.
Name Installed Latest Missing Dependencies Info
---- --------- ------ -------------------- ----
nodejs 20.12.2 20.13.1
fd 10.1.0 10.1.0
Multiple versions side-by-side
Scoop keeps every installed version under apps\<name>\<version>\ and links the active one to apps\<name>\current. scoop reset <app>@<version> switches which version current points at, without uninstalling either. Useful when you need to test against Node 18 and 20 the same morning.
scoop install nodejs@18.20.2
scoop install nodejs@20.13.1
scoop list nodejs
Output:
Name Version Source Updated Info
---- ------- ------ ------- ----
nodejs 18.20.2 main 5/24/2026 09:20:01
nodejs 20.13.1 main 5/24/2026 09:21:22 (active)
Switch active version:
node --version
scoop reset nodejs@18.20.2
node --version
scoop reset nodejs@20.13.1
node --version
Output:
v20.13.1
Resetting nodejs (18.20.2).
Linking ~\scoop\apps\nodejs\current => ~\scoop\apps\nodejs\18.20.2
v18.20.2
Resetting nodejs (20.13.1).
Linking ~\scoop\apps\nodejs\current => ~\scoop\apps\nodejs\20.13.1
v20.13.1
Hold (pin)
Mark an app as held to make scoop update * skip it. Useful when an upgrade broke your workflow and you want time before letting it tick forward.
scoop hold nodejs
scoop status
scoop unhold nodejs
Output:
nodejs is now held and can not be updated anymore.
Scoop is up to date.
Name Installed Latest Held? Missing Dependencies Info
---- --------- ------ ----- -------------------- ----
nodejs 20.12.2 20.13.1 true
nodejs is no longer being held.
Cleanup
Old versions accumulate under apps\<name>\ after upgrades. scoop cleanup deletes everything except the current version; scoop cache rm * clears the download cache.
scoop cleanup *
scoop cache rm *
Output:
Removing older versions of 'nodejs': 20.12.2
Removing older versions of 'fd': 10.0.0
2 cache file(s) removed
Search and info
scoop search queries every added bucket. Add --all to skip the bucket-loaded filter; add a regex for advanced patterns. scoop info dumps the manifest plus install location and shim list — the fast way to inspect what's actually running.
scoop search jq
Output:
'main' bucket:
jq 1.7.1
jqp 0.7.0
'extras' bucket:
jqlang-jq 1.7.1
scoop info ripgrep
Output:
Name : ripgrep
Description : ripgrep recursively searches directories for a regex pattern
Version : 14.1.0
Bucket : main
Website : https://github.com/BurntSushi/ripgrep
License : MIT|Unlicense
Updated at : 2026-04-15T08:13:00Z
Updated by : alicedev
Installed : 14.1.0 [Installed]
Binaries : rg.exe
Shortcuts :
Notes :
List and export
scoop list shows the apps in your local install; scoop export prints a JSON manifest that can be redirected to a file and consumed by scoop import on another machine. This is the "treat your machine like infrastructure" workflow.
scoop list
Output:
Name Version Source Updated Info
---- ------- ------ ------- ----
7zip 24.05 main 5/24/2026 09:10:55
fd 10.1.0 main 5/24/2026 09:21:01
fzf 0.52.1 main 5/24/2026 09:21:14
git 2.44.0 main 5/24/2026 09:21:22
nodejs 20.13.1 main 5/24/2026 09:24:33 (active)
nodejs 18.20.2 main 5/24/2026 09:23:18
python 3.12.3 main 5/24/2026 09:21:48
ripgrep 14.1.0 main 5/24/2026 09:14:22
Export to JSON:
scoop export > scoopfile.json
Get-Content scoopfile.json | Select-Object -First 30
Output:
{
"buckets": [
{ "Name": "main", "Source": "https://github.com/ScoopInstaller/Main", "Updated": "5/24/2026 09:14:22" },
{ "Name": "extras", "Source": "https://github.com/ScoopInstaller/Extras", "Updated": "5/24/2026 09:14:23" }
],
"apps": [
{ "Name": "git", "Version": "2.44.0", "Source": "main", "Updated": "5/24/2026 09:21:22" },
{ "Name": "nodejs", "Version": "20.13.1", "Source": "main", "Updated": "5/24/2026 09:24:33" },
...
],
"config": { ... }
}
Import on a new machine:
scoop import scoopfile.json
Output:
Adding bucket main...
Adding bucket extras...
Installing 'git' (2.44.0) ... done.
Installing 'nodejs' (20.13.1) ... done.
...
8 app(s) installed successfully.
Custom manifests
A manifest is a single JSON file describing the URL, hash, binaries, and install hooks of one app. Useful when:
- The app you want isn't in any bucket
- You want to vendor an internal tool with a private URL
- You need to override a default install (e.g.
--no-modify-path)
A minimal mytool.json for a one-binary zip:
{
"version": "1.0.0",
"description": "Internal Alice team utility",
"homepage": "https://example.com/mytool",
"license": "MIT",
"architecture": {
"64bit": {
"url": "https://example.com/releases/mytool-1.0.0-x64.zip",
"hash": "9b1c0da63a4b00d4f6c8a8d3b1e2f0c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0",
"bin": "mytool.exe"
}
},
"checkver": "(?s)v([\\d.]+)",
"autoupdate": {
"architecture": {
"64bit": {
"url": "https://example.com/releases/mytool-$version-x64.zip"
}
}
}
}
Output: (manifest file only — no shell output)
Install directly from the file or a URL:
scoop install .\mytool.json
scoop install https://example.com/mytool.json
Output:
Installing 'mytool' (1.0.0) from '.\mytool.json'
mytool-1.0.0-x64.zip (1.2 MB) [================] 100%
Checking hash of mytool-1.0.0-x64.zip ... ok.
Linking ~\scoop\apps\mytool\current => ~\scoop\apps\mytool\1.0.0
Creating shim for 'mytool'.
'mytool' (1.0.0) was installed successfully!
Private buckets
A bucket is just a Git repo of manifests; clone yours from anywhere — GitHub, Azure DevOps, an internal Gitea. This is the easiest way to distribute a curated tool set inside an organisation without admin tooling.
# Add a private bucket from a URL
scoop bucket add acme-internal https://gitea.example.com/acme/scoop-bucket.git
# Install only from that bucket
scoop install acme-internal/some-tool
# Inspect
scoop bucket list
Output:
Name Source Updated
---- ------ -------
main https://github.com/ScoopInstaller/Main 5/24/2026 09:14:22
extras https://github.com/ScoopInstaller/Extras 5/24/2026 09:14:23
acme-internal https://gitea.example.com/acme/scoop-bucket 5/24/2026 09:35:00
checkup
scoop checkup is a built-in diagnostic that flags the common foot-guns: long paths disabled, antivirus interference, Windows Developer Mode off, slow Git config, missing 7z, and so on. Run it after a fresh install and after upgrading Windows.
scoop checkup
Output:
No problems with your computer.
Sample output when problems exist:
WARN Long paths are not enabled. You may experience errors with some manifests.
You can enable long paths with: Set-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name LongPathsEnabled -Value 1
WARN Windows Developer Mode is not enabled. Symlinks require this or admin rights.
WARN Main bucket is missing. Run 'scoop bucket add main'.
scoop vs winget vs choco
Pick the one whose default behaviour matches what you want. They coexist on the same machine.
| Question | scoop | winget | choco |
|---|---|---|---|
| Admin required? | No | Sometimes | Yes |
| Install path | %USERPROFILE%\scoop\ | Per-app installer paths | Per-app + C:\ProgramData\chocolatey |
| Side-by-side versions? | Yes (built-in) | No | Limited |
| Touches Program Files? | No | Yes | Yes |
| Best for | CLI / dev tools | Consumer apps (Windows 11 default) | Enterprise / scripted infra |
| First-party? | No | Yes (Microsoft) | No |
| Custom repos | Easy (Git repo) | Limited | Easy (NuGet feed) |
| Total app coverage | Smaller, focused | Large, broad | Largest, broadest |
SQLite manifest cache
Recent Scoop builds ship an opt-in SQLite cache for manifest lookups. With the cache enabled, scoop search, scoop info, and scoop install consult a local SQLite database instead of walking every .json file in every bucket on disk — searches across the full main + extras + versions set drop from seconds to tens of milliseconds, and installing older versions resolves faster too.
# Enable the cache
scoop config use_sqlite_cache true
# Inspect / disable
scoop config use_sqlite_cache
scoop config rm use_sqlite_cache
Output:
'use_sqlite_cache' has been set to 'True'
The cache file lives at %USERPROFILE%\scoop\scoop.db and is rebuilt whenever Scoop updates a bucket; deleting it is safe — Scoop recreates it on the next bucket update. If you maintain a private bucket with hundreds of manifests, enabling this is the single biggest day-to-day speedup.
Parallel bucket updates on PowerShell 7+
Recent Scoop also parallelises scoop update: every added bucket is git pull-ed concurrently when running under PowerShell 7+. On a machine with four or five buckets this shaves multi-second updates down to roughly the time of the slowest one. No configuration is needed — the parallel path is taken automatically when $PSVersionTable.PSVersion.Major -ge 7.
$PSVersionTable.PSVersion.Major # confirm 7+
scoop update
Output:
Updating Scoop...
Updating 'main' bucket in parallel...
Updating 'extras' bucket in parallel...
Updating 'nerd-fonts' bucket in parallel...
Updating 'versions' bucket in parallel...
Scoop was updated successfully!
If you're stuck on Windows PowerShell 5.1, Scoop still falls back to sequential git pull — install pwsh (itself a Scoop package: scoop install pwsh) to take advantage.
Common pitfalls
- PowerShell execution policy too strict —
Set-ExecutionPolicy RemoteSigned -Scope CurrentUseris required before the bootstrap. The installer error message doesn't always make this obvious. - Long paths disabled — some manifests fail extracting because
MAX_PATH(260 chars) is hit deep inside an archive. Enable long paths or run from a short path likeC:\s. - Antivirus deletes shims — overly-aggressive heuristics flag
~\scoop\shims\*.exeas suspicious. Whitelist the shims folder. scoop updatedoesn't update apps — it updates Scoop itself and the bucket manifests;scoop update *updates installed apps. Easy to confuse.nonportablebucket and uninstall —nonportableapps modify the system (drivers, services, registry) and may leave residue on uninstall. Prefer the portable equivalent when one exists.- Symlinks vs Junctions — Scoop uses symbolic links for the
currentfolder; on a non-NTFS filesystem (like an exFAT external drive) installs silently fail. Stick to NTFS. - Two installs in different folders — running the installer twice with different
$env:SCOOPproduces two parallel Scoops; PATH ordering decides which one's shims win. Pick a path and stick with it. scoop resetonly updates the link — it doesn't reinstall. Ifapps\<name>\<version>\was deleted,resetfails until you reinstall that version.
Real-world recipes
Essential CLI dev kit — one-liner
Install the modern Unix-style toolset every developer wants on Windows in a single command. No admin prompts, no reboots.
scoop install git gh nodejs python ripgrep fd bat fzf jq curl wget less starship 7zip
Output:
'git' (2.44.0) was installed successfully!
'gh' (2.49.0) was installed successfully!
'nodejs' (22.1.0) was installed successfully!
'python' (3.12.3) was installed successfully!
'ripgrep' (14.1.0) was installed successfully!
'fd' (10.1.0) was installed successfully!
'bat' (0.24.0) was installed successfully!
'fzf' (0.52.1) was installed successfully!
'jq' (1.7.1) was installed successfully!
'curl' (8.7.1) was installed successfully!
'wget' (1.21.4) was installed successfully!
'less' (608) was installed successfully!
'starship' (1.18.2) was installed successfully!
'7zip' (24.05) was installed successfully!
Install a Nerd Font, then point Windows Terminal at it
Patched fonts add powerline arrows and devicons used by starship, oh-my-posh, and lsd. The nerd-fonts bucket has every popular family pre-packaged.
scoop bucket add nerd-fonts
scoop install Cascadia-Code FiraCode-NF JetBrainsMono-NF
Output:
Installing 'Cascadia-Code' (3110.04) ...
Installing fonts...
'Cascadia-Code' (3110.04) was installed successfully!
Installing 'FiraCode-NF' (3.2.1) ...
Installing fonts...
'FiraCode-NF' (3.2.1) was installed successfully!
Edit settings.json for Windows Terminal:
{
"profiles": {
"defaults": {
"font": { "face": "JetBrainsMono Nerd Font", "size": 12 }
}
}
}
Output: (settings file only — restart Windows Terminal to apply)
Reproducible setup — commit scoopfile.json to dotfiles
Treat the developer toolset as code. A new machine onboards in two minutes with one git clone + scoop import.
dotwin/
├── README.md
├── bootstrap.ps1
└── scoopfile.json
# bootstrap.ps1 — installs Scoop if missing, then restores the full toolset
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
if (-not (Get-Command scoop -ErrorAction SilentlyContinue)) {
irm get.scoop.sh | iex
}
scoop import scoopfile.json
Output:
Adding bucket main...
Adding bucket extras...
Adding bucket nerd-fonts...
Installing 14 app(s) ...
14 app(s) installed successfully.
Test against three Node versions at once
When you maintain libraries that target multiple Node majors, install all three under one user and switch with scoop reset. Tools like nvm-windows are unnecessary for most workflows.
scoop bucket add versions
scoop install nodejs18 nodejs20 nodejs # nodejs is the latest LTS
# Switch active
scoop reset nodejs18
node --version
scoop reset nodejs20
node --version
scoop reset nodejs
node --version
Output:
v18.20.2
v20.13.1
v22.1.0
Use Scoop with PowerShell $PROFILE for a polished shell
Combine Scoop-installed starship, fzf, and PSReadLine for a productive interactive shell. Add this to $PROFILE:
# Initialise starship prompt (Scoop installs it on PATH)
Invoke-Expression (&starship init powershell)
# Predictive history + fuzzy reverse search
Import-Module PSReadLine
Set-PSReadLineOption -PredictionSource HistoryAndPlugin -PredictionViewStyle ListView -EditMode Windows
Set-PSReadLineKeyHandler -Key Ctrl+r -ScriptBlock {
$line = ''
$cursor = 0
[Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line, [ref]$cursor)
$result = Get-Content (Get-PSReadLineOption).HistorySavePath |
Select-Object -Unique |
fzf --tac --query "$line"
if ($result) {
[Microsoft.PowerShell.PSConsoleReadLine]::Replace(0, $line.Length, $result)
}
}
Output:
Alice in ~/code/jockey on main [+1]
❯
Bypass corporate proxy and certificate inspection
Inside a corporate network with deep packet inspection, Scoop downloads fail with TLS errors. Configure the proxy explicitly and accept the corporate root CA.
# Tell Scoop to use a corporate proxy
scoop config proxy "http://proxy.example.com:8080"
# Or use IE / WinHTTP system proxy
scoop config proxy currentuser
# Reset to direct
scoop config rm proxy
Output:
'proxy' has been set to 'http://proxy.example.com:8080'
Pull a one-off binary without installing
For binaries you want to grab once but not keep on PATH, scoop download <app> fetches the archive into the cache without installing.
scoop cache rm *
scoop download dotnet-sdk
Get-ChildItem ~\scoop\cache
Output:
Caching 'dotnet-sdk' (8.0.300) [64bit] from 'main' bucket
dotnet-sdk-8.0.300-win-x64.zip (217.4 MB) [============] 100%
Directory: C:\Users\Alice\scoop\cache
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 5/24/2026 10:01 AM 228025344 dotnet-sdk#8.0.300#dotnet-sdk-8.0.300-win-x64.zip
Clean up after a development sprint
Free disk and prune old versions in one shot. Combine cleanup, cache rm, and git gc (Scoop's manifest repos accumulate cruft like any Git checkout).
scoop cleanup *
scoop cache rm *
foreach ($b in (scoop bucket list).Name) {
Push-Location "$env:USERPROFILE\scoop\buckets\$b"
git gc --aggressive --prune=now
Pop-Location
}
Output:
Removing older versions of 'nodejs': 20.12.2
Removing older versions of 'python': 3.12.2
3 cache file(s) removed (456.2 MB)
Enumerating objects: 8732, done.
Counting objects: 100% (8732/8732), done.
Sources
- ScoopInstaller/Scoop on GitHub — upstream repo, README, and release notes
- Scoop releases — version history including SQLite cache and parallel-bucket updates
- ScoopInstaller/Install — next-generation installer / bootstrap script
- ScoopInstaller/Main bucket — manifest source for the default bucket