STARESBACK.GG
LV 1
0 XP

/// FIELD NOTES FROM A SELF-AWARE GAME SITE

Twitch Download 2026: yt-dlp in 12 Steps, 30 Minutes

BY·EDITED BYSAM P.·2026-08-06·8 MIN READ·6,044 WORDS·EDITORIAL PROCESS
Twitch Download 2026: yt-dlp in 12 Steps, 30 Minutes — STARESBACK.GG blog

There is a clock running on every broadcast you have ever streamed, and it is shorter than the return window on a pair of socks. For a regular Twitch account in 2026, a past broadcast — what Twitch calls a VOD, or Video on Demand — survives exactly 14 days before the platform deletes it. If you are a Partner or an Affiliate, you get 60 days. After that, the file is gone from Twitch's servers, and no amount of pleading with support brings it back. This is not a bug. It is the documented, deliberate retention policy, and it is the single reason this article exists.

We are a retro-gaming publication, so we come at this from a specific bias: things worth making are worth keeping. The same instinct that makes a sensible person dump a SNES cartridge to a file before the save battery corrodes should make you archive your Twitch broadcasts before the 14-day timer does the corroding for you. Streaming is performance, but it is also a record — of a speedrun, of a blind first playthrough, of a chat box that will never assemble in quite the same configuration again. Twitch treats that record as disposable. You do not have to.

This tutorial covers the whole job: pulling VODs at full quality, grabbing clips and highlights, downloading and rendering the chat replay, and doing all of it either from a terminal with yt-dlp and TwitchDownloader or, if you would rather never see a command line, straight from the Creator Dashboard. It runs long because the job has edges — muted audio, subscriber gates, rate limits, retention windows — and skipping the edges is how people end up with a folder of half-corrupt MP4s and a VOD that expired while they were reading a shorter guide. Budget about 30 minutes for your first run. Budget far less for every run after that.

Why Downloading Twitch Matters in 2026

Twitch's storage model is an asymmetry: the platform makes broadcasting frictionless and archiving deliberately temporary. Understanding exactly what expires, what does not, and how much content is on the chopping block at any given moment is what turns “I should back that up sometime” into an actual workflow.

The 14-Day Guillotine

Twitch's Video on Demand policy in 2026 is unchanged from the arrangement creators have grumbled about for years: standard accounts keep past broadcasts for 14 days, and Partners and Affiliates keep them for 60. The moment that window closes, the VOD is purged. There is no grace period, no archive tier you can buy, no restore-from-trash. If you streamed a four-hour tournament run on day one and only think to save it on day fifteen, you are saving nothing. The policy is defensible from Twitch's side — storing millions of hours of high-bitrate video indefinitely is genuinely expensive — but from the creator's side it means the default state of your work is deletion, and the entire burden of preservation lands on you.

Worse, storing past broadcasts is a setting you have to opt into. If Store past broadcasts is switched off in your Stream settings, Twitch keeps nothing at all — the broadcast evaporates the instant you go offline, and the 14-day clock looks generous by comparison. Step zero of any archival strategy, before you touch a single tool, is confirming that Twitch is actually holding onto the VOD long enough for you to grab it. The official Twitch Video on Demand help page remains the authoritative source for these retention rules, and it is worth reading once in full.

What Never Expires: Clips and Highlights

Two formats escape the guillotine. Clips — the 5-to-60-second excerpts viewers and creators cut from a live stream or a VOD — do not expire. Neither do Highlights, the manually curated segments a broadcaster carves out of a past broadcast and keeps as a permanent fixture of the channel. This asymmetry is the single most useful thing to understand about Twitch archival, because it hands you a free, built-in preservation trick: before a VOD hits its retention limit, convert the parts you care about into Highlights, and Twitch keeps them indefinitely at no cost beyond a few clicks.

That said, “Twitch keeps it indefinitely” is a promise from the same company that deletes your VODs on a two-week timer. Platforms change policies, get acquired, and sunset features with about ten days' notice — we have watched it happen to entire products. A Highlight that lives only on Twitch is still a single point of failure. Treat Highlights and Clips as a convenient staging area, not as your archive. The archive is the copy on your own disk, the way a ROM on your own SD card is the real backup and the cloud is just a mirror. If you are already building a local library, the same discipline applies whether the files are broadcasts or the thousands of games people cram onto a Miyoo Mini Plus microSD.

The Scale of What's Vanishing

