# youtube-dl ships no release since 2021.12.17, and the install URL never stops moving

> youtube-dl is a public domain command-line downloader whose packaging, option surface, and build system are all documented in detail, yet its numbered releases stopped in December 2021 while the repository kept taking commits into 2026. For a reader, the option set is the strongest part and the release story is the weakest.

**ytdl-org/youtube-dl** — Project brief: Command-line program to download videos from YouTube.com and other video sites.

- Repository: https://github.com/ytdl-org/youtube-dl
- Website: http://ytdl-org.github.io/youtube-dl/
- Stars: 141,397 · Forks: 10,657
- Language: Python
- License: Unlicense
- Published: 2026-08-08 · Updated: 2026-08-18 · Language: en
- Canonical page: https://hysenlabs.com/projects/ytdl-org-youtube-dl

## Numbered releases stopped at 2021.12.17 while commits continued to 2026-02-19

The two clocks in this repository disagree, and that is the first thing to understand about it. The most recent releases are 2021.12.17 dated 2021-12-16, then 2021.06.06, then 2021.05.16. The last push to the repository, however, is 2026-02-19, and the repository is not archived.

So the commit history continued for years after the last cut release. What this cannot do is give you a numbered artifact containing recent work. If a fix landed on master, there is no version string that names it, and the ChangeLog at the top level is a separate file from the release list a reader consults. The practical consequence is that comparing two youtube-dl installations by version number may tell you nothing about which is newer, and that the honest check is the commit, not the tag. It also means the question of whether site changes are currently handled has to be answered by reading the tree, because the release list cannot answer it.

## The /latest/ install path has no version in it at all

The recommended UNIX install fetches whatever the server currently serves:

```bash
sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
```

```bash
sudo chmod a+rx /usr/local/bin/youtube-dl
```

There is a wget equivalent pointing at the same path, and the same two step shape: fetch, then make it executable. Two consequences follow. Reinstalling on a different day gives you a different binary from an identical command, so the command is not a record of what you have. And the in program updater, `-U, --update`, is documented with the warning that you need sufficient permissions and may have to run with sudo, which means the update path also writes to a location you may not own.

The project's own answer to wanting more certainty is on the download page, which is where PGP signatures and further options live. If you need to know what you installed, the signature route is the documented one; the curl one-liner is not.

## Four package routes freeze four different moments, and the Windows exe has its own runtime

Beyond the script there are three more documented routes plus a direct download. pip installs or upgrades with `sudo -H pip install --upgrade youtube-dl`, and that command doubles as the upgrade mechanism. Homebrew offers `brew install youtube-dl` and MacPorts offers `sudo port install youtube-dl`, both of which resolve against a formula rather than against whatever the web server is serving.

Windows is different again: users download an .exe file and place it anywhere on PATH, with one explicit prohibition, not in `C:\Windows\System32`. The reason the executable is worth understanding is in the build script, where the Windows build goes through py2exe, and the comment there says it needs the Microsoft Visual C++ 2008 Redistributable Package. So the Windows binary is not standalone; it carries a runtime dependency that the curl and pip routes do not have.

The general consequence is that a package manager, a pip upgrade, and the /latest/ URL can each be at a different point, and only the first two are pinned by anything you can inspect later.

## Config files can change defaults you never set, and --ignore-config is the escape

Options are read from disk before you type anything. A global configuration lives at /etc/youtube-dl.conf, and a per user configuration at ~/.config/youtube-dl/config, which is %APPDATA%/youtube-dl/config.txt on Windows. Two flags govern this. `--ignore-config` stops configuration files from being read at all, and its description is more specific than the name suggests: when placed in the global file it suppresses reading the user file too, so a system level file can enforce the setting for everyone on the machine. `--config-location PATH` takes either the path to the config or its containing directory.

The consequence for a reader is that a surprising default is not necessarily a bug in the program. If a machine has a system config, behavior on that machine can differ from behavior on yours with no flag involved. If you are debugging an unexpected result, `--ignore-config` is the first switch to reach for, not the last.

A second default worth knowing is `--default-search`, whose default value is `fixup_error`: it repairs broken URLs and emits an error if that is not possible, rather than falling back to a search. `auto`, `auto_warning`, and `error` are the other values, so a bare word can trigger a search that you did not ask for.

## --geo-bypass works by faking a header, and it is independent of your proxy

The geo restriction options are unusually blunt about their method. `--geo-bypass` bypasses geographic restriction via faking the X-Forwarded-For HTTP header, and `--no-geo-bypass` turns that off. `--geo-verification-proxy URL` sends the address check through a different proxy than the download itself, using the value given to `--proxy` when that option is present and none when it is not.

Two things this cannot do. It cannot be subtle: the header is fabricated, so the site sees a location that is not the machine's, and the two flags make that behavior an explicit, named choice rather than something the tool does quietly. And it does not follow from your network setup. A reader who routes traffic through `--proxy` has not thereby enabled a bypass, and a reader who sets a verification proxy has not thereby enabled one either; each is a separate decision.

Whether to use it is yours to make and to record. The honest framing is that this is a circumvention switch, it is shipped as a first class flag next to its own negation, and the documentation gives you no guidance on when it is appropriate.

## The stated Python floor is 2.6, and the build still falls back to distutils

The requirement line names Python 2.6, 2.7, or 3.2+, and says the program is not platform specific, working on a Unix box, on Windows, or on macOS. The license statement is equally direct: released to the public domain, meaning you can modify it, redistribute it, or use it however you like. Repository metadata reports the license as Unlicense.

The build script is where the old floor shows. It tries to import setuptools and, if that fails, falls back to distutils, which is the packaging path of the Python 2 era. It also reads the version by executing the contents of youtube_dl/version.py rather than importing the package, so setup does not require the package's dependencies to be importable. A small detail in the same file shows the era: `root = os.path.dir`, which is an alias rather than the spelled out `os.path.dirname`.

For a reader on a current interpreter, the practical question is not the floor but the ceiling, and the repository does not state an upper bound. The Makefile sets `PYTHON ?= /usr/bin/env python`, so whichever interpreter is first on PATH is the one the build uses.

## PREFIX decides whether your config directory is /etc or somewhere else

The Makefile computes a system configuration directory, and the rule is conditional in a way that surprises people who install to a custom prefix:

```make
SYSCONFDIR = $(shell if [ $(PREFIX) = /usr -o $(PREFIX) = /usr/local ]; then echo /etc; else echo $(PREFIX)/etc; fi)
```

So with the default `PREFIX ?= /usr/local` you get /etc, and the install target places the bash completion in /etc/bash_completion.d/, the zsh completion in share/zsh/site-functions, and the fish completion in /etc/fish/completions. Install the same tree with `PREFIX=/opt` and the system config directory becomes /opt/etc, which means a config you wrote in /etc is not the file this build reads, and the completions land under the new prefix as well.

The second thing worth noticing is the Markdown format detection, which inspects the pandoc version and picks `markdown-smart` for version 2 and `markdown` for anything earlier. That check runs a shell command at Makefile evaluation time, so a machine without pandoc on PATH is in a state the Makefile does not describe.

## make clean globs media and metadata files in your working directory

The clean target is long, and the length is the warning. It removes build outputs such as dist/, build/, MANIFEST, README.txt, the generated man page and completions, and the binary itself. It also removes a wide set of unanchored globs:

```make
*.dump *.part* *.ytdl *.info.json *.mp4 *.m4a *.flv *.mp3 *.avi *.mkv *.webm *.3gp *.wav *.ape *.swf *.jpg *.png
```

Then it sweeps Python and Java bytecode with two `find` commands that delete every `.pyc` and `.class` under the tree.

The consequence is concrete for anyone who runs commands in a directory where they also work. Because those patterns have no path prefix, a download you just made with youtube-dl, or an `.info.json` you kept as metadata, sits in the same namespace as build garbage and is removed by `make clean` along with the man page. The `find` sweeps are broader still and are not limited to the source tree. If you keep outputs next to a checkout, clean them somewhere else.

## Conclusion

Use youtube-dl when you want a public domain single file binary and a documented option surface, and install it through a package manager rather than the /latest/ URL so your version is knowable. Do not judge the tool by its release numbers: the last numbered release is 2021.12.17 while commits continued to 2026-02-19, so a fix may exist on master with no release attached. Before running it, decide whether you want config files read at all, since /etc/youtube-dl.conf and the per user config can change defaults you did not set, and read the geo options carefully because --geo-bypass works by faking a header.

## FAQ

### Is YouTube-dl still working?

The repository is not archived and the last push was 2026-02-19, but the most recent numbered release is 2021.12.17 from 2021-12-16, preceded by 2021.06.06 and 2021.05.16. The README does not state whether current site changes are handled, so the commit history is the only record of work after that release.

### What is the replacement for YouTube-dl?

The repository does not name a replacement or recommend a successor. It points readers to the download page for further options including PGP signatures, and to the developer instructions for working with a git checkout, and the latest published build is still 2021.12.17.

### how to install youtube-dl

On UNIX, curl the latest build to /usr/local/bin and make it executable: sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl, then sudo chmod a+rx /usr/local/bin/youtube-dl. Alternatively use sudo -H pip install --upgrade youtube-dl, brew install youtube-dl, or sudo port install youtube-dl.

### how to install youtube-dl on windows

Download the .exe file and place it anywhere on your PATH, with the explicit warning not to put it in C:\Windows\System32. The executable is produced through py2exe and needs the Microsoft Visual C++ 2008 Redistributable Package, and the user config file on Windows is %APPDATA%/youtube-dl/config.txt.

### how to use youtube-dl

The usage is youtube-dl [OPTIONS] URL [URL...]. Useful starting options are --list-extractors to see supported sites, --flat-playlist to list a playlist without extracting its videos, -i/--ignore-errors to continue past a failed video, and --config-location PATH to point at a specific configuration.

### how to use youtube dl linux

Install into /usr/local/bin with the curl command and run the program from there, updating with -U/--update when you have sufficient permissions, or with sudo if needed. The Makefile defaults to PREFIX ?= /usr/local and PYTHON ?= /usr/bin/env python, so a source build uses whichever interpreter is first on PATH.

## Sources

- [Official documentation](http://ytdl-org.github.io/youtube-dl/)
- [Official README](https://github.com/ytdl-org/youtube-dl#readme)
- [Project repository](https://github.com/ytdl-org/youtube-dl)
- [Release notes](https://github.com/ytdl-org/youtube-dl/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/ytdl-org-youtube-dl
