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.

powershell
# 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:

text
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):

powershell
# 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:

text
Scoop was installed successfully!

Verify the install:

powershell
scoop --version

Output:

text
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.

code
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.

CommandMeaning
scoop install <app>Install one or more apps
scoop updateUpdate 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 listList installed apps
scoop search <term>Search across all buckets
scoop info <app>Show manifest details
scoop statusShow 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/rmManage buckets
scoop checkupDiagnose common config issues
scoop exportPrint a JSON manifest of installed apps
scoop importRe-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.

powershell
scoop install ripgrep

Output:

text
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:

powershell
scoop install git nodejs python fd bat fzf gh

Output:

text
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):

powershell
scoop install nodejs@20.12.2

Output:

text
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).

powershell
scoop bucket list

Output:

text
Name Source                                       Updated
---- ------                                       -------
main https://github.com/ScoopInstaller/Main      5/24/2026 09:14:22

Add the most useful community buckets:

powershell
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:

text
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:

powershell
scoop search firefox

Output:

text
'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.

BucketContentsAdd when…
mainCLI dev tools, runtimes, compilers, shellsAlways (preinstalled)
extrasGUI apps (VS Code, Firefox, Notepad++), utilitiesInstalling user-facing apps
nerd-fontsPatched fonts with powerline glyphs & deviconsSetting up a fancy shell prompt
versionsOld / 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.

powershell
scoop update

Output:

text
Updating Scoop...
Updating 'main' bucket...
   55432f1c2..a6b7c8d9e  master    -> origin/master
Scoop was updated successfully!
powershell
scoop update *

Output:

text
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:

powershell
scoop status

Output:

text
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.

powershell
scoop install nodejs@18.20.2
scoop install nodejs@20.13.1
scoop list nodejs

Output:

text
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:

powershell
node --version
scoop reset nodejs@18.20.2
node --version
scoop reset nodejs@20.13.1
node --version

Output:

text
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.

powershell
scoop hold nodejs
scoop status
scoop unhold nodejs

Output:

text
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.

powershell
scoop cleanup *
scoop cache rm *

Output:

text
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.

powershell
scoop search jq

Output:

text
'main' bucket:
    jq           1.7.1
    jqp          0.7.0
'extras' bucket:
    jqlang-jq    1.7.1
powershell
scoop info ripgrep

Output:

text
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.

powershell
scoop list

Output:

text
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:

powershell
scoop export > scoopfile.json
Get-Content scoopfile.json | Select-Object -First 30

Output:

json
{
  "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:

powershell
scoop import scoopfile.json

Output:

text
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:

json
{
  "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:

powershell
scoop install .\mytool.json
scoop install https://example.com/mytool.json

Output:

text
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.

powershell
# 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:

text
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.

powershell
scoop checkup

Output:

text
No problems with your computer.

Sample output when problems exist:

text
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.

Questionscoopwingetchoco
Admin required?NoSometimesYes
Install path%USERPROFILE%\scoop\Per-app installer pathsPer-app + C:\ProgramData\chocolatey
Side-by-side versions?Yes (built-in)NoLimited
Touches Program Files?NoYesYes
Best forCLI / dev toolsConsumer apps (Windows 11 default)Enterprise / scripted infra
First-party?NoYes (Microsoft)No
Custom reposEasy (Git repo)LimitedEasy (NuGet feed)
Total app coverageSmaller, focusedLarge, broadLargest, 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.

powershell
# Enable the cache
scoop config use_sqlite_cache true

# Inspect / disable
scoop config use_sqlite_cache
scoop config rm use_sqlite_cache

Output:

text
'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.

powershell
$PSVersionTable.PSVersion.Major   # confirm 7+
scoop update

Output:

text
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

  1. PowerShell execution policy too strictSet-ExecutionPolicy RemoteSigned -Scope CurrentUser is required before the bootstrap. The installer error message doesn't always make this obvious.
  2. 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 like C:\s.
  3. Antivirus deletes shims — overly-aggressive heuristics flag ~\scoop\shims\*.exe as suspicious. Whitelist the shims folder.
  4. scoop update doesn't update apps — it updates Scoop itself and the bucket manifests; scoop update * updates installed apps. Easy to confuse.
  5. nonportable bucket and uninstallnonportable apps modify the system (drivers, services, registry) and may leave residue on uninstall. Prefer the portable equivalent when one exists.
  6. Symlinks vs Junctions — Scoop uses symbolic links for the current folder; on a non-NTFS filesystem (like an exFAT external drive) installs silently fail. Stick to NTFS.
  7. Two installs in different folders — running the installer twice with different $env:SCOOP produces two parallel Scoops; PATH ordering decides which one's shims win. Pick a path and stick with it.
  8. scoop reset only updates the link — it doesn't reinstall. If apps\<name>\<version>\ was deleted, reset fails 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.

powershell
scoop install git gh nodejs python ripgrep fd bat fzf jq curl wget less starship 7zip

Output:

text
'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.

powershell
scoop bucket add nerd-fonts
scoop install Cascadia-Code FiraCode-NF JetBrainsMono-NF

Output:

text
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:

json
{
  "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.

text
dotwin/
├── README.md
├── bootstrap.ps1
└── scoopfile.json
powershell
# 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:

text
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.

powershell
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:

text
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:

powershell
# 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:

text
   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.

powershell
# 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:

text
'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.

powershell
scoop cache rm *
scoop download dotnet-sdk
Get-ChildItem ~\scoop\cache

Output:

text
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).

powershell
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:

text
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