The numbers explain why this is not a niche power-user concern. TwitchTracker's 2026 statistics counted 6,254,562 active streamers in June 2026 and 1,997,256 average concurrent viewers that same month; in January 2026 the concurrent average was higher still at 2,124,774, and July 2026 alone logged 203,963,934 hours watched. Business of Apps estimates Twitch pulled in roughly $1.8 billion in revenue in 2024 and averaged 2.37 million concurrent viewers across that year. One widely cited industry estimate puts the platform at 35 million-plus daily active viewers and 7.5 million-plus monthly streamers.

Add it up and you have millions of creators producing an ocean of video every single day, nearly all of it scheduled for automatic deletion inside two weeks. The download question is not a fringe curiosity; it is the default condition of the largest live-streaming platform on Earth. The table below is the whole retention picture in one glance.

Content typeRetention (2026)Expires?Best archival move
Regular VOD14 daysYesDownload immediately after the stream
Partner / Affiliate VOD60 daysYesDownload within the 60-day window
HighlightIndefiniteNoConvert VOD segments to Highlights, then still back them up
Clip (5–60s)IndefiniteNoGrab locally with yt-dlp anyway
Live broadcast (storage off)NoneInstantlyEnable “Store past broadcasts” first

Prerequisites: Versions, Hardware, Access

Before the first download, get the toolchain and the disk in order. The good news is that everything here is free and open-source; the only thing you will spend is disk space and, on your first chat render, a little patience.

Software You Need

Four pieces of software cover every scenario in this guide. Install all four now and you will never have to stop mid-archive to fetch a missing dependency.

You will also need a browser you are logged into Twitch with (Firefox or any Chromium variant), because subscriber-only and unlisted VODs require your session cookies to download.

Hardware and Disk Budget

Downloading is cheap on hardware; storing and rendering are not. Twitch caps 1080p60 ingest near 6,000 kbps constant bitrate, which works out to roughly 2.6–2.7 GB per hour. A four-hour broadcast therefore lands around 10–11 GB as a raw VOD. Archive a channel that streams daily and you are talking multiple terabytes a year — plan the disk accordingly, and prefer a spinning-rust archive drive over burning SSD write cycles on cold storage.

Chat rendering is the one genuinely demanding step. TwitchDownloaderCLI rasterizes every message, emote, and badge frame by frame, which is CPU-bound and memory-hungry on a long, busy chat. Eight gigabytes of RAM is a floor; 16 GB is comfortable. A four-hour render can occupy a modern six-core CPU for a while, so it is the one task worth kicking off before you make coffee. If your machine is already choking, the fix is the same boring discipline that keeps any console healthy — the digital equivalent of a PS5 cache clear: close the browser tabs, free the RAM, then render.

Account and Access Requirements (and the Law)

The Machine knows the law, so here it is plainly. Archiving your own broadcasts is squarely legitimate — Twitch itself provides a creator-side download button for exactly this, and the content is yours. Downloading someone else's VOD or clip is a different animal: it can run against Twitch's Terms of Service and, depending on what you do with it, copyright law. Backing up a stream you appeared in, or a clip for personal reference, sits in the ordinary gray zone most platforms tolerate; re-uploading another creator's full broadcast as your own does not. Stick to your own content or get permission, and you never have to think about it again.

For access: your own subscriber-only or unlisted VODs need you to be logged in, which we handle later with browser cookies. Highlights and the Creator Dashboard download require broadcaster access to the channel. Clips are public and need no authentication at all.

How Twitch Actually Stores Your Video

Every download tool in this guide is doing the same underlying thing, and understanding it turns troubleshooting from guesswork into diagnosis. When a command fails, knowing what it was trying to do tells you exactly where it broke.

HLS, M3U8, and Segment Files

Twitch delivers video over HLS — HTTP Live Streaming. A VOD is not a single file sitting on a server waiting for a right-click. It is a playlist: an .m3u8 manifest that points at a long sequence of short .ts segment files, each a few seconds of video, published at several quality renditions (source, 1080p60, 720p60, 480p, and so on). This is precisely why 2026 download guides describe the method as “extracting the stream's media URL or segment files” — there is no monolithic MP4 to grab. Downloading a VOD means fetching the manifest, choosing a rendition, pulling every segment in order, and concatenating and muxing them into one playable file.

yt-dlp and TwitchDownloader both automate this entire dance. They resolve the manifest, enumerate the segments, download them in parallel, and hand the result to ffmpeg to stitch. When you see a progress bar counting fragments, that is the segment list being walked. When a download resumes cleanly after an interruption, that is the tool remembering which .ts files it already has.

VODs vs Clips vs Highlights, by URL

Each format has a distinct URL shape, and reading the URL tells the tool — and you — what you are dealing with:

Extracting that numeric ID or slug is the first practical move in any download, and every command below keys off it.

Why the Media URL Is the Key

Twitch's own help documentation frames on-demand downloads as a creator-side feature tied to stored past broadcasts — there is deliberately no universal viewer download button. Third-party tools exist precisely to reconstruct the manifest fetch that Twitch declines to expose as a click. Once a tool has the VOD ID, it asks Twitch's API for the access token and the .m3u8 URL, then proceeds exactly as the platform's own player would when it streams the replay to your browser. Nothing here is exotic; it is the same HLS handshake that happens every time you scrub a VOD timeline — the tools just save the result instead of throwing it away.

Installing yt-dlp, ffmpeg, and TwitchDownloader

Install once, archive forever. The commands below cover Linux, macOS, and Windows. Pick the block for your platform, run it, and verify each tool prints a version number before moving on.

Installing yt-dlp

The standalone binary is the most reliable route because it bundles its own Python and never fights with your system packages. On Linux and macOS you can drop it straight into your path; on Windows, use the package manager. If you prefer to manage it as a Python package, the pip route works on any OS with Python 3.9 or newer.

# Linux / macOS — standalone binary
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

# macOS via Homebrew (pulls ffmpeg too)
brew install yt-dlp ffmpeg

# Windows via winget
winget install yt-dlp.yt-dlp

# Any OS via pip (needs Python 3.9+)
python3 -m pip install -U "yt-dlp[default]"

# Confirm it works
yt-dlp --version

Make a habit of yt-dlp -U (or re-running the pip upgrade) before a big archival session. Twitch changes its internals often enough that a downloader more than a few weeks old can simply stop working, and the yt-dlp maintainers ship extractor fixes fast — usually within days of a breakage.

Installing ffmpeg

Homebrew and most Linux repos install ffmpeg alongside yt-dlp, so you may already have it. If not, fetch a build and put it on your PATH. yt-dlp will find it automatically once it is there.

# Debian / Ubuntu
sudo apt update && sudo apt install -y ffmpeg

# Fedora
sudo dnf install -y ffmpeg

# Windows via winget
winget install Gyan.FFmpeg

# Verify — want 6.0 or newer
ffmpeg -version

If yt-dlp ever warns that it cannot find ffmpeg, it will still download the raw fragments but leave you with a video-only file and a separate audio file. That is the tell that ffmpeg is missing or not on your PATH.

Installing TwitchDownloaderCLI

TwitchDownloaderCLI ships as a single self-contained executable per platform from the project's Releases page — no installer, no runtime hunt. Download the archive for your OS, extract it, and mark it executable. On Linux and macOS that is two commands; on Windows the extracted .exe runs as-is.

# Linux / macOS — after downloading the release archive
unzip TwitchDownloaderCLI-*-Linux-x64.zip
chmod +x TwitchDownloaderCLI

# Sanity check — prints usage
./TwitchDownloaderCLI --help

The self-contained builds need nothing else installed. If you deliberately chose a framework-dependent build to save disk, install the .NET 8 runtime first or the binary will refuse to start. With all four tools reporting versions, you are ready to actually download something.

Downloading a VOD in 12 Steps

This is the core workflow. Twelve steps, each with the reason it exists, because a step you understand is a step you can adapt when your situation differs slightly from the example. Start-to-finish this takes about 30 minutes the first time — most of which is the download itself running unattended — and a couple of minutes of your attention thereafter. If you would rather follow a tighter companion checklist, our 12-step VOD-and-chat walkthrough condenses the same procedure.

Steps 1–4: Find, Confirm, Authenticate, Probe

  1. Confirm the VOD still exists and is stored. Open the channel's Video Producer or the public videos page and verify the broadcast is there and inside its retention window (14 days regular, 60 for Partner/Affiliate). Rationale: every later step is wasted effort against a VOD Twitch has already purged, and the failure mode — a 404 — looks like a tool bug when it is really an expired file.
  2. Copy the VOD URL and note the numeric ID. The URL looks like twitch.tv/videos/2314567890; the trailing number is the ID that TwitchDownloaderCLI wants directly. Rationale: yt-dlp accepts the full URL, but the raw ID is what you will paste into the chat tools later, so capture it now and avoid a second trip.
  3. Update yt-dlp. Run yt-dlp -U (or the pip upgrade). Rationale: Twitch's HLS and API shift frequently; an out-of-date extractor is the most common cause of a download that worked last month and fails today.
  4. Probe the available formats. Ask yt-dlp what renditions the manifest actually offers before committing to a download.
yt-dlp -F "https://www.twitch.tv/videos/2314567890"

