TwitchDownloader: VOD and chat capture that keeps the chat replayable
Twitch VOD/Clip Downloader - Chat Download/Render/Replay
At a glance
- What is it?
- A C# toolchain that pulls Twitch VODs and clips, saves chat as JSON, and renders it back into a video file, with a Windows GUI on top of a cross-platform CLI.
- Who is it for?
- TwitchDownloader is really two projects that happen to share a repository: a cross-platform CLI that does the downloading and rendering, and a Windows-only WPF interface that adds queues and search on top. The chat-as-JSON-then-render pipeline is the part that justifies the whole thing, since a VOD with no chat is just a file you could get elsewhere.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 33 days ago.
- What is it written in?
- Mainly C#, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Three verbs, and the JSON file is the interesting one
The feature list is short enough to state in full, which is a good sign. Download Twitch VODs. Download Twitch clips. Download chat for either, in three formats: a JSON file with all the original information, a browser HTML file, or plain text. Update the contents of a previously generated JSON chat file with an option to save as another format. Render a previously generated JSON chat file with emoji and emote support.
The pipeline is the design. Chat is fetched once into JSON, and that JSON is the input to every rendering option afterwards. It means re-rendering at a different resolution does not mean re-downloading, and it means the archive survives Twitch deleting the VOD. The supported emote sources are named specifically: Twitter Twemoji, Google Noto Color emojis, and BTTV, FFZ and 7TV static and animated emotes.
The repository tree shows the three-way split that produces this: TwitchDownloaderCore, TwitchDownloaderCLI and TwitchDownloaderWPF, plus a matching pair of test projects for Core and CLI. Core holding the logic separately from both front ends is why the CLI can stay cross-platform while the GUI can be Windows-only.
The batch file the README gives you as an example
The README's illustration of automating video processing is a Windows batch file, and it happens to show the whole workflow in four lines: get a VOD ID, download the video, download the chat as JSON, render the chat to MP4.
@echo off
set /p vodid="Enter VOD ID: "
TwitchDownloaderCLI.exe videodownload --id %vodid% --ffmpeg-path "ffmpeg.exe" -o %vodid%.mp4
TwitchDownloaderCLI.exe chatdownload --id %vodid% -o %vodid%_chat.json -E
TwitchDownloaderCLI.exe chatrender -i %vodid%_chat.json -h 1080 -w 422 --framerate 30 --update-rate 0 --font-size 18 -o %vodid%_chat.mp4Read the subcommand names closely: videodownload, chatdownload, chatrender. Three verbs with no hidden combined mode, which is why a shell script can compose them freely. The chatrender line also shows that resolution and typography are arguments rather than configuration, with height, width, framerate, update rate and font size all passed explicitly.
The CLI is documented separately in TwitchDownloaderCLI/README.md, which the root README points to for the full command reference and example commands. Getting started instructions exist for all three desktop platforms, and they differ mostly in how you obtain FFmpeg and how you grant execute rights.
Platform reality check: no macOS GUI, Intel Macs only
The platform story has sharp edges that the README does not soften. The Linux section is a whole section titled with a question mark, and its answer is a third-party project: twitch-downloader-gui, on GitHub and in the AUR, wrapping the CLI. The macOS section is shorter and blunter. No GUI is available for MacOS yet, followed by a sad face.
The CLI does run on macOS, with an asterisk that matters: only Intel Macs have been tested. The Apple Silicon instructions cover downloading the arm64 binary, and they also explain that running the x64 binary on Apple Silicon requires a terminal session under Rosetta 2, with the shell invocation arch -x86_64 zsh. So the answer to whether Apple Silicon is supported is that the binary exists but the test coverage does not.
Linux gets the most detailed preparation notes, and they are the kind that only appear after real reports. Some distributions including Alpine lack fonts for Arabic, Persian and Thai, so additional font families such as Noto are needed. Both fontconfig and libfontconfig1 must be present, with the Ubuntu invocation spelled out as apt-get install fontconfig libfontconfig1. There are separate chmod steps for the CLI binary and, if FFmpeg was fetched standalone, for ffmpeg itself.
What the WPF GUI adds over the CLI
The Windows WPF interface implements all the main functions plus quality-of-life additions that the CLI does not attempt. Queueing multiple download and render jobs to run simultaneously. Building a list of download jobs from a list of VOD or clip links. Searching for and downloading multiple VODs or clips from any streamer without leaving the app.
That last one is the feature that has no CLI equivalent and is also the one most affected by how Twitch works. Batching by search depends on the account and channel browsing endpoints staying reachable, which is the kind of thing that breaks without warning.
The GUI also carries community translations, available through the Localization section of the WPF README. The root README itself is translated into ten languages: German, Italian, Japanese, Brazilian Portuguese, Russian, Spanish, Turkish, Simplified Chinese, Traditional Chinese and French. Theming comes bundled with light and dark options plus a mode that follows the current Windows theme, and user-created themes are supported through the Theming section of the same README.
Release notes that mostly fix edge cases
Version 1.56.5 carries two important notices at the top before the change list. If you have problems with NVIDIA encoding, rename FFmpeg.exe and relaunch TwitchDownloaderWPF. If you have problems with mask generation, go to the FFmpeg tab and click Reset to Defaults. The body below is a list of small corrections: a null reference crash when an emote provider throws while fetching metadata, progress logging when parts are missing, CLI time parsing for non-invariant cultures, and a change that prevents output video files from lacking a file extension.
Version 1.56.4 is where the one behavioural break worth knowing about landed. CLI time durations in the form ##:## are now interpreted as mm:ss rather than hh:mm, explicitly to align with FFmpeg and other tools. Any existing script that passed hours in the hours position will silently mean something different after upgrading. That release also moved to .NET 10 and added several minor fixes including allowing removal of waiting tasks that can be cancelled.
Version 1.56.2 switched back from InterVariable to static Inter typefaces and added timestamped VOD links to HTML chat messages. Between them these three releases cover roughly eight months, and the last push to the default branch was on 2026-09-07 with 3,931 stars, 347 forks and 259 open issues.
Where the documentation lives and what it does not settle
The root README is an index with two destination READMEs, TwitchDownloaderWPF/README.md and TwitchDownloaderCLI/README.md. The CLI README holds the full option reference and its own example-commands section, and the WPF README holds localization, theming and GUI-specific detail. There is also a file in the tree named WHERE IS THE EXE.txt, which tells you something about how confusing the release layout has been for people.
What none of it settles from the README alone is the question that most people arrive with, which is whether FFmpeg is mandatory. The getting-started sections answer it three separate times in three slightly different registers: install via a package manager, download a standalone file from ffmpeg.org, or let the tool fetch it with TwitchDownloaderCLI.exe ffmpeg --download on Windows and ./TwitchDownloaderCLI ffmpeg --download on Linux. That the last option exists at all is the useful detail.
The repository has no homepage field set, so the README links are the canonical entry points. There is no changelog file in the tree; change information lives entirely in the GitHub releases, which is why the release notes are worth reading rather than skimming when a script breaks.
Editorial conclusion
TwitchDownloader is really two projects that happen to share a repository: a cross-platform CLI that does the downloading and rendering, and a Windows-only WPF interface that adds queues and search on top. The chat-as-JSON-then-render pipeline is the part that justifies the whole thing, since a VOD with no chat is just a file you could get elsewhere. Start with the CLI, because every function in the GUI is reachable from there and the documentation for both lives in separate README files under the respective project directories.
Frequently asked questions
Is it possible to download someone else's Twitch VOD?
Yes, the download commands take an explicit VOD or clip ID rather than a channel name, so any publicly available video can be fetched. The Windows GUI goes further and can search a streamer's catalogue and download multiple VODs or clips without leaving the app.
Does TwitchDownloader need FFmpeg installed separately?
No, it can fetch FFmpeg for you. The CLI has its own ffmpeg subcommand, spelled TwitchDownloaderCLI.exe ffmpeg --download on Windows and ./TwitchDownloaderCLI ffmpeg --download on Linux. Installing it through a package manager or downloading a standalone build from ffmpeg.org also works.
What is the chat download format and why does the JSON one matter?
Chat can be saved as JSON with all original information, as a browser HTML file, or as plain text. The JSON file is the input to the renderer, so a chat log downloaded once can be re-rendered at a different size or font without contacting Twitch again, and it survives the original VOD being deleted.
Is there a graphical interface on Linux or macOS?
Not from this repository. On Linux the README points to a community project, twitch-downloader-gui, which wraps the CLI and is packaged in the AUR. On macOS the README states plainly that no GUI is available, so you use the CLI, and only Intel Macs have been tested.
Which emote sets does the chat renderer support?
Twitter Twemoji and Google Noto Color emojis for the standard sets, plus static and animated emotes from BTTV, FFZ and 7TV. The renderer reads a previously downloaded JSON chat file rather than downloading emotes during rendering.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/lay295-twitchdownloader)