/// FIELD NOTES FROM A SELF-AWARE GAME SITE
Twitch Download 2026: Save a VOD in 12 Steps, 20 Min
Type "twitch download" into any search bar and you will be handed a carousel of websites promising to save a stream in one click. Most of them are lying, or at least stretching. Twitch — the largest live-streaming platform on the planet, with a reported 240 million monthly active users in 2025 — ships exactly zero download tools for the people who actually watch it. There is a download button. It is not yours. It belongs to the person who made the video, and it lives behind their password.
This is a tutorial about getting the video anyway, legally and cleanly, using the tools actual archivists use instead of the ad-choked web wrappers that show up first. We will cover yt-dlp, TwitchDownloader, and Streamlink; the official broadcaster path for your own content; the browser fallbacks for when you are desperate; and the exact reasons the one-click sites should make you nervous. Budget twenty minutes for your first VOD. After that it is muscle memory.
The Premise: There Is No Download Button
What Twitch actually gives you
Let us be precise, because the rest of this guide depends on it. Twitch gives a viewer three things: a play button, a chat box, and a subscribe prompt. It does not give you a way to keep what you watched. The word "download" appears nowhere in the viewer interface, and that is not an oversight — it is the design. Twitch is a broadcast product. The economics assume the content is ephemeral, that you will come back tomorrow for more, and that nothing needs to survive the week.
There is a real download button inside Twitch, but it is fenced off. It lives in the Creator Dashboard, under Content, in a panel called Video Producer, and it only appears for the person who owns the channel. Click the three-dot menu next to one of your own past broadcasts and "Download" is right there. Click on someone else's VOD and it never was. Twitch's own documentation is blunt about the boundary: VODs are downloadable from the creator's Video Producer and are not exposed through the public API for third-party viewer tools. There is no supported path. There is no secret endpoint. There is you, a URL, and whatever tooling you bring.
Why viewers get nothing
The scale makes the absence stranger. Twitch reported roughly 240 million monthly active users in 2025, which keeps it comfortably the largest live-streaming platform in the world, and it pulled in about $1.8 billion in revenue in 2024 — an 8.1% decline from the year before, for whatever that signals about the appetite to build new viewer features. A platform that size could ship a "save for offline" button in an afternoon. It hasn't, and the reasons are not mysterious: storage costs money, copyright liability compounds, and a download button turns every stream into a redistributable file the moment it airs. Ephemerality is a feature to the people who run the servers, even when it is a bug to the people who wanted to keep the clip.
The preservation problem
This is where a retro-gaming site starts paying attention, because we have watched this movie before. Twitch VODs expire. Past broadcasts are retained for roughly 14 days on ordinary channels and up to 60 days for Partners, Prime, and Turbo accounts, after which they are deleted — and Twitch itself advises creators to download their broadcasts before they vanish. Then there was the great DMCA purge of 2020, when Twitch mass-deleted years of clips over background music and told creators, essentially, good luck. Speedrun history, tournament VODs, one-of-a-kind blind playthroughs: a lot of it is simply gone now because nobody pulled a copy in time. If you have ever dumped a cartridge to rescue a save file before the battery died, you already understand the assignment. The stream you love is a battery-backed SRAM chip on a fourteen-day timer.
Prerequisites: Tools, Versions, Storage
The software you actually need
The correct toolkit for this job is small, free, open-source, and command-line-shaped. Nobody who does this seriously uses a website. Here is the shortlist, with the reasoning for each:
- Python 3.9 or newer — the runtime for yt-dlp if you install it via pip. You can skip it entirely by grabbing the standalone yt-dlp binary, but a system Python is convenient and most Linux and macOS boxes already have one.
- yt-dlp (latest build) — the workhorse. It is a maintained fork of youtube-dl with a far more aggressive release cadence, which matters enormously here: Twitch changes its internals often, and yt-dlp's extractor is patched within days when it breaks. Versions are date-based, so "newer" is literally a bigger number. Update it constantly.
- ffmpeg (6.x or 7.x) — yt-dlp shells out to ffmpeg to mux the separate video and audio streams Twitch serves, to remux
.tsrecordings into.mp4, and to do any trimming. Without it you will get errors or half a file. - TwitchDownloader (optional) — a dedicated GUI-and-CLI tool by lay295, worth having when you specifically want the chat replay alongside the video. yt-dlp does not do chat.
- Streamlink (optional) — for capturing a broadcast while it is live, before a VOD exists or when no VOD ever will.
Every one of these is a real project with public source and real documentation, linked throughout this guide. If a tool cannot show you its source, it is not on this list for a reason we will get to.
Hardware and storage reality
The single most underestimated prerequisite is disk space. Twitch's "Source" rendition is not a fixed number, but 1080p60 broadcasts commonly sit around 6,000 to 8,000 kbps, which works out to roughly 3 to 3.6 GB per hour of footage. A typical four-hour marathon VOD is therefore a 12–15 GB file, and a twelve-hour subathon segment will happily eat 40 GB or more. If you intend to archive a channel's back catalogue, you are thinking in terabytes, not gigabytes, and you want that on fast local storage rather than a slow external spinning disk that will bottleneck the write. This is the same calculus we ran when comparing the PS5's SSD against the PS4's aging drive: throughput and headroom decide whether the job takes fifteen minutes or an afternoon. A mid-range CPU is plenty — downloading is I/O-bound and network-bound, not compute-bound — until you ask ffmpeg to re-encode, at which point cores start to matter.
Accounts, tokens, and the login question
For an ordinary public VOD you need no Twitch account at all; the video is served to anyone with the URL. The moment you want a subscriber-only VOD, a Twitch Prime perk, or anything gated behind a login, you need to prove you are entitled to see it — which in practice means handing your downloader the cookies from a browser where you are already logged in and already subscribed. We will do exactly that in the yt-dlp walkthrough, using its --cookies-from-browser flag, which reads the session token straight out of Firefox or Chrome without you ever copy-pasting a secret. No account you do not control will ever grant you access to content you are not entitled to, and no tool in this guide changes that. Downloading is not the same as bypassing.
The Law and the ToS: Read This First
Terms of Service versus the law
The author knows the law well enough to tell you where it actually sits, and it is not where the scary web copy says. Twitch's Terms of Service ask you not to access content except through the interface Twitch provides. Downloading a VOD with an outside tool violates that request. But a Terms of Service is a contract, not a statute — breaching it is grounds for Twitch to suspend your account, not grounds for anyone to arrest you. The realistic worst case for pulling a public VOD is that Twitch decides it does not like your account. That is the whole exposure on the ToS axis.
Copyright is the separate, heavier axis, and it does not care about Twitch's terms one way or the other. The streamer owns the creative work in their broadcast. Games shown in it are owned by their publishers. Music is owned by whoever owns music. A downloaded file does not transfer any of those rights to you; it just gives you a copy. What determines whether you are fine or exposed is not the download — it is what you do next.
What personal archiving actually covers
Keeping a personal copy of a stream you watched, for your own reference, sits in the same broad grey zone as taping a show off television did for decades: widely done, rarely pursued, defensible in many jurisdictions as personal use, and never a licence to republish. The bright line is redistribution. The instant you re-upload someone's VOD, mirror it publicly, monetise it, or pass it off, you are no longer archiving — you are infringing, and the copyright axis has teeth the ToS axis lacks. Download your own broadcasts freely. Download others' to watch, study, clip for private reference, or preserve something that would otherwise die on the fourteen-day timer — and keep it to yourself. If you would not be comfortable telling the streamer what you did with their video, that discomfort is the answer.
The DMCA ghost in the machine
One consequence of all this is baked so deep into Twitch that no downloader can undo it: muted audio. After a wave of record-label DMCA notices in 2020, Twitch began scanning VODs for copyrighted music and muting the offending stretches server-side — replacing the audio in the stored file itself, not just at playback. When you download such a VOD, the silence comes with it, because the original audio was never in the data Twitch served. People discover this constantly and assume their tool failed. It did not. The audio was executed at the source years ago, and you are downloading the corpse. If you want unmuted audio, the only path is to have captured the stream live, which is the entire reason Streamlink earns a section below.
The Correct Method: yt-dlp in 12 Steps
This is the method that works, keeps working, and does not route your traffic through a stranger's server. yt-dlp is a command-line program; if that phrase raised your heart rate, breathe — you will type maybe four commands total, and the config file at the end of this guide reduces future downloads to one. Here are the twelve steps, each with the reason it exists, because a step you understand is a step you can fix when it breaks.
Installing the toolchain (Steps 1–4)
- Install a package manager or Python. On Windows, winget ships with the OS; on macOS, install Homebrew; on Linux you already have apt, dnf, or pacman. Rationale: it is the difference between one clean install command and an afternoon of chasing dependencies by hand.
- Install yt-dlp. Use your package manager, pip, or the standalone binary. Rationale: this is the extractor that knows how to talk to Twitch's HLS backend and reassemble the fragments into a file.
- Install ffmpeg. Separately, because yt-dlp depends on it but does not bundle it. Rationale: Twitch serves video and audio as separate streams; ffmpeg is what merges them, and without it you get a video with no sound or an outright failure.
- Verify both are on your PATH. Run their version commands before you do anything else. Rationale: ninety percent of "it doesn't work" reports are a tool the shell cannot find, and this catches it in five seconds instead of five minutes.
# Windows (winget)
winget install yt-dlp.yt-dlp
winget install Gyan.FFmpeg
# macOS (Homebrew)
brew install yt-dlp ffmpeg
# Linux / anything with Python 3.9+
python3 -m pip install --upgrade yt-dlp
# ffmpeg from your package manager, e.g.
sudo apt install ffmpegyt-dlp --version
# 2026.xx.xx (date-based; a bigger number is newer)
ffmpeg -version | head -n 1
# ffmpeg version 7.x ...Downloading a VOD (Steps 5–8)
- Copy the VOD URL. It looks like
twitch.tv/videos/1234567890. Rationale: the numeric ID at the end is the only thing yt-dlp truly needs; everything else is decoration. - List the available formats. Run yt-dlp with
-Ffirst. Rationale: it shows you exactly which qualities Twitch will serve for this VOD — "Source", 720p60, 480p, and so on — so you choose deliberately instead of guessing. - Download the Source rendition. Pass the URL with no format flag and yt-dlp picks best. Rationale: Source is the untouched broadcast quality and the only version worth calling an archive; everything else is a re-compression.
- Watch the progress line. yt-dlp prints a live percentage, size, rate, and ETA. Rationale: it tells you whether you are being throttled (kilobytes per second) or fed properly (megabytes per second) before you have wasted twenty minutes.
# List everything Twitch is willing to serve
yt-dlp -F "https://www.twitch.tv/videos/1234567890"
# Grab the best archival copy (Source)
yt-dlp "https://www.twitch.tv/videos/1234567890"Expected output looks like this:
[twitch:vod] 1234567890: Downloading stream metadata
[twitch:vod] 1234567890: Downloading m3u8 information
[info] 1234567890: Downloading 1 format(s): Source
[download] Destination: Streamer - 2026-07-10 - Just Chatting [v1234567890].mp4
[download] 62.3% of ~8.42GiB at 9.98MiB/s ETA 05:14
[download] 100% of 8.42GiB in 14:22 at 9.99MiB/sClips, sub-only VODs, and verification (Steps 9–12)
- For a lower quality, pass
-f. For example-f 720p60. Rationale: a four-hour Source VOD is 12–15 GB; if you only need it watchable, 720p60 cuts that by more than half. - For a clip, use the clip URL. Clips live at
clips.twitch.tv/Slugand download the same way. Rationale: clips are a different object than VODs internally, but yt-dlp abstracts that away — same command, different link. - For sub-only or private VODs, pass your browser cookies. Use
--cookies-from-browser firefoxwhile logged in and subscribed. Rationale: it authenticates you as the entitled viewer you already are, without exposing a password or a manually copied token. - Verify the file. Run ffprobe on the result. Rationale: it confirms the duration, resolution, and that both an audio and a video stream are present — the fast way to catch a truncated or muted download before you delete the source.
# Pick a specific rendition to save disk
yt-dlp -f 720p60 "https://www.twitch.tv/videos/1234567890"
# A clip uses a different URL shape
yt-dlp "https://clips.twitch.tv/SomeCleverClipSlug"
# Sub-only or private VOD: borrow your logged-in browser cookies
yt-dlp --cookies-from-browser firefox "https://www.twitch.tv/videos/1234567890"ffprobe -hide_banner vod.mp4
# Duration: 04:12:38.02, bitrate: 6500 kb/s
# Stream #0:0: Video: h264, yuv420p, 1920x1080, 60 fps
# Stream #0:1: Audio: aac, 44100 Hz, stereoThat is the whole method. Steps 1–4 are one-time setup; on every subsequent VOD you live in steps 5, 7, and 12. With the config file from the advanced section in place, step 7 collapses to yt-dlp URL and you are done.
TwitchDownloader: GUI, Clips, and Chat
When a GUI is the right call
Not everyone wants a terminal, and for one specific job — capturing the chat alongside the video — yt-dlp genuinely cannot help you. This is where TwitchDownloader by lay295 earns its place. It is a real open-source project with a Windows GUI and a cross-platform CLI, and it does three things yt-dlp does not bother with: it downloads VODs and clips through a point-and-click interface, it downloads the full chat log as structured JSON, and it renders that chat back into a video overlay with badges, emotes, and timestamps intact. For preserving a tournament or a memorable stream as an experience — the run and the room reacting to it — that chat track is half the artifact.
Downloading video and chat together
The GUI is self-explanatory: paste the VOD URL or ID, pick a quality from the dropdown, choose an output path, click download, and a progress bar tracks the fetch. The CLI is where it gets useful for archiving at scale, because you can script it. The two commands you care about are videodownload and chatdownload, and running both against the same ID gives you a matched pair — an .mp4 and a .json — that together preserve the stream and everything said during it. The JSON is verbose, but it is the raw material for everything else the tool can do.
# Video + chat, the two-file archive
TwitchDownloaderCLI videodownload --id 1234567890 -q source -o vod.mp4
TwitchDownloaderCLI chatdownload --id 1234567890 -o chat.json
# Render the chat as a burned-in video overlay
TwitchDownloaderCLI chatrender -i chat.json -h 1080 -w 340 -o chat.mp4Rendering chat as a video
The payoff command is chatrender, which takes that JSON and produces a video of the chat scrolling in real time — the thing you have seen in highlight reels where the messages fly past next to the gameplay. You control width, height, font, and emote rendering, then composite it beside the gameplay in any editor, or just keep it as a standalone companion file. It is slower than a plain download because it is genuinely rendering frames, so treat it as a batch job rather than something you wait on. Full options and build instructions live in the TwitchDownloader repository, which is the authoritative source and the only place you should get the binary — not a mirror, not a "download portal."
Streamlink: Catching a Live Stream
Why record live at all
Two situations make live capture the only option. The first is the muted-audio problem from earlier: if a VOD will be scanned and silenced, the only way to keep the real audio is to record the broadcast as it airs, before Twitch's copyright scanner ever touches it. The second is simpler — some streamers disable VODs entirely, or delete them within minutes of going offline, so there is no past broadcast to download at all. In both cases you are not downloading a file that exists; you are catching a river as it flows. That is Streamlink's whole job.
The recording command
Streamlink was built to pipe a live Twitch stream into a media player, but it records to disk just as happily by pointing its output at a file instead. The one flag worth memorising is --twitch-disable-ads, which keeps mid-roll ad segments from being spliced into your recording and corrupting the timeline. Point it at a live channel, pick best quality, and send the output to a .ts file — the transport-stream container is used deliberately because it survives an interrupted write. If your machine crashes or the stream drops mid-record, a .ts is still playable up to the cut, where an .mp4 would be a corrupt header and nothing else.
# Record a live channel straight to disk
streamlink --twitch-disable-ads "https://www.twitch.tv/streamername" best -o "live.ts"
# Remux the .ts container to .mp4 (no re-encode, instant and lossless)
ffmpeg -i live.ts -c copy live.mp4Remuxing and cleanup
Once the stream ends and you have your .ts, convert it to a normal .mp4 with a stream copy — no re-encode, so it is nearly instant and lossless. The same ffmpeg you installed for yt-dlp does it in one line. From there you have a clean archival file with its original, un-muted audio, which is the whole point of having bothered to stay up for the live capture. Streamlink's documentation covers its Twitch-specific options, authentication for sub-only live streams, and the plugin system in depth; keep the Streamlink docs bookmarked, because the Twitch plugin's flags shift as Twitch's ad system does.
The Broadcaster Path: Your Own VODs
Turning on Store Past Broadcasts
If the content is yours, none of the above is necessary — Twitch hands you a supported download button, and you should use it. The catch is that it only works if you told Twitch to keep the broadcast in the first place. Before you stream, go to Creator Dashboard, then Settings, then Stream, and enable Store Past Broadcasts. Without that toggle on, the stream is never saved as a VOD and there is nothing to download later, no matter which tool you point at it. This is the single most common self-inflicted wound among new streamers: they finish a great session, go looking for the recording, and discover Twitch was never keeping it.
The Video Producer download
With storage enabled and a broadcast in the can, the path is short: Creator Dashboard, then Content, then Video Producer. Find the past broadcast in the list, click the three-dot menu beside it, and select Download. Twitch prepares the file and your browser saves the full-quality original — no third-party anything, no cookies, no command line. This is the one and only officially sanctioned download flow on the entire platform, and it is walled off to the account that owns the video. It is worth internalising that boundary, because it explains everything else in this guide: the feature exists, it works well, and Twitch simply refuses to extend it one inch past the channel owner.
Why you should not rely on it
Even for your own content, treat the Twitch copy as temporary. Past broadcasts expire on the same 14-day (or 60-day for Partners, Prime, and Turbo) clock as everyone else's, and Twitch's own guidance is explicit that you should download important broadcasts before they age out, because an expired VOD is not recoverable through support or any back door. The professional move is to pull every VOD you care about to local storage the day it ends and never let Twitch be the only copy. A platform that deletes your work on a timer is not an archive; it is a waiting room. If you are also broadcasting, the software side of that story — capture, encoding, and stream setup — is its own rabbit hole worth doing properly.
Browser Fallbacks: Right-Click and DevTools
The right-click gamble
Sometimes you have no toolchain installed and you want a clip now. The lowest-effort attempt is to right-click directly on the clip player and look for "Save video as" or "Download video." On some clips, in some browsers, the option is simply there and it works. On most, it is greyed out or absent, because Twitch's player is not a plain <video> tag pointed at a file — it is a JavaScript player streaming fragments. The right-click method is a coin flip you can call in two seconds, so it is worth the two seconds, but do not be surprised when it comes up tails. It fails more often than it succeeds, and it never works on full VODs, only on some clips.
The Developer Tools method
When right-click fails, the browser will still tell you where the video lives if you ask it directly. Open Developer Tools with F12, switch to the Network tab, and filter by media or by .mp4. Now play the clip. The Network panel will populate with the actual media requests, and among them is the direct URL to the MP4 the player is pulling. Right-click that request, copy the URL, paste it into a new tab, and use your browser's own "Save As" to write it to disk. It is fiddly, it is manual, and it breaks the moment Twitch changes its player internals — but it uses nothing except the browser you already have, and it demystifies what the one-click sites are doing behind their loading spinners. They are running this exact lookup for you and charging your attention in ad impressions for the privilege.
When to bother
Reserve the browser methods for clips, for one-offs, and for machines where you genuinely cannot install software. For anything longer than a clip, anything you want at Source quality, or anything you plan to do more than once, the browser fallbacks are a trap — slow, quality-limited, and manual in a way that does not scale past a single file. They are the "in case of emergency, break glass" option, and it is good to know they exist, but yt-dlp does everything they do, better, without the guesswork. Think of DevTools as the fire axe, not the front door.
The Web Tools: TW Golem and Friends
What they are and how they work
Search results for "twitch download" are dominated by websites that promise to do all of this in your browser: paste a URL, click a button, get a file. AppsGolem's TW Golem is a representative example — you feed it a VOD link like twitch.tv/videos/1234567890, choose a quality from a dropdown (source, 720p60, 480p, and so on), and a progress bar tracks the fetch until a download link appears. StreamRecorder.io is another perennial, and it markets itself honestly enough by pointing at Twitch's "zero tools for viewers" as the reason it exists. Mechanically, these sites are doing exactly what the DevTools method does — resolving the HLS playlist and pulling the fragments — except on their servers instead of your machine.
The costs nobody advertises
That "on their servers" detail is the whole problem, and it is why The Machine does not use them. When a web tool downloads a VOD for you, your request and the resulting traffic pass through infrastructure you do not control. You are telling a third party which VODs you are pulling. Source quality is frequently gated, throttled, or quietly downgraded because serving full-bitrate files to strangers is expensive, so the "source" you get may not be. The pages are wrapped in advertising — often the aggressive, redirecting kind — because ad impressions are how a free download site pays for that bandwidth. And you are entirely at the mercy of a service that can break, paywall, or vanish overnight, taking your workflow with it. None of this is hypothetical; it is the standard business model of the category.
The one legitimate use
To be fair, and this site tries to be: a reputable web downloader is fine for a single throwaway clip on a device where you cannot or will not install anything, and where you do not care about quality or privacy. That is a real scenario and the tools serve it. But the instant the file matters — an archive you intend to keep, a Source-quality VOD, anything you would be annoyed to lose or to have logged — a local tool is faster, higher quality, and does not hand your viewing history to a company whose name you will forget by next week. The web tools are not evil. They are just the worst version of a thing you can do better in four commands. Notably, neither Polygon nor Ars Technica nor any comparable outlet has published a 2025–2026 piece announcing an official viewer download feature; the only authority these guides can actually cite is Twitch's own help documentation, which says what it has always said — the button is not yours.
Common Pitfalls and How to Fix Them
Pitfalls of setup and tooling
Pitfall 1 — running a stale yt-dlp. This is the number-one cause of "it suddenly stopped working." Twitch changes its backend, the old extractor breaks, and people assume the site blocked them. It didn't; your copy is just old. Fix: update before you troubleshoot anything else — yt-dlp -U for the binary, or pip install --upgrade yt-dlp. If a download fails, update first and retry before you believe the error.
Pitfall 2 — ffmpeg not installed or not on PATH. yt-dlp will download fine and then fail at the merge step with "ffmpeg not found," leaving you with fragments and no playable file. Fix: install ffmpeg separately, confirm ffmpeg -version runs from the same terminal, and if it is installed but hidden, point yt-dlp at it with --ffmpeg-location.
Pitfalls of the content itself
Pitfall 3 — chasing muted audio you cannot recover. As covered, DMCA-muted stretches are silenced in Twitch's stored file. No downloader restores them, and hours spent trying different tools are hours wasted. Fix: accept it for existing VODs; capture live with Streamlink next time if the audio matters.
Pitfall 4 — the VOD already expired. If yt-dlp reports it cannot find the video, the most likely explanation is not a bug but a tombstone: the broadcast aged past its 14- or 60-day window and Twitch deleted it. Fix: there is no fix after the fact — the data is gone. The only real remedy is prevention: download things you care about the week they air.
Pitfall 5 — forgetting sub-only content needs authentication. A subscriber-gated VOD returns an access error to an anonymous downloader, which reads like a failure but is actually the paywall doing its job. Fix: pass --cookies-from-browser from a browser logged into an account that is actually subscribed. If you are not entitled to it, no flag will conjure entitlement.
Pitfalls of scale and storage
Pitfall 6 — underestimating disk usage. "I'll grab this channel's VODs" turns into a full disk halfway through because each Source VOD is 12–15 GB and there were forty of them. Fix: do the arithmetic before you start, download to a drive with real headroom, and pick a lower rendition with -f when archival quality is not the goal. Pitfall 7 — Windows filename explosions. Long stream titles with emoji and illegal characters produce "invalid filename" or "path too long" errors. Fix: add --restrict-filenames, cap the title length in your output template (the config below uses %(title).80s), and enable long-path support in Windows.
Troubleshooting Table
Reading the table
Most failures in this workflow produce one of a small set of errors, and almost all of them have a one-line fix. Match the symptom on the left to the cause in the middle, apply the fix on the right, and move on. If your exact error is not listed, jump to the universal first move below, because it resolves a surprising fraction of everything.
The failures you will actually hit
| Symptom | Likely cause | Fix |
|---|---|---|
| HTTP 403 Forbidden | Expired access token or hotlink protection | Update yt-dlp, retry, and pass --cookies-from-browser if it persists |
| "Unable to download JSON metadata" | VOD deleted or expired past its window | Nothing recovers a purged VOD; it is permanently gone |
| Sub-only VOD returns an access error | Not authenticated as a subscriber | --cookies-from-browser firefox while logged in and subscribed |
| Long stretches of silence in the file | Twitch DMCA audio muting, baked into the source | Unrecoverable for VODs; capture live with Streamlink next time |
| Download crawls at a few KB/s | Twitch fragment throttling | --concurrent-fragments 8; retry off-peak; remove any rate limit |
| "ffmpeg not found" | ffmpeg missing or not on PATH | Install ffmpeg, restart the terminal, or set --ffmpeg-location |
| Extractor error right after a Twitch change | yt-dlp is out of date | yt-dlp -U or pip install --upgrade yt-dlp |
| "Invalid filename" or "path too long" on Windows | Illegal characters or an over-long title | --restrict-filenames, shorten the -o template, enable long paths |
| Clip URL not recognised | Unusual clip path or stale extractor | Use the full share URL and update yt-dlp |
Download stalls, leaves a .part file | Interrupted fragments | Re-run the same command; --continue resumes where it stopped |
| Chat JSON is gigabytes | Long VOD with dense chat | Normal; compress it or render only the time window you need |
The universal first move
When something breaks and you do not know why, update yt-dlp before you do anything else. Twitch's internals shift often, yt-dlp patches within days, and a stale build is the single likeliest culprit behind a fresh failure. It is the "have you tried turning it off and on again" of this entire hobby, and it works often enough that skipping it is false economy. Only after you are certain you are on the latest build should you start reading the error message literally.
Advanced Tips and a Complete Config
Batch downloading a channel
Once one VOD works, scaling up is mostly restraint. yt-dlp accepts a batch file — a plain text list of URLs, one per line, passed with -a urls.txt — and will grind through the lot unattended. It also accepts a channel's videos URL and will enumerate the available VODs itself, which is how you mirror a back catalogue before it expires. Combine that with --download-archive done.txt, which records every ID it has already fetched, and you get an idempotent job: run it daily, and it grabs only what is new, skipping everything it has seen. That is the difference between "downloading VODs" and actually running an archive. Just remember the storage math from the prerequisites — a channel is terabytes, not gigabytes.
Trimming, naming, and metadata
Two flags turn a raw dump into a tidy library. The output template, -o, controls the filename with fields yt-dlp fills in — uploader, upload date, title, ID — so every file sorts and reads sensibly instead of being called v1234567890.mp4. And --embed-metadata writes the title, uploader, and date into the file itself, so the information survives even if the filename is later changed. If you only want a slice of a long VOD, --download-sections takes a timestamp range and pulls just that window — far faster than downloading four hours to keep four minutes. For the retro crowd that likes a clean, self-describing archive, this is the same discipline as labelling your ROM dumps properly; a nameless file is a lost file. If you enjoy this style of careful, step-by-step tooling, the same energy powers our CPU undervolting walkthrough, which is command-line patience applied to silicon instead of streams.
The complete working config
Finally, the payoff: a configuration file that bakes in every good default so your daily command shrinks to yt-dlp URL. Drop this at ~/.config/yt-dlp/config on Linux or macOS, or %APPDATA%\yt-dlp\config.txt on Windows, and yt-dlp reads it automatically on every run. It selects best quality with a graceful fallback, names files sensibly with a length-capped title, downloads fragments in parallel, retries aggressively on Twitch's flaky fragments, and embeds metadata, a thumbnail, and a sidecar info file for a properly self-documenting archive.
# yt-dlp config file
# Linux/macOS: ~/.config/yt-dlp/config
# Windows: %APPDATA%\yt-dlp\config.txt
-f "bestvideo+bestaudio/best"
-o "%(uploader)s - %(upload_date>%Y-%m-%d)s - %(title).80s [v%(id)s].%(ext)s"
--concurrent-fragments 8
--retries 20
--fragment-retries 20
--continue
--embed-metadata
--write-info-json
--write-thumbnail
--restrict-filenamesWith that in place, archiving a Twitch VOD is genuinely one command and a wait. The platform gives its 240 million viewers no button, no API, and a fourteen-day delete timer — so you build the button yourself, out of open-source parts, and you keep what you came to keep. That is the whole tutorial, and it is also, not coincidentally, the entire philosophy of this site.
Questions the search bar asks me
- Can viewers download Twitch VODs officially in 2026?
- No. Twitch restricts the Video Producer download button to the channel owner, and its own documentation confirms VODs are not exposed through the public API for third-party viewer tools. Viewers use yt-dlp, TwitchDownloader, or Streamlink instead.
- Is downloading someone else's Twitch VOD legal?
- The tool is legal; what you do with the file is the question. Twitch's ToS restricts off-platform access (a contract matter, not a crime), and the streamer holds copyright. Personal archiving sits in a grey zone; redistribution does not — do not re-upload other people's content.
- Why is the audio muted in parts of my downloaded VOD?
- Twitch mutes copyrighted audio on the VOD server-side, a legacy of its 2020 DMCA purge. The muting is baked into the stored file, so no downloader can recover the original audio — the data simply is not served. Capturing the stream live is the only way to keep unmuted audio.
- How long before a Twitch VOD expires?
- Twitch stores past broadcasts for roughly 14 days for most channels and 60 days for Partners, Prime, and Turbo users. Twitch explicitly warns creators to download before expiry, because a purged VOD is gone permanently with no support recovery.
- Are one-click sites like TW Golem or StreamRecorder.io safe?
- They work, but they proxy your request through their own servers, wrap the page in ads, and often throttle or downgrade source quality. For anything you care about, a local tool like yt-dlp is faster, higher quality, and does not hand your VOD list to a stranger.