Expected output is a table of formats. Rationale: picking a format that does not exist is the source of the dreaded Requested format is not available error, and probing first turns that guess into a fact:

[twitch:vod] 2314567890: Downloading stream metadata JSON
[info] Available formats for 2314567890:
ID       EXT  RESOLUTION FPS │  FILESIZE   TBR PROTO │ VCODEC        ACODEC
────────────────────────────────────────────────────────────────
audio_only aac  audio only     │ ~ 110MiB  128k  hls  │ audio only    mp4a.40.2
160p       mp4  284x160    30  │ ~ 210MiB  478k  hls  │ avc1.4D401F   mp4a.40.2
480p       mp4  852x480    30  │ ~ 690MiB 1570k  hls  │ avc1.4D401F   mp4a.40.2
720p60     mp4  1280x720   60  │ ~1.8GiB  4200k  hls  │ avc1.4D401F   mp4a.40.2
1080p60    mp4  1920x1080  60  │ ~2.6GiB  6000k  hls  │ avc1.640028   mp4a.40.2  (source)

Steps 5–8: Authenticate, Select, Name, Download

  1. Decide whether you need authentication. If the VOD is public, skip ahead. If it is subscriber-only or unlisted, yt-dlp needs your logged-in session, which it reads straight from your browser's cookie jar. Rationale: without cookies, a gated VOD returns HTTP 403 and no amount of retrying fixes it.
  2. Choose your format string. For most archives, bestvideo+bestaudio/best pulls the highest video and audio and muxes them, falling back to the best single stream if separate ones are not offered. Rationale: Twitch's “source” rendition is the untranscoded original; anything less throws away quality you cannot recover later.
  3. Design your output filename template. A good template embeds uploader, date, title, and ID so your archive is self-describing years from now. Rationale: vod.mp4 tells you nothing in a folder of 300 files; 2026-08-02 - Blind Elden Ring Run .mp4 tells you everything.
  4. Run the download. Combine the above into one command.
# Public VOD, best quality, self-describing filename
yt-dlp -f "bestvideo+bestaudio/best" \
  --concurrent-fragments 8 \
  -o "%(uploader)s/%(upload_date>%Y-%m-%d)s - %(title)s [%(id)s].%(ext)s" \
  "https://www.twitch.tv/videos/2314567890"

# Subscriber-only or unlisted — borrow cookies from your browser
yt-dlp --cookies-from-browser firefox \
  -f "bestvideo+bestaudio/best" \
  -o "%(uploader)s/%(upload_date>%Y-%m-%d)s - %(title)s [%(id)s].%(ext)s" \
  "https://www.twitch.tv/videos/2314567890"

The --concurrent-fragments 8 flag downloads eight HLS segments at once instead of one at a time, which on a decent connection is the difference between a real-time crawl and pulling a four-hour VOD in a fraction of its runtime.

Steps 9–12: Watch, Verify, Mux, Archive

  1. Watch the fragment counter. yt-dlp prints a running percentage and fragment count. Rationale: a stall at a specific fragment (rather than steady progress) points at a network or rate-limit issue you can address now, not after an hour of wasted wall-clock.
  2. Let the merge finish. After the last fragment, yt-dlp hands off to ffmpeg to mux video and audio; the progress bar may sit at 100% for a moment during this. Rationale: killing the process here leaves you with .part or separate .f303/.f251 files instead of a finished MP4.
  3. Verify the file plays and has audio. Open the result, scrub to the middle and the end. Rationale: a file that opens is not necessarily complete; scrubbing to the end confirms the full segment list downloaded, and checking audio catches muted stretches (covered in pitfalls) while you can still act.
  4. Move it to cold storage. Copy the finished MP4 to your archive drive or NAS. Rationale: the point of all this was to escape a single point of failure; a lone copy on your working SSD is one drive failure away from being no better than Twitch's expired VOD.

That is the complete VOD workflow. Everything else in this guide — clips, chat, automation — is a variation on these same twelve moves.

Downloading Clips and Highlights

Clips and Highlights do not expire, which tempts people into complacency. Resist it. “Does not expire” is a policy, not a law of physics, and policies change. Back them up like everything else.

Clips: The 5–60 Second Format

A clip is a public, short-form excerpt — anywhere from 5 to 60 seconds — and it is the easiest thing on Twitch to download because it needs no authentication and is small enough to grab in seconds. Point yt-dlp at the clip URL and give it a sensible filename:

yt-dlp -o "%(uploader)s - %(title)s [%(id)s].%(ext)s" \
  "https://clips.twitch.tv/GentleTangible---SomeClipSlug"

Clips are also the platform's most durable native sharing format, which makes them the natural currency for game-moment highlights — the perfect combo, the frame-one parry, the run that ended in disaster. Because they never expire, a channel can accumulate thousands over the years, which is exactly why the batch approach below matters.

Highlights: Curated and Permanent

A Highlight is a broadcaster-curated segment lifted out of a VOD and kept permanently. Mechanically it is served like a VOD under a /videos/<id> URL, so you download it with the exact same command from the previous section — no special handling. The strategic point is the reverse direction: creating Highlights from a VOD before its retention window closes is the cheapest possible preservation, because Twitch then stores them for you at no cost. Download the Highlight for your own archive, and you have belt and suspenders — a local copy and a hosted one.

Batch-Grabbing a Channel's Clips

yt-dlp can enumerate and download many clips or VODs from a channel's listing pages in one invocation. Behavior here shifts as Twitch changes its site, so treat this as a starting point and check the output count against what the channel actually has:

# Archive a channel's stored broadcasts (newest first)
yt-dlp --download-archive downloaded.txt \
  -o "%(uploader)s/%(upload_date>%Y-%m-%d)s - %(title)s [%(id)s].%(ext)s" \
  "https://www.twitch.tv/CHANNELNAME/videos?filter=archives&sort=time"

# Grab a channel's clips listing
yt-dlp --download-archive downloaded.txt \
  -o "clips/%(uploader)s - %(title)s [%(id)s].%(ext)s" \
  "https://www.twitch.tv/CHANNELNAME/clips"

The --download-archive flag records every ID it completes, so re-running the command later skips what you already have and only fetches new material — the foundation of the automation section further down. Preserving a whole channel's back catalogue this way is the streaming equivalent of dumping a shelf of cartridges in one sitting, the job our Retrode cart-dumping guide tackles for physical media.

Downloading and Rendering Chat

A Twitch VOD without its chat is half a document. The chat is the community reaction — the timing, the memes, the collective gasp — and it is stored and retrieved completely separately from the video. This is where yt-dlp bows out and TwitchDownloaderCLI takes over.

Why Chat Is a Separate Download

Twitch chat replay is not baked into the video stream; it is a separate timestamped data feed that the player overlays during playback. That means it is a distinct download with its own tooling, and it means chat can outlive or predecease the video independently. Grabbing chat as structured data (JSON) rather than a rendered video first is the right instinct, because JSON is future-proof — you can re-render it at any resolution, restyle it, or parse it for analysis years later, long after any particular video file's format has aged.

TwitchDownloaderCLI for Chat JSON

Download the raw chat for a VOD by its numeric ID. The JSON captures every message, timestamp, username, badge, and emote reference:

# Download the full chat as JSON
./TwitchDownloaderCLI chatdownload --id 2314567890 -o chat.json

# Expected tail of the run:
# [STATUS] - Downloading 100%
# [STATUS] - Finished. Chat downloaded to chat.json

Keep that chat.json next to the VOD in your archive. It is small — kilobytes to a few megabytes even for a marathon stream — and it is the master copy from which every rendered version is generated.

Rendering Chat to Video

When you want a watchable chat overlay — to composite beside the gameplay, or to relive the stream with reactions intact — render the JSON to a video. This is the CPU-heavy step flagged in the prerequisites, so size the resolution and framerate to what you actually need:

# Render chat.json to a 340px-wide overlay video at 30fps
./TwitchDownloaderCLI chatrender -i chat.json \
  -h 1080 -w 340 \
  --framerate 30 \
  --font-size 18 \
  --update-rate 0.2 \
  -o chat.mp4

Here -h and -w set the overlay dimensions, --framerate trades smoothness against render time, and --font-size tunes legibility. Render once at a sane framerate; there is no prize for a 60fps chat column, and 30fps halves the wait. From here you can drop chat.mp4 onto a timeline in any editor beside the VOD, and you have reconstructed the full Twitch experience from two files that Twitch itself would have deleted.

The No-Terminal Creator Dashboard Method

Not everyone wants a command line, and for your own broadcasts you do not strictly need one. Twitch provides a first-party download path — it is just buried, quality-limited, and slow compared to yt-dlp. For a one-off save it is perfectly fine.

Video Producer and the Three-Dot Menu

The official creator workflow in 2026 is unchanged and lives entirely in the dashboard. As the broadcaster, go to Creator Dashboard → Content → Video Producer. You will see a list of your past broadcasts, each within its retention window. Beside any one of them, click the three-dot menu and choose Download. Twitch prepares an MP4 and hands it to your browser. Rationale for using it at all: it is authenticated by definition (you are logged into your own dashboard), so it sidesteps the cookie dance entirely for private VODs.

The catch is that the dashboard download is a single-file transfer of the transcoded VOD, without the parallel-fragment speed of yt-dlp, and it gives you no control over format or naming. For one video it is fine; for archiving a channel it is a chore, which is the whole reason the terminal tools exist.

Highlighting Before the Clock Runs Out

The dashboard's more valuable trick is not downloading — it is Highlighting. Inside Video Producer you can open a past broadcast, mark in and out points, and save the segment as a Highlight, which then never expires. Do this to the moments you care about before the 14- or 60-day window closes, and you have converted disposable video into permanent video for free. Then download the Highlight at your leisure. This two-step — Highlight now, download later — is the safety net for anyone who cannot always grab a full VOD the day it airs.

Exporting to YouTube

Video Producer can also export a VOD or Highlight straight to a connected YouTube account. This is not a substitute for a local archive — you are trading one platform's retention policy for another's content-ID and takedown regime — but as a second hosted mirror it costs nothing and adds redundancy. Just remember that muted-audio segments (below) travel with the export, and YouTube's own copyright system may mute or block further, so the export is a convenience, not a preservation guarantee.

Common Pitfalls and How to Fix Them

Every one of these has cost someone an archive. Read them before your first big pull, not after.

Muted Audio and Subscriber Gates

Muted segments are permanent and server-side. When Twitch's system detects copyrighted music in a broadcast, it mutes that stretch of audio on Twitch's servers. By the time you download, the mute is already baked in — no yt-dlp flag, no TwitchDownloader option, and no ffmpeg incantation restores audio that Twitch removed before it ever reached you. The only real fix is upstream: do not play flagged music on stream. If a VOD you are archiving has muted stretches, that is a fact about the source, not a failure of your download.

Subscriber-only and unlisted VODs return 403 without cookies. The fix is --cookies-from-browser firefox (or chrome, edge, etc.). If it still fails, make sure the browser is fully closed so the cookie database is not locked, and that you are actually logged into the account with access.

Rate Limits, Throttling, and Bot Checks

Aggressive parallelism gets you throttled. Twitch will slow or temporarily block a client hammering it with too many simultaneous requests. If speeds collapse mid-download or you hit a Sign in to confirm you're not a bot wall, dial --concurrent-fragments down, pass your cookies so you look like a logged-in human, and avoid running the pull through a shared VPN exit node that Twitch may already have flagged. Patience beats a ban.

Filenames with emojis or slashes break the write. Stream titles are full of emoji, colons, and slashes that are illegal in filenames on some systems. Add --restrict-filenames to sanitize them, or --trim-filenames 200 to cap absurdly long titles before your filesystem rejects them.

The Expired-VOD Trap and the Half-Merge

The most common “bug” is not a bug. A Video unavailable or 404 usually means the VOD already passed its 14- or 60-day retention and Twitch deleted it. No tool downloads a file that no longer exists. The only prevention is grabbing content inside the window — which is the entire thesis of this article.

Do not kill the process at 100%. The final pause is ffmpeg muxing video and audio into the MP4. Interrupt it and you are left with orphaned .part or separate video/audio files. If that happens, do not panic — the fragments are on disk, and simply re-running the same yt-dlp command will resume and complete the merge rather than starting over.

Troubleshooting Table

When something breaks, match the symptom to the table, apply the fix, and re-run. Most failures fall into one of these ten buckets.

Error Messages and Fixes

SymptomLikely causeFix
HTTP Error 403: ForbiddenSubscriber-only / unlisted VOD, no sessionAdd --cookies-from-browser firefox with a logged-in account
Audio silent in stretchesDMCA muted segments, server-sideNothing client-side restores it; the mute predates your download
Video unavailable / 404VOD passed 14/60-day retentionToo late — the file is gone from Twitch; grab future VODs sooner
Download stalls at 100%ffmpeg merge step running or missingEnsure ffmpeg is on PATH; let the mux finish; re-run to resume
Requested format is not availableQuality label does not match a real renditionRun yt-dlp -F <url> first and pick a listed format ID
Speeds crawl / throttledSingle-fragment download or rate limitAdd --concurrent-fragments 8; if flagged, lower it and add cookies
Chat render crashes or eats all RAMHuge chat, high framerate, stale buildLower --framerate and resolution; update TwitchDownloaderCLI
Sign in to confirm you're not a botIP flagged or no authenticationPass cookies, slow down, avoid shared VPN exit nodes
Filename invalid / too longEmojis, slashes, or a giant titleAdd --restrict-filenames or --trim-filenames 200
A URL that worked last month now errorsTwitch changed its API or HLS layoutUpdate the tool: yt-dlp -U — extractor fixes ship within days

Reading yt-dlp's Verbose Output

When the table does not cover it, add -v to any yt-dlp command. The verbose log shows the exact extractor stage that failed — metadata fetch, format resolution, fragment download, or merge — which tells you whether the problem is authentication (fix with cookies), a Twitch-side change (fix with an update), or a local ffmpeg issue (fix your PATH). Ninety percent of “it just doesn't work” reports resolve the moment someone actually reads the verbose output instead of the last line.

When to Fall Back to TwitchDownloader

If yt-dlp genuinely cannot fetch a VOD — usually right after a Twitch-side change, in the day or two before the extractor is patched — try TwitchDownloaderCLI's videodownload --id <id> as a second opinion. The two tools resolve Twitch's streams through slightly different paths, so one often works when the other stumbles. Keeping both installed is cheap insurance against a single broken extractor stranding you inside a retention window.

Advanced Tips: Batching and Automation

Once the manual workflow is second nature, the goal is to stop doing it manually. The 14-day clock does not care whether you remembered; automation does the remembering for you.

Archiving an Entire Channel on a Schedule

The --download-archive flag is the key to unattended archiving. It writes every completed video ID to a text file and consults that file on each run, so a scheduled job only ever fetches new broadcasts. Combined with a channel's videos URL, one command becomes a self-maintaining mirror:

yt-dlp \
  --download-archive "$HOME/twitch-archive/seen.txt" \
  --cookies-from-browser firefox \
  -f "bestvideo+bestaudio/best" \
  --concurrent-fragments 8 \
  -o "$HOME/twitch-archive/%(uploader)s/%(upload_date>%Y-%m-%d)s - %(title)s [%(id)s].%(ext)s" \
  "https://www.twitch.tv/CHANNELNAME/videos?filter=archives&sort=time"

Cron Jobs and Scheduled Pulls

Wrap that command in a script and schedule it to run daily, well inside the retention window. On Linux or macOS, a cron entry running every night at 3 a.m. keeps a channel fully mirrored with zero human involvement:

# crontab -e  — run the archive script nightly at 03:00
0 3 * * * /home/you/bin/twitch-archive.sh CHANNELNAME >> /home/you/twitch-archive/log.txt 2>&1

The rationale is simple: retention deletion is a scheduled process on Twitch's side, so your preservation should be a scheduled process on yours. A daily job against a 14-day window gives you thirteen chances to catch every VOD before it is purged — enormous margin for a machine that never forgets.

Metadata, Thumbnails, and Naming

An archive is only as good as its ability to be searched later. Have yt-dlp embed metadata and write a sidecar JSON so each file carries its own provenance — title, date, uploader, duration, and the original ID — baked in. Ten years from now, --embed-metadata --write-info-json is the difference between a browsable library and a pile of anonymous MP4s. Pair a strict, sortable naming template (%(upload_date>%Y-%m-%d)s leading each filename) with embedded metadata and your archive stays navigable at any scale.

The Complete Working Configuration

Everything above, consolidated. Drop the config file into place, save the script, and your archival setup is a two-command affair from then on.

The yt-dlp Config File

yt-dlp reads a persistent config file so you never retype flags. On Linux and macOS it lives at ~/.config/yt-dlp/config; on Windows at %APPDATA%\yt-dlp\config.txt. This one encodes every good default from this guide:

# ~/.config/yt-dlp/config — sensible Twitch-archival defaults
-f "bestvideo+bestaudio/best"
--concurrent-fragments 8
--retries 10
--fragment-retries 20
--file-access-retries 5
--merge-output-format mp4
--embed-metadata
--embed-thumbnail
--write-info-json
--restrict-filenames
--no-mtime
-o "%(uploader)s/%(upload_date>%Y-%m-%d)s - %(title)s [%(id)s].%(ext)s"

A Full Archive Script

This script archives a channel's video and chat in one pass, skipping anything already downloaded. Save it as twitch-archive.sh, make it executable, and point cron at it:

#!/usr/bin/env bash
set -euo pipefail

CHANNEL="${1:?usage: twitch-archive.sh CHANNELNAME}"
ROOT="$HOME/twitch-archive"
SEEN="$ROOT/seen.txt"
DEST="$ROOT/$CHANNEL"
mkdir -p "$DEST"

# 1) Pull any new stored broadcasts as MP4
yt-dlp \
  --download-archive "$SEEN" \
  --cookies-from-browser firefox \
  -o "$DEST/%(upload_date>%Y-%m-%d)s - %(title)s [%(id)s].%(ext)s" \
  "https://www.twitch.tv/$CHANNEL/videos?filter=archives&sort=time"

# 2) For each downloaded MP4, grab chat JSON if we don't have it yet
for mp4 in "$DEST"/*.mp4; do
  [ -e "$mp4" ] || continue
  id=$(basename "$mp4" | sed -n 's/.*\[\([0-9]\{6,\}\)\].*/\1/p')
  [ -n "$id" ] || continue
  chat="$DEST/${id}-chat.json"
  if [ ! -e "$chat" ]; then
    ./TwitchDownloaderCLI chatdownload --id "$id" -o "$chat"
  fi
done

echo "Archive pass complete for $CHANNEL"

Verifying Your Archive

Trust, then verify. After a run, spot-check that each MP4 opens and plays to the end, that its sidecar -chat.json exists and is more than a few bytes, and that the seen.txt line count roughly matches the number of files on disk. A one-line integrity sweep with ffmpeg catches truncated downloads that a casual glance misses:

# Flag any MP4 that ffmpeg can't fully decode (truncated / corrupt)
for f in "$HOME/twitch-archive"/**/*.mp4; do
  ffmpeg -v error -i "$f" -f null - 2>>archive-errors.log \
    && echo "OK   $f" || echo "BAD  $f"
done

An empty archive-errors.log means every file decoded cleanly end to end. That is the whole game: a verified local copy that outlives Twitch's timer, its retention policy, and whatever the platform decides to do next. Twitch built a system that deletes your work by default. With four free tools and one config file, you have built one that keeps it by default instead — which, for anyone who takes preservation seriously, is the only acceptable default there is.

Questions the search bar asks me

How long before Twitch deletes my VOD?
Regular accounts keep past broadcasts for 14 days; Partners and Affiliates get 60 days, per Twitch's Video on Demand policy. Highlights and clips never expire. So download or convert to a Highlight before the window closes — there is no restore-from-trash once it purges.
Is downloading Twitch VODs legal?
Archiving your own broadcasts is squarely legitimate — Twitch even provides a creator-side download button in Video Producer. Downloading someone else's content can breach Twitch's Terms of Service and copyright law, so stick to your own VODs or get permission before saving another creator's work.
Should I use yt-dlp or TwitchDownloader?
Use both. yt-dlp is fastest for pulling VOD and clip video at source quality, while lay295's TwitchDownloaderCLI is the standard for downloading chat as JSON and rendering it to an overlay video. Keeping both installed also means one usually works when a Twitch-side change temporarily breaks the other.
Why is part of my downloaded VOD muted?
Twitch mutes audio server-side when its system detects copyrighted music, so the mute is baked in before the file ever reaches you. No yt-dlp flag, ffmpeg command, or TwitchDownloader option restores it. The only prevention is not playing flagged tracks on stream in the first place.
Can I download a Twitch VOD without the terminal?
Yes, if it is your own broadcast. Go to Creator Dashboard → Content → Video Producer, click the three-dot menu beside a past broadcast, and choose Download. Viewers get no universal download button — Twitch frames downloads as a creator-side feature — which is exactly why third-party tools like yt-dlp exist.
Ben Aronoff — Hardware & Preservation Correspondent
Ben Aronoff
HARDWARE & PRESERVATION CORRESPONDENT

Ben covers the hardware end of retro gaming: FPGA cores, real-cartridge dumping, capture setups, CRT vs scaler workflows, and the legal and physical preservation infrastructure that keeps old games playable. Every post under this byline is reviewed pre-publish by Sam P., Editor & Operator — corrections to info@instalinkoteam.com. Published 2026-08-07 · Last updated 2026-08-07. Full bios on the author page.

MORE FIELD NOTES

PS5 vs PS4 2026: 5.6x Faster GPU, Yet Still Outsold9 MIN READ · BY JORDAN VALEPS5 Cache Clear 2026: Option 6 in 12 Steps, 10 Min7 MIN READ · BY THE MACHINETwitch VOD Download 2026: 12 Steps, 15-Min Setup11 MIN READ · BY JORDAN VALETwitch Studio 2026: Dead — Migrate to OBS in 12 Steps8 MIN READ · BY NINA VELASQUEZPS Remote Play 2026: 13-Step Setup, 1080p in 20 Min7 MIN READ · BY JORDAN VALEPS Remote Play 2026: 1080p HQ in 12 Steps, 30 Min13 MIN READ · BY NINA VELASQUEZ