yt-dlp releases split into self-updating binaries and .zip builds with no auto-update
A feature-rich command-line audio/video downloader
At a glance
- What is it?
- yt-dlp/yt-dlp is a Python command-line media downloader under the Unlicense, forked from youtube-dl, with date-named releases, README markers that control what goes into the man page, and a package that declares zero required dependencies. The release table is where most of the practical decisions hide.
- Who is it for?
- yt-dlp suits someone who needs a scriptable downloader and is willing to read the option groups rather than guess. Pick the recommended binary for your platform, yt-dlp.exe on Windows, yt-dlp_macos on Mac, or the zipimport yt-dlp with Python on Linux and BSD, because the unpackaged .zip alternatives are annotated as having no auto-update and you take on that job yourself.
- Can I use it commercially?
- Yes. Unlicense is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 10 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 13, 2026, and from our analysis. They are not legal advice.
Star history
- yt-dlp/yt-dlp207,556 ★ · +28,236
| Repository | 2026-07-21 | 2026-11-13 |
|---|---|---|
| yt-dlp/yt-dlp | 179.3k | 207.6k |
28,236 Stars in the last 115 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
Every .zip alternative is annotated as having no auto-update
The release files table divides into a Recommended group of three and an Alternatives group. Recommended: yt-dlp, a platform-independent zipimport binary that needs Python and is recommended for Linux and BSD; yt-dlp.exe, a Windows Win10+ standalone x64 binary recommended for Windows; and yt-dlp_macos, a Universal MacOS 10.15+ standalone executable recommended for MacOS. Everything else in the Alternatives table is qualified, and the qualification that matters most is the parenthetical on each unpackaged archive: (no auto-update). The standalone binaries carry glibc 2.17+ for x86_64 and aarch64, musl 1.2+ for the musl builds, Win10+ for the Windows builds, while the armv7l build is the one that asks for glibc 2.31+. Consequence: the .zip route hands you update responsibility permanently, and the armv7l build carries a higher glibc floor (2.31+) than the others.
The README is generated from the man page, not the other way round
The file you read on GitHub contains HTML comments that mark which parts go into the man page, including MANPAGE: BEGIN EXCLUDED SECTION, MANPAGE: END EXCLUDED SECTION, and a MANPAGE: MOVE "USAGE AND OPTIONS" SECTION HERE instruction. The excluded regions hold the badges, the download links, and the table of contents, and the move marker tells the generator where the options section belongs. In the Makefile, the doc target lists README.md, CONTRIBUTORS, issuetemplates, and supportedsites, and the pypi-files target ships AUTHORS, Changelog.md, LICENSE, README.md, README.txt, completions, yt-dlp.1, pyproject.toml, devscripts/*, and test/*. Consequence for a reader: a published install can carry three renditions of the same documentation, README.md, README.txt, and the yt-dlp.1 man page.
The package declares zero required dependencies
The dependency list in pyproject.toml is empty, which is unusual for a tool with this feature set, and the work is pushed into the default extra:
dependencies = []
[project.optional-dependencies]
default = [
"brotli ; implementation_name == 'cpython' and sys_platform != 'ios'",
"brotlicffi ; implementation_name != 'cpython'",
"certifi>=2026.10.19",
"mutagen",
"pycryptodomex",
"requests>=2.32.2,<3",
"urllib3>=2.0.2,<3",
"websockets>=13.0",
"yt-dlp-ejs==0.8.0",
]A separate curl-cffi extra sits alongside it. The environment markers on the two brotli entries split the interpreter: CPython on anything but iOS gets brotli, everything else gets brotlicffi. Consequence for you: a bare install pulls nothing, and whether the extractors have the cipher and transport support they expect depends on the extra you chose, so the default extra is the one to install unless you have a reason.
The version is declared dynamic, so releases are named after dates
pyproject.toml lists dynamic = ["version"] rather than a literal version string, so the version is not readable from the project metadata at all. The released versions follow the same logic, with tags named 2026.10.26, 2026.10.21, and 2026.08.19, and each appears as yt-dlp 2026.10.26 and so on. The default branch is master and its last push is dated 29 October 2026, which is later than the newest release tag of 26 October 2026, so the branch head is ahead of anything you can download. Consequence for a packager: a lockfile, a distro recipe, or a container pin cannot learn the version from the metadata, and anyone who clones master is running code that no release has shipped. The classifier Development Status :: 5 - Production/Stable applies to the released package, not to master.
The build regenerates extractors and the ejs bundle before packaging
The Makefile shows the order of operations. The default target is `all: lazy-extractors yt-dlp doc pypi-files`, and all-extra adds yt-dlp-extra. Generated artifacts are treated as disposable: clean-dist removes yt_dlp/extractor/lazy_extractors.py along with .ejs-* and yt_dlp_ejs/, and the .zip and .tar.gz outputs are removed by the same target. There is a phony target called current-ejs-version marked .IGNORE and .SILENT, and the version of the JavaScript component is pinned in the dependency list as yt-dlp-ejs==0.8.0. The comment above pypi-files explains why the packaging step exists and warns to keep the list in sync with the includes and artifacts in pyproject.toml, giving the intended use as a source distribution build:
make pypi-files && python3 -m build -sn .Consequence: the Makefile comment gives make pypi-files followed by python3 -m build -sn. as the intended way to build a source distribution.
Options live in seventeen groups, and default behaviour differs from youtube-dl
The options surface is partitioned rather than flat. Seventeen groups appear under USAGE AND OPTIONS: General, Network, Geo-restriction, Video Selection, Download, Filesystem, Thumbnail, Internet Shortcut, Verbosity and Simulation, Workarounds, Video Format, Subtitle, Authentication, Post-processing, SponsorBlock, Extractor, and Preset Aliases. Four reference sections follow, CONFIGURATION with its file encoding, netrc, and environment variable subsections, then OUTPUT TEMPLATE, FORMAT SELECTION with filtering and sorting, and MODIFYING METADATA. The last technical section is CHANGES FROM YOUTUBE-DL, which is split into new features, differences in default behavior, and deprecated options. Consequence for a reader arriving from youtube-dl: the differences-in-default-behavior subsection is the one that decides whether a command line you already know behaves the same way.
A .NO_AI directory sits at the top of the tree with no explanation
The repository root carries a directory named .NO_AI/, alongside public.key, THIRD_PARTY_LICENSES.txt, Changelog.md, Maintainers.md, CONTRIBUTORS, supportedsites.md, devscripts/, test/, bundle/, uv.lock, yt-dlp.cmd, and yt-dlp.sh. A reader has to open .NO_AI to see what it contains. Two neighbouring files are more self-explanatory in what they imply. public.key sits at the root, which is the shape you would expect for verifying release artifacts, and THIRD_PARTY_LICENSES.txt is a separate file from LICENSE, which is the Unlicense, so bundled material carries its own terms rather than inheriting the public domain dedication. Consequence for you: if you are vendoring yt-dlp into a product, the licensing of what ships inside it is not settled by the project's own license statement.
Editorial conclusion
yt-dlp suits someone who needs a scriptable downloader and is willing to read the option groups rather than guess. Pick the recommended binary for your platform, yt-dlp.exe on Windows, yt-dlp_macos on Mac, or the zipimport yt-dlp with Python on Linux and BSD, because the unpackaged .zip alternatives are annotated as having no auto-update and you take on that job yourself. Confirm the Python floor of 3.11 before you build a virtualenv, and install the default extra rather than the bare package, since dependencies is empty and the extra is where brotli, certifi, requests, and the pinned yt-dlp-ejs live. Note that the newest release is 2026.10.26 while the last push to master is 29 October 2026, so a checkout of master is ahead of any tag.
Frequently asked questions
Is YouTube DLP illegal, according to yt-dlp?
The project's opening description does not mention legality. It describes the project as a feature-rich command-line audio/video downloader with support for thousands of sites, and a fork of youtube-dl.
Does yt-dlp work anymore?
The repository is not archived and its last push is dated 29 October 2026, with recent releases named 2026.10.26, 2026.10.21, and 2026.08.19.
Is yt-dlp trustworthy?
The package declares an empty dependencies list, keeps the real requirements in a default extra, and pins yt-dlp-ejs at 0.8.0. The release table recommends a binary for each platform, and pip and third-party package managers are listed as other install routes.
how to install yt-dlp on windows
The release table marks yt-dlp.exe, a Windows Win10+ standalone x64 binary, as recommended for Windows. There is also an x86 32-bit build for Win10+ and an ARM64 build for Win10+, and the unpackaged .zip variants have no auto-update.
how to install yt-dlp on mac
The release table marks yt-dlp_macos, a Universal MacOS 10.15+ standalone executable, as recommended for MacOS. You can also install through pip or one of the third-party package managers, with details in the project wiki.
how to use yt-dlp in python
The readme has an EMBEDDING YT-DLP section with embedding examples, plus a separate EXTRACTOR ARGUMENTS section for passing options to individual extractors. The package requires Python 3.11 or newer and classifies 3.11 through 3.15, CPython and PyPy.
Official sources
Where this project is recommended
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/yt-dlp-yt-dlp)Star history chart for your README
[](https://hysenlabs.com/projects/yt-dlp-yt-dlp)Was this useful?