System package managers

Install once, used by everything below.

  • macOS: Homebrew (brew)
  • Windows: winget or Chocolatey; consider WSL2 for a Linux-like experience
  • Linux: apt, yum, dnf, or your distro’s native manager

Use these for system-level tools (git, curl, jq, ffmpeg), not for project dependencies.

Examples

macOS — Homebrew

Install Homebrew (one-time):

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Install, search, and update packages:

brew install git jq ffmpeg     # install several tools at once
brew search postgres           # find a package
brew info uv                   # see version, dependencies, caveats
brew list                      # everything you've installed
brew upgrade                   # update all installed packages
brew uninstall ffmpeg          # remove a package

GUI apps (browsers, editors, Docker Desktop) install via --cask:

brew install --cask visual-studio-code rstudio docker

Windows — winget

winget search git
winget install --id Git.Git -e
winget install --id Python.Python.3.12 -e
winget upgrade --all

Linux — apt (Debian/Ubuntu)

sudo apt update                # refresh the package index first
sudo apt install git curl jq ffmpeg
sudo apt upgrade               # upgrade installed packages
apt list --installed | grep -i python

What belongs here vs. a language package manager

Install with the system managerInstall with a language manager
git, curl, wget, jqpandas, numpy, scikit-learn
ffmpeg, imagemagick, graphvizdplyr, ggplot2, tidyverse
Compilers and build tools (gcc, make)express, react, next
Database clients (postgresql, sqlite)Project-specific libraries