yt-dlp: pip, pipx, Binary or Nightly — Which to Install
Quick answer
The choice looks like packaging and is really about latency: how many days pass between a fix being written and it reaching you. On a tool whose job is tracking sites that change weekly, that number decides how often yt-dlp appears broken. Shortest path first:
yt-dlp --update-to nightly
The comparison
| Method | Fix latency | Update with | Needs Python |
|---|---|---|---|
| Binary, nightly | Hours to a day | yt-dlp -U | No |
| Binary, stable | Days to weeks | yt-dlp -U | No |
| pip / pipx, pre-release | Hours to a day | pipx upgrade | Yes |
| pip / pipx, stable | Days to weeks | pipx upgrade | Yes |
| Homebrew | Days | brew upgrade | No |
| Rolling distro | Days | System update | No |
| Frozen distro | Months to never | System update | No |
Everything else about these is a rounding error. The bottom row is the one that generates most of the support questions on the internet.
Why latency is the whole question
yt-dlp is not a program that reaches a finished state. It reads pages whose structure belongs to someone else, and when that structure changes the program stops working until someone reads the new one. Fixes are frequent and small.
So "how old is your build" is the first question behind nsig extraction failed, unable to extract player response, missing formats, and downloads that cap at 360p. It is not a coincidence that "update it" is the first step on nearly every error page on this site.
The standalone binary
One file with Python bundled inside, and the only method where yt-dlp can replace itself:
sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp
sudo chmod a+rx /usr/local/bin/yt-dlp
winget install yt-dlp.yt-dlp
sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_macos -o /usr/local/bin/yt-dlp
sudo chmod a+rx /usr/local/bin/yt-dlp
It also carries its own certificate bundle, which sidesteps most of the certificate problems that pip installs run into.
The cost: -U writes over the file, so a system-wide install needs root to update.
Installing to ~/.local/bin avoids that.
pip and pipx
Right when you are calling yt-dlp from Python code rather than from a shell — you get the library as well as the command:
pipx install yt-dlp
pipx upgrade yt-dlp
pip install -U "yt-dlp[default]"
Use pipx rather than bare pip for the command-line tool. Modern Linux distributions block pip from writing into system Python — the externally-managed-environment error — and pipx is the supported answer.
Stable and nightly
Two channels. Stable is tagged periodically; nightly is built once a day from master.
yt-dlp --update-to nightly
yt-dlp --update-to stable
yt-dlp --update-to 2026.07.28
pip install -U --pre "yt-dlp[default]"
Nightly sounds risky and mostly is not: master is gated by tests and review, and the difference between it and a release is usually a handful of extractor fixes. Weigh that against the failure mode of stable, which is a working tool sitting behind a fix that already exists.
Rolling back is one command, which is what makes nightly a reasonable default rather than a gamble.
Which build for which situation
- Occasional personal use. Whatever your OS makes easy — winget, Homebrew, your package manager if it is rolling. Update when something breaks.
- Regular use. The binary on the nightly channel. You will notice breakage within a day and get the fix within one.
- A scheduled job. Binary, nightly, and update before each run. A cron job on a stale build fails silently for weeks.
- Calling it from Python. pipx or a virtualenv, so you have the library too.
- A container. Install in the Dockerfile and rebuild regularly — the Docker guide covers making that automatic.
Updating in a scheduled job
Cheap insurance. || true so a failed update does not abort the whole run:
#!/bin/sh
/usr/local/bin/yt-dlp -U --update-to nightly || true
/usr/local/bin/yt-dlp --download-archive /srv/archive.txt -i "CHANNEL_URL"
Checking what you have
yt-dlp --version
which -a yt-dlp
The version is a date. Two paths from which -a means two installs, and PATH order
decides which one runs — the usual explanation for "I updated and nothing changed".
Frequently asked
Is nightly actually risky?
How do I go back if a nightly breaks something?
Does the binary need Python installed?
Which is fastest to start up?
Related
- Fix "Unable to extract player response" in yt-dlp This one is not your fault: the site changed its page and the extractor has not caught up. How to confirm that...
- Fix "nsig extraction failed" and 50 KiB/s Downloads in yt-dlp The nsig warning is why your download crawls at dial-up speed instead of failing outright. What the n-paramete...
- Install yt-dlp on Linux Without Your Distro's Stale Package Almost every distro ships a yt-dlp too old to download from YouTube. Why that happens, how to install a build...