STARESBACK.GG
LV 1
0 XP

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

Twitch Download 2026: Save a VOD in 12 Steps, 20 Min

BY·EDITED BYSAM P.·2026-07-12·7 MIN READ·4,499 WORDS·EDITORIAL PROCESS
Twitch Download 2026: Save a VOD in 12 Steps, 20 Min — STARESBACK.GG blog

Twitch is a broadcaster, not a library, and it has never pretended otherwise. The distinction is buried in the storage settings and spelled out in the Terms of Service, but it is absolute: the six-hour tournament final you streamed on Tuesday is sitting on a deletion timer, and depending on your account tier that timer is measured in days. Miss the window and the footage is gone — not archived, not cold-stored, not recoverable by support ticket. Gone.

So twitch download is not really a search for a button. It is a race against a clock you did not set, using tools Twitch did not build, to keep footage Twitch would rather stopped costing it money. This tutorial covers the three tools that actually do the job in 2026 — TwitchDownloader 1.56.4, yt-dlp, and Streamlink — plus the sanctioned route for your own content, the legal lines worth knowing before you cross them, and the specific ways each method breaks. It is the same preservation instinct that drives people to dump their SNES carts before the save batteries die: if you want it to exist next year, you take it off the fragile thing yourself.

The 7-Day Clock: Why This Is a Race

Before any command line, understand the deadline, because it dictates everything downstream. Twitch stores your past broadcasts — the automatic recordings of your live streams — for a fixed window and then destroys them. This is not a bug or a quota you can pay to raise on a normal account; it is the product working as designed.

Retention is a tier, not a promise

The retention window is a function of your account status, and the gap between tiers is enormous. Per Twitch's own On-Demand Content documentation, the current windows are:

Account tierVOD retentionNotes
Standard broadcaster7 daysThe default; most accounts
Twitch Affiliate14 daysAuto-enrolled after milestones
Partner / Prime / Turbo60 daysThe only long window
Highlights + UploadsUntil 100h capShared storage limit (Apr 19, 2025)
ClipsNo timerDies with the channel

There is a prerequisite hiding in that table that catches thousands of streamers: you must have "Store Past Broadcasts" enabled before the stream airs. If that toggle was off, there is no VOD at all — nothing to download, nothing to recover. The clock only counts down on recordings that were made in the first place.

The 100-hour Highlights purge

Highlights and Uploads used to be the escape hatch: clip a permanent Highlight from a VOD and it lived forever. That ended on April 19, 2025, when Twitch imposed a single 100-hour combined storage limit across all Highlights and Uploads, published or not. Channels over the cap were warned in February 2025 and then had content auto-deleted, starting with the least-viewed Highlights, until they fell under the line — as TechCrunch reported at the time. Twitch framed it as a cost measure affecting under 0.5% of active channels and under 0.1% of hours watched. True or not, the lesson is the same: even the "permanent" tier is now finite. The only genuinely durable copy is the one on your own disk.

What the law actually says

Here is where the deadpan gets specific. Downloading is a contract question before it is a copyright one. The Twitch Terms of Service prohibit "any data mining, robots, or similar data gathering or extraction methods" and any downloading of the service "except page caching" unless expressly permitted. Translation: pulling your own VOD through the Download button is sanctioned; scraping a stranger's VOD with a third-party tool is a breach of the agreement you clicked through. That is not the same as piracy — the footage is still the creator's copyrighted work, and re-uploading it is a separate DMCA problem — but do not tell yourself the tools below are blessed. They are tolerated, not endorsed, and Twitch periodically changes its API specifically to make them stop working.

Prerequisites: Runtimes, Versions, Disk

This is a tutorial, so it comes with a parts list. Skipping it is how you end up three fragments into a 14 GB download watching it fail. Everything here is free and open-source; the only cost is disk and patience.

Software versions you actually need

Pin these. Running a stale build against Twitch's moving API is the number-one cause of "it worked last month" failures.

ToolVersion (mid-2026)RuntimePlatforms
TwitchDownloader1.56.4 (Feb 4, 2026).NET 10GUI: Windows; CLI: Win/Linux/macOS
yt-dlplatest (self-updating)Python 3.9+Win/Linux/macOS
Streamlink8.xPython 3.9+Win/Linux/macOS
FFmpeg6.x or newernativebundled by TwitchDownloader
Python3.9+nativefor pip installs

A note on the headline tool: TwitchDownloader 1.56.4 shipped on February 4, 2026 and moved the whole project to .NET 10. The GUI is a Windows-only WPF application; the CLI (TwitchDownloaderCLI) is fully cross-platform. If you are on Linux or macOS, the GUI is not for you — you will live in the CLI, which is arguably the better tool anyway. FFmpeg is required for muxing, and TwitchDownloader will fetch its own copy on demand (bundled binaries come from gyan.dev), so you do not strictly need a system install.

Hardware and disk math

Do the arithmetic before you start. Twitch's source bitrate for 1080p60 is roughly 6 Mbps, which is about 2.6-2.7 GB per hour. A six-hour VOD is therefore ~16 GB on disk — and during a download you need that space twice, because fragments land in a temp folder before FFmpeg muxes them into the final MP4. Budget 40-50 GB of free scratch space for a long broadcast and put the temp folder on an SSD. It is the same 1080p bitrate arithmetic that governs a good PS Remote Play 1080p session: the numbers do not care which service is pushing the pixels. Chat rendering is separately CPU-bound — more on that later — so a multi-core machine helps if you plan to bake chat into video.

Accounts, tokens, and cookies

Public VODs need no login. Two cases do: sub-only VODs (footage a streamer gated behind a subscription) and age-gated or private content. For those you must present the credentials of an account that is actually entitled to watch. In practice that means handing yt-dlp your browser cookies (--cookies-from-browser firefox) or handing Streamlink an OAuth header. If you have ever flashed a Batocera image and verified its checksum, you already have the disk-and-verification discipline this whole exercise rewards.

The Toolchain: Three Tools, Three Jobs

There is no single "Twitch downloader," and anyone selling you one $upgrade is selling a wrapper around these three open-source projects. Each is best at a different job. Pick by what you are trying to capture, not by which has the prettiest icon.

TwitchDownloader: VODs and, uniquely, chat

TwitchDownloader by lay295 is the specialist. It is the only mainstream tool that downloads Twitch chat alongside video and can render that chat into a synced overlay video, complete with BTTV, FFZ, and 7TV emotes (static and animated) and Twemoji or Google Noto emoji. If you care about the community reaction as much as the gameplay — and for a lot of retro speedrunning and tournament footage, the chat is the document — this is the tool. Windows users get a GUI; everyone gets the CLI.

yt-dlp: the scriptable workhorse

yt-dlp is the command-line downloader that supports over a thousand sites, Twitch among them. It handles finished VODs, clips, and even in-progress live streams, with a format-selection language worth learning once and using forever. It does not touch chat, and it is not friendly to beginners, but for batch jobs, automation, and "just give me the MP4," nothing beats it. It also self-updates, which matters more than it sounds.

Streamlink: catching it live

Streamlink is for footage that does not exist yet. It pulls a live stream — the one airing right now — and either pipes it to a player or records it straight to disk. This is your only option when a streamer has "Store Past Broadcasts" turned off and there will be no VOD at all. Since version 8.0.0 it filters preroll and midroll ads automatically, a change that quietly deprecated the old --twitch-disable-ads flag everyone still searches for.

The Official Route: Your Own VODs

If the content is yours, put the third-party tools down. Twitch provides a sanctioned, ToS-compliant download path, and for your own broadcasts it is faster and safer than anything below. The catch is that it only works for content you own.

The Video Producer download button

Go to your Creator Dashboard → Content → Video Producer. Every past broadcast has a three-dot (⋯) menu; open it and click Download. Twitch hands you an MP4 of your own stream — no tools, no ToS grey area. The one prerequisite, again, is that Store Past Broadcasts was enabled when you streamed — the toggle lives under Creator Dashboard → Settings → Stream. Enabling it does nothing retroactive; it only affects future broadcasts. Turn it on now and thank yourself in seven days.

Export to YouTube without a local copy

If your goal is republishing rather than archiving, connect your YouTube account and use Export from the same three-dot menu. Twitch uploads the VOD to YouTube directly — no local download and re-upload round trip. It is the correct move for creators who just want the highlight reel on another platform, though it gives you no offline master file, which, given the 100-hour purge, is exactly the thing you should actually want.

Why there is no public VOD API

Developers ask constantly: is there an official endpoint to download an arbitrary VOD, the way the Helix API exposes a Clips download URL? The answer, as of mid-2026, remains no. Twitch's public API will list your videos and their metadata, but it will not hand you the video file. That deliberate gap is the entire reason tools like TwitchDownloader have to reverse-engineer Twitch's internal GraphQL calls — and the entire reason they break whenever Twitch rotates a query hash.

TwitchDownloader: A VOD in 12 Steps

This is the reference walkthrough, GUI edition, on Windows. Each step has a reason, because a tutorial that just says "click Download" is useless the moment something deviates. Linux and macOS users: read this for the logic, then jump to the CLI equivalents in the config section.

Before you start

You need the 1.56.4 build, a scratch drive with room to spare, and FFmpeg reachable. Get those three right and the rest is mechanical.

The twelve steps

  1. Confirm your platform and grab the right build. The GUI is Windows-only WPF; the CLI is cross-platform. Rationale: downloading the WPF build on Linux wastes your time — it will not run without a Windows runtime, and the CLI does everything the GUI does.
  2. Download TwitchDownloaderGUI 1.56.4 from the Releases page and unzip to a writable folder — Documents, not Program Files. Rationale: the app is portable and writes its cache next to itself; Program Files permissions cause silent cache-write failures mid-download.
  3. Launch it, open Settings, and set the Temp/cache folder to a fast drive with 40+ GB free. Rationale: fragments are written to temp before muxing, and a long VOD can occupy 15+ GB in flight — a full disk kills the job at 90%.
  4. If it reports FFmpeg missing, fetch it (Settings → get FFmpeg, or run TwitchDownloaderCLI ffmpeg --download). Rationale: muxing TS fragments into MP4 requires FFmpeg; the bundled binary from gyan.dev spares you a PATH fight.
  5. Copy the VOD URL or just the numeric video ID. Rationale: the tool keys off the ID — the number at the end of /videos/NUMBER — so a clean ID avoids tracking-parameter confusion.
  6. Paste it into the VOD Download tab and load the info. Rationale: this verifies the VOD still exists and is reachable with your current auth before you commit disk and bandwidth.
  7. Choose a quality — pick "Source" (the "chunked" rendition) for the original. Rationale: Twitch does not transcode above source, so "Source" is the genuine best; every other option is a downscale of it.
  8. Optionally set trim start/end if you only need a segment. Rationale: trimming saves disk and time — but if you script the CLI equivalent, mind the 1.56.4 change where bare durations are read as mm:ss, not hh:mm.
  9. Set the output filename and folder using streamer + date + ID. Rationale: a name like speedrunner-2026-07-12-1234567890.mp4 is self-sorting when you have 200 of them; "video.mp4" is a future headache.
  10. Set download threads to roughly 10-20. Rationale: parallel fragment fetching saturates your connection, but too many threads trip Twitch rate limits and produce 403 fragment errors — 10 is a safe start.
  11. Click Download and watch the fragment counter, not a percentage. Rationale: progress is per-fragment; a brief stall usually means a transient 403 that the tool silently retries, so do not panic and cancel.
  12. Verify the finished MP4 plays end to end, confirm the duration, then delete the temp cache. Rationale: a truncated mux still plays but ends early; only after the runtime matches the VOD should you trust it and reclaim the scratch space.

The one-line CLI equivalent

The entire dance above is one command outside the GUI:

TwitchDownloaderCLI videodownload --id 1234567890 --quality 1080p60 --threads 12 --output "speedrunner-2026-07-12-1234567890.mp4"

Which is exactly why, once you have done it twice in the GUI, you never open the GUI again.

yt-dlp: The Command-Line Workhorse

For finished VODs and clips, yt-dlp is the tool you will actually keep. It is terse, scriptable, and — critically — self-updating, which keeps it current with Twitch's API churn better than almost anything else.

The one-liner and format selection

At its simplest, hand it a URL:

yt-dlp "https://www.twitch.tv/videos/1234567890"

But you should almost always steer the format. Do not hard-code numeric codes; use the selector language so it resolves against whatever the extractor returns at runtime:

yt-dlp -f "bv*[height<=1080]+ba/b" --merge-output-format mp4 \
  -o "%(uploader)s - %(title)s [%(id)s].%(ext)s" \
  "https://www.twitch.tv/videos/1234567890"

That reads: best video up to 1080p plus best audio, falling back to the best pre-merged stream, muxed to MP4 with a sane filename. The +ba merge step needs FFmpeg on your PATH — without it, yt-dlp leaves two separate files and no combined output. And do not go asking for 4K: as the yt-dlp project tracker notes, Twitch simply does not offer renditions above the streamer's source, so "Source" (the chunked format) is your ceiling.

Cookies for sub-only VODs

Sub-gated footage needs credentials. In 2026 the reliable path is Firefox cookies:

yt-dlp --cookies-from-browser firefox -f "best" \
  "https://www.twitch.tv/videos/1234567890"

Note the browser choice. Chrome has encrypted its cookie store with app-bound encryption since roughly July 2024, which makes it unreadable to yt-dlp; Firefox's store stays readable and works. If you insist on a Chromium browser, export a cookies.txt manually and pass --cookies cookies.txt instead. For throttled connections, --http-chunk-size 10M can sidestep server-side rate limiting.

Expected output

A healthy VOD download looks like this — note the extractor stages, the fragment count, and the final size:

[twitch:vod] Extracting URL: https://www.twitch.tv/videos/1234567890
[twitch:vod] 1234567890: Downloading stream metadata GraphQL
[info] 1234567890: Downloading 1 format(s): chunked
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 2148
[download] Destination: TournamentChannel - Grand Finals .mp4
[download] 100% of 14.62GiB in 00:38:41 at 6.44MiB/s

That 14.62 GiB for a ~6-hour VOD is the 2.6 GB/hour math from the prerequisites section made real. If yours comes out at a fraction of the expected size, the download truncated — check the troubleshooting table.

Everything above assumes a VOD exists. When it does not — because the streamer disabled recordings, or because you want the stream as it airs at full quality — Streamlink is the tool. It treats a live stream as a source and lets you record it to disk in real time.

Record to disk

The core command points Streamlink at a channel, asks for the best quality, and writes it out:

streamlink twitch.tv/somechannel best -o "somechannel-live.ts"

The output lands as a .ts (MPEG transport stream) because that is Twitch's native container and it survives interruptions better than MP4 — if your connection drops mid-record, a TS file is still playable up to the cut. Remux it to MP4 afterward with a stream copy, no re-encode:

ffmpeg -i somechannel-live.ts -c copy somechannel-live.mp4

Codecs, latency, and the ad reality

Two flags materially improve capture quality. --twitch-supported-codecs=h264,h265,av1 unlocks the modern-codec renditions some channels offer, and --twitch-low-latency prefetches HLS segments to cut delay. For sub-only live streams, authenticate with an OAuth header:

streamlink --twitch-low-latency \
  --twitch-supported-codecs=h264,h265,av1 \
  --twitch-api-header="Authorization=OAuth abcd1234yourtokenhere" \
  twitch.tv/somechannel best -o "somechannel-live.ts"

And here is the thing to stop searching for: ad-blocking flags no longer exist. As of Streamlink 8.0.0, preroll and midroll ad filtering is automatic and mandatory — the old --twitch-disable-ads toggle was removed because the behavior is now the default. If a 2023-vintage tutorial tells you to add it, that tutorial is wrong.

The config file

Retyping those flags is masochism. Streamlink reads a config file — ~/.config/streamlink/config on Linux/macOS, %APPDATA%\streamlink\config on Windows — where each flag goes on its own line without the leading dashes:

# ~/.config/streamlink/config
default-stream=best
twitch-supported-codecs=h264,h265,av1
twitch-low-latency
twitch-api-header=Authorization=OAuth abcd1234yourtokenhere
retry-streams=5
retry-max=10

With that in place, streamlink twitch.tv/somechannel -o out.ts inherits every setting. The retry-streams pair is the unsung hero: point it at an offline channel and it will poll every five seconds and start recording the instant they go live — a poor person's scheduled capture.

Chat, Clips, and the Bits People Forget

Video is the obvious payload. But a Twitch broadcast is three documents — video, chat, and clips — and the two non-video ones are where TwitchDownloader earns its keep and where most "downloaders" simply give up.

Downloading and rendering chat

Chat is a first-class artifact. TwitchDownloader's CLI pulls the full chat log as structured JSON (with emotes embedded, if you ask), which you can archive or feed into other tools:

TwitchDownloaderCLI chatdownload --id 1234567890 \
  --embed-images --output "grand-finals-chat.json"

Then, if you want the chat as a synced video overlay — the thing that turns a raw VOD into a watchable document of a moment — render it:

TwitchDownloaderCLI chatrender --input "grand-finals-chat.json" \
  --output "grand-finals-chat.mp4" --framerate 30 --font-size 18

The render supports BTTV, FFZ, and 7TV emotes, animated included, plus Twemoji or Google Noto emoji. It is CPU-bound and slow — dropping to 30 fps and disabling animation is the difference between minutes and an evening.

Clips: the download endpoint that exists

Clips are the easy case, because unlike VODs, Twitch's API actually exposes a clip download URL. Any of the three tools handles them:

yt-dlp "https://clips.twitch.tv/SomeCleverClipSlug"
TwitchDownloaderCLI clipdownload --id SomeCleverClipSlug -o clip.mp4

Remember the caveat from the top: a clip has no expiry timer of its own, but it dies the instant its parent channel is deleted or banned, or its source VOD is removed. A clip is a pointer, not a copy — until you download it.

Why chat is the real archive

Deadpan aside: for a great deal of retro and speedrunning content, the chat is the primary source. The world-record reaction, the backseat corrections, the in-joke that explains why 4,000 people showed up — none of it is in the video track. Archiving chat is the same impulse that makes a curated collection worth more than a random pile, the video equivalent of a hand-tuned Miyoo Mini Plus game list versus a dumped-everything folder. Save the chat. Future-you, or some historian, will care.

Five Pitfalls That Eat Your Afternoon

Every one of these has cost someone hours. None is your fault, exactly — the platform is a moving target — but all are avoidable once you know the shape of them.

The five you will actually hit

  1. "Store Past Broadcasts" was never on. There is no VOD to download because none was recorded. Fix: enable it under Creator Dashboard → Settings → Stream. It only helps going forward — for a stream that already aired without it, your sole option was live capture with Streamlink.
  2. You missed the tier window. A standard-tier VOD is deleted on day 8; no tool resurrects deleted footage. Fix: download inside the 7/14/60-day window, and automate a daily job (see below) so you never rely on remembering.
  3. Everything broke after months of working. Twitch rotated its GraphQL query hashes and your tool's baked-in copies went stale — this is TwitchDownloader issue #1563 in a nutshell. Fix: update the tool. 1.56.4 shipped fresh hashes; for yt-dlp, run yt-dlp -U. A stale build against a moving API is failure by design.
  4. Chrome cookies do nothing for sub-only VODs. Chrome's app-bound cookie encryption (since ~July 2024) blocks extraction entirely. Fix: use --cookies-from-browser firefox, or export a cookies.txt and pass --cookies.
  5. You are hunting for an ad-disable flag that no longer exists. Streamlink 8.0.0+ filters ads automatically and removed --twitch-disable-ads. Fix: stop looking — it already strips preroll and midroll. Passing the dead flag just errors out.

The two that hit scripters

Troubleshooting Table

Symptom-first, because that is how failures arrive. Find the row that matches what you are seeing and work the fix before you start reinstalling things at random.

How to read this table

The middle column is the diagnosis, not the fix — read it to confirm you are looking at the right row, then act on the right column. Most rows are one-shot fixes; the ones that are not point you at an update.

SymptomLikely causeFix
"Unable to find a valid VOD" / HTTP 404VOD expired or deleted, or wrong IDIf past the tier window it is unrecoverable; re-check the numeric ID
Download stalls with repeated HTTP 403sTransient token error or too many threadsDrop threads to 8-10 and retry; fragments auto-retry
Works for public VODs, fails for sub-onlyNo authentication suppliedAdd --cookies-from-browser firefox or --twitch-api-header
yt-dlp: "Requested format is not available"Hard-coded code, or source below requestUse -f "bv*+ba/b"; do not ask 1080p of a 720p source
"ffmpeg not found" / two unmerged filesFFmpeg missing from PATHRun TwitchDownloaderCLI ffmpeg --download, or install FFmpeg
Broke right after a Twitch updateStale GraphQL query hashesUpdate: yt-dlp -U, or newest TwitchDownloader
Chrome cookies ignored or emptyApp-bound cookie encryptionUse a Firefox profile, or export cookies.txt
Streamlink rejects --twitch-disable-adsFlag removed in 8.0.0Delete it; ad filtering is automatic now
Final MP4 ends early / wrong durationTruncated mux or interrupted fragmentsRe-download; keep temp until runtime matches the VOD
Chat render pins the CPU for hoursEmote rendering is CPU-boundDrop to 30 fps, disable animated emotes, render overnight

When the table does not help

If none of these fit, the default move is to eliminate staleness: run yt-dlp -U or download the newest TwitchDownloader release, then retry once. A large fraction of "mystery" failures are just an old build meeting a changed API. If it still fails on the current version, the problem is likely upstream — check the project's GitHub issues, where a query-hash break is usually reported and patched within days.

The one habit that prevents most of these

Keep the temp cache until you have confirmed the final file's duration matches the source. The majority of "corrupt download" reports are truncated muxes that were deleted before verification, leaving nothing to resume from. Verify first, delete second.

Advanced: Batch Archival and Automation

One VOD is a chore; a channel's entire back catalog is a project. This is where the command line stops being a nuisance and becomes the only sane option.

Grab an entire channel

yt-dlp accepts a channel's videos page and will walk every currently-available VOD. Pair it with a download archive so re-runs skip what you already have:

yt-dlp \
  --download-archive downloaded.txt \
  -f "bv*[height<=1080]+ba/b" --merge-output-format mp4 \
  -o "%(upload_date)s - %(title)s [%(id)s].%(ext)s" \
  "https://www.twitch.tv/somechannel/videos?filter=archives&sort=time"

The downloaded.txt archive is the important part: it records every video ID it finishes, so tomorrow's run grabs only the new ones. That is what turns a one-off scrape into a maintainable mirror.

Automate against the clock

The retention window is short, so the correct posture is a scheduled job that runs more often than the window closes. On Linux/macOS, a cron entry every six hours:

# crontab -e
0 */6 * * * /home/you/bin/archive-channel.sh somechannel >> /home/you/Twitch/archive.log 2>&1

On Windows, wrap the same yt-dlp command in a .bat and point Task Scheduler at it on a six-hour trigger. Either way, you are now capturing VODs while you sleep, which is the only reliable defense against a 7-day timer. Keeping a tidy destination and pruning muxed temp files matters here — the same disk-hygiene reflex behind a PS5 cache clear, just pointed at your archive drive.

Naming templates and metadata

Future-proof the archive with a consistent output template and a sidecar metadata file. Adding --write-info-json drops a JSON of title, uploader, timestamps, and view count next to each MP4 — invaluable when the source VOD is long gone and the filename is all you have left. A template like %(uploader)s/%(upload_date)s - %(title)s [%(id)s].%(ext)s gives you per-streamer folders, date-sorted files, and a permanent ID for de-duplication. Boring, disciplined, and the reason your archive is still usable in five years.

The Complete Working Configuration

Here is everything assembled — the files and script that turn the above into a repeatable system. Drop these in, edit the paths, and you have a Twitch archival rig that survives reboots and API changes.

The yt-dlp config file

Put this at ~/.config/yt-dlp/config (Linux/macOS) or %APPDATA%\yt-dlp\config.txt (Windows). Every yt-dlp invocation inherits it:

# yt-dlp persistent config
-f bv*[height<=1080]+ba/b
--merge-output-format mp4
-o ~/Twitch/%(uploader)s/%(upload_date)s - %(title)s [%(id)s].%(ext)s
--cookies-from-browser firefox
--http-chunk-size 10M
--concurrent-fragments 4
--write-info-json
--retries 10
--fragment-retries 20
--no-part

The archival script

Save as ~/bin/archive-channel.sh and chmod +x it. It mirrors one channel idempotently:

#!/usr/bin/env bash
# archive-channel.sh — mirror every available VOD from a channel
set -euo pipefail
CHANNEL="${1:?usage: archive-channel.sh <channel>}"
DEST="$HOME/Twitch/$CHANNEL"
mkdir -p "$DEST"
yt-dlp \
  --download-archive "$DEST/.downloaded.txt" \
  -f "bv*[height<=1080]+ba/b" --merge-output-format mp4 \
  -o "$DEST/%(upload_date)s - %(title)s [%(id)s].%(ext)s" \
  "https://www.twitch.tv/$CHANNEL/videos?filter=archives&sort=time"

The Streamlink config, for live safety-nets

And the companion Streamlink config at ~/.config/streamlink/config, so any channel that streams without recordings can still be caught live:

# streamlink persistent config
default-stream=best
twitch-supported-codecs=h264,h265,av1
twitch-low-latency
retry-streams=5
retry-max=0
record=~/Twitch/live/{author}-{time:%Y%m%d-%H%M}.ts

That retry-max=0 means "poll forever," and the record template writes a timestamped TS the moment the channel goes live. Point it at a favorite streamer overnight and you wake up to the whole broadcast, ads already stripped, no VOD required. That is the entire discipline: assume Twitch will delete it, and make sure your disk got there first.

Questions the search bar asks me

Is it legal to download Twitch VODs?
Downloading your own broadcasts is fine — Twitch gives you a Download button in Video Producer for exactly that. Downloading someone else's content with a third-party tool violates the Twitch Terms of Service, which bar 'data mining, robots, or similar data gathering or extraction methods' except as expressly permitted. That is a contract breach, not automatically a copyright crime, but the footage still belongs to its creator.
How long before a Twitch VOD is deleted?
It depends on your account tier: 7 days for standard broadcasters, 14 days for Affiliates, and 60 days for Partners, Prime, and Turbo users. Highlights and Uploads last longer but now share a single 100-hour cap enforced since April 19, 2025. Clips have no timer but vanish if the channel is deleted, banned, or the source VOD is removed.
Why did my downloader suddenly stop working?
Almost always because Twitch rotated its internal GraphQL query hashes and your tool's baked-in copies went stale — see TwitchDownloader issue #1563. The fix is to update: TwitchDownloader 1.56.4 (Feb 4, 2026) shipped fresh hashes, and yt-dlp self-updates with 'yt-dlp -U'. Running a months-old build against a moving API is the single most common failure.
Can I download a sub-only or 4K VOD?
Sub-only VODs need authentication: pass 'yt-dlp --cookies-from-browser firefox' or a Streamlink OAuth header from an account that owns the sub. As for 4K, it does not exist on Twitch — the platform does not transcode above the streamer's source bitrate, so 'Source' (the 'chunked' format) is the ceiling, typically 1080p60 at around 6 Mbps.
What is the difference between TwitchDownloader, yt-dlp, and Streamlink?
TwitchDownloader (v1.56.4) is a Windows GUI plus cross-platform CLI built for VODs, clips, and — uniquely — chat download and render. yt-dlp is the scriptable command-line workhorse for finished VODs and clips across 1,000+ sites. Streamlink records a stream live, as it airs, and since v8.0.0 filters preroll and midroll ads automatically.
Nina Velasquez — Homebrew Dev Correspondent
Nina Velasquez
HOMEBREW DEV CORRESPONDENT

Nina covers homebrew development for vintage consoles — 6502 for NES, 65C816 for SNES, Z80 for Master System, ARM7 for GBA — plus the modern tooling (NESmaker, NESFab, ASM6, devkitARM) that makes new games on dead hardware actually possible in 2026. Every post under this byline is reviewed pre-publish by Sam P., Editor & Operator — corrections to info@instalinkoteam.com. Published 2026-07-12 · Last updated 2026-07-12. Full bios on the author page.

MORE FIELD NOTES

GTA 6 Trailer 3 2026: Pre-Orders June 25, $100 Question8 MIN READ · BY JORDAN VALEGTA 6 Trailer 3 Is Still Missing: 475M Views, Nov 1912 MIN READ · BY JORDAN VALEXbox Handheld Release Date: Oct 2025, First-Party 20278 MIN READ · BY CASEY ROURKEPS Remote Play 2026: 12 Steps to 1080p in 30 Min13 MIN READ · BY JORDAN VALEPS5 Pro vs PS5: 67% More GPU, $250 Premium in 20267 MIN READ · BY NINA VELASQUEZPS5 Pro vs PS5 2026: 45% Faster GPU, $300 More13 MIN READ · BY JORDAN VALE