Streamlink: a CLI that pipes service streams into your own player
Streamlink is a CLI utility which pipes video streams from various services into a video player
At a glance
- What is it?
- Streamlink is a Python library and command-line tool that resolves a stream URL, picks a quality and hands the data to a video player. It is built for people who want the stream without the page around it.
- Who is it for?
- Adopt Streamlink if you want a scriptable, headless way to watch or capture a stream you already have access to, and you are comfortable with a terminal. Do not adopt it if you need a graphical interface out of the box or expect it to bypass access controls; the README points to the installation docs rather than a GUI, and the project's own framing is about avoiding heavy web pages, not about circumventing anything.
- Can I use it commercially?
- Yes. BSD-2-Clause 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 received new commits within the last day.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
The problem Streamlink removes: the player page between you and the stream
Watching a live stream in a browser means loading the page around it. Chat, overlays, ads, tracking scripts and video decoding all compete for the same machine. The README states the goal plainly: "Avoid resource-heavy and unoptimized websites, and still enjoy streamed content." That sentence is the whole product thesis. Streamlink takes a service URL, works out the available streams and their qualities, and writes the chosen one to a media player or to a file.
The audience is narrower than the download numbers suggest. This is a CLI utility, and pyproject.toml classifies it as "Environment :: Console" with an intended audience of "End Users/Desktop". The people who get value from it are those already running mpv or VLC, those capturing a stream on a headless box, and Python developers who want the same extraction logic as a library rather than a subprocess. The README points Python implementors at a separate API guide and API reference, which tells you the library surface is treated as a first-class product, not an implementation detail of the CLI.
One historical detail matters for judging the project. Streamlink "was forked in 2016 from the abandoned Livestreamer project". That fork is why the plugin list is as long as it is, and it is also why some older tutorials describe commands and behaviours that no longer match.
How the plugin system resolves a URL into playable streams
The mechanism is a plugin registry. The README says Streamlink "is built on top of a plugin system which allows support for new services to be added easily", and that most popular services are covered, naming Twitch and YouTube as examples. The full list lives on the plugins page in the documentation.
In practice the flow is: you pass a URL, Streamlink matches it against the plugins it ships, that plugin queries the service and returns a set of named streams (typically quality labels), and the CLI then either hands the selected stream to a player or writes it to disk. The README describes the outputs as playing back streams, writing the stream to the filesystem, and reading stream metadata, with "a lot of other options and output methods" available. The repository layout backs this up: src/ holds the package, tests/ holds the suite, and docs/ holds the CLI documentation, the API guide and the API reference that the README links to.
The consequence of a plugin architecture is that support is not uniform. Each plugin is code that has to track a service's current behaviour, so a service can work today and break after a change on its side. That is a maintenance property of the design, not a defect in it, and it is the single most important thing to understand before you build a workflow around a specific site.
Installing Streamlink and playing a first stream
The README does not inline installation commands. It sends you to the documentation for four routes: Windows, macOS, Linux and BSD, and the PyPI package and source code. So the honest first step is to open https://streamlink.github.io/install.html and follow the section for your platform.
If you go the PyPI route, the package name is streamlink. Python 3.10 or newer is required; setup.py raises a hard error and prints an "Unsupported Python version" message if the interpreter is older, and pyproject.toml declares requires-python = ">=3.10" with classifiers for 3.10 through 3.15.
python -m pip install streamlinkAfter that, the README's quickstart is a single command. The first argument is the stream URL and the second is the quality, here the keyword best.
streamlink "STREAMURL" bestThe README states the default behaviour is to play the stream back in VLC, so VLC needs to be installed and discoverable for that default to work. If you would rather write the stream to a file instead of opening a player, the README lists writing to the filesystem as one of the supported output methods; the exact flags for that are in the CLI documentation rather than the README, so check https://streamlink.github.io/cli.html before scripting it. To see what qualities a URL actually offers, ask Streamlink to list them rather than guessing at a label, and read the metadata output the README mentions.
Where Streamlink is the wrong tool
Streamlink is not a downloader in the general sense, even though people search for it that way. It resolves streams from services it has plugins for. Point it at an arbitrary media URL and there is no plugin to match, so nothing resolves. If your actual need is pulling a file from a URL you control, a plain HTTP client is the smaller and more predictable choice.
Access control is the other boundary. Streamlink works with what the service serves to a client; it is not a tool for getting past authentication or paywalls, and nothing in the README or the repository metadata suggests otherwise. If a stream requires a login you do not have, Streamlink is not the answer.
There is also a real operational cost to the plugin model. Because each plugin tracks a third-party service, breakage arrives on someone else's schedule. A working command can stop working after a service-side change, and the fix lands in a Streamlink release rather than in your own code. For a one-off viewing that is invisible. For an unattended recording pipeline it means you should expect to upgrade Streamlink regularly, and you should not treat a pinned version as a stable interface to a service. The README does not document rollback behaviour for a plugin that has broken, so plan for the upgrade path rather than a rollback path.
Streamlink compared with yt-dlp
The natural comparison is yt-dlp, and the difference is in what each treats as the primary output. yt-dlp is built around downloading media to disk, with a very large extractor set and post-processing for remuxing and format selection. Streamlink is built around piping a live stream into a player, with the file-writing path as one option among several.
That shows up in the defaults. Streamlink's documented default action is to open VLC and play, which is the right default if you are watching now. yt-dlp has no such default; it writes a file. If your job is archiving a finished video, yt-dlp's model fits without argument. If your job is watching a live stream on a low-powered machine, or feeding a stream into a player you already configured, Streamlink's model fits and yt-dlp's does not, at least not without extra plumbing.
There is overlap, and the honest position is that many people run both: yt-dlp for on-demand downloads, Streamlink for live playback. Choosing between them is less about capability and more about which default you want to live with.
Licence, maintenance and the upgrade tax
Streamlink is licensed BSD-2-Clause, declared in pyproject.toml as license = "BSD-2-Clause" with license-files = ["LICENSE"]. That is a permissive licence, which matters if you embed the library in something you ship. As always, read the LICENSE file and the licence text itself rather than treating a short summary as legal advice; the repository also carries a signing.key.enc at the top level, which is worth understanding if you verify release artefacts.
The maintenance picture is concrete. The repository is not archived, and the last push was on 2026-09-18. Releases are frequent: 8.6.1 on 2026-09-16, 8.6.0 on 2026-09-13, and 8.5.0 on 2026-08-01. For a plugin-driven tool that is the right shape, because frequent releases are how service changes get absorbed. The cost to you is the upgrade cadence. Budget for updating the package on the same rhythm as the services you depend on, and read CHANGELOG.md before upgrading rather than after something stops working.
Build-side detail worth knowing: the project uses setuptools with a custom build backend in build_backend/, and versioningit for version strings. That is only relevant if you build from source or package Streamlink yourself; installing the published package does not require you to care.
Editorial conclusion
Adopt Streamlink if you want a scriptable, headless way to watch or capture a stream you already have access to, and you are comfortable with a terminal. Do not adopt it if you need a graphical interface out of the box or expect it to bypass access controls; the README points to the installation docs rather than a GUI, and the project's own framing is about avoiding heavy web pages, not about circumventing anything. Before committing, verify on your target machine that Python 3.10 or newer is available and that the service you care about still appears on the plugins page, because plugin support is what decides whether a given URL resolves at all.
Frequently asked questions
What does Streamlink do?
It is a Python library and command-line interface that pipes streams from various services into a video player. The README describes its purpose as avoiding resource-heavy and unoptimized websites while still watching streamed content.
How do I install Streamlink?
The README points to the documentation for installation on Windows, macOS, Linux and BSD, and for the PyPI package and source code. The PyPI package is named streamlink and requires Python 3.10 or newer.
How do I use Streamlink with VLC?
VLC is the default player Streamlink uses, so the quickstart command streamlink "STREAMURL" best should open VLC without extra configuration. VLC needs to be installed and discoverable for that default to work.
How do I use Streamlink?
After installing, run streamlink "STREAMURL" best, where the first argument is the stream URL and the second is the quality keyword. The README notes that writing the stream to the filesystem and reading stream metadata are also available output methods.
Is Streamlink safe to download?
The repository is not archived, its last push was on 2026-09-18, and releases are published frequently, with 8.6.1 on 2026-09-16. Install from the sources the README links to, and note that the repository contains a signing.key.enc if you verify release artefacts.
How do I install Streamlink plugins?
Plugins are part of the project rather than something you install separately; the README says Streamlink is built on a plugin system and lists the included plugins on the plugins documentation page. Adding support for a new service means contributing a plugin to the project.
Official sources
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/streamlink-streamlink)
Community notes