Personal

RB YouTube Tools - An Open Source YouTube Processing Toolbox

A desktop app for downloading and translating YouTube auto-captions, built out of a very specific problem: wanting to understand kpop variety content with no subtitles.

April 2, 2026
ElectronReactTypeScriptyt-dlp

View on GitHub

This article is continuously updated as the project grows. What's described here reflects v0.3.0-alpha.

What is this

RB YouTube Tools is an open source desktop app for pulling and translating YouTube auto-generated captions. You give it a YouTube URL, pick which caption track you want to translate and what language to translate it to, and it does the rest: downloading the captions, running them through Google Translate, and giving you a translated subtitle file you can read or watch directly in the app.

The name is intentionally broad because I have other YouTube-related tools in mind down the road, but the auto-translation feature is what exists today.

The project is on GitHub at ryanputraa/RB-YouTube-Tools.

Why this exists

I got into kpop. Specifically a group called AHOF.

The problem with following a kpop group if you don't speak Korean is that the actual content: the variety show appearances, the radio interviews, the random live streams: almost never gets subtitled. Dedicated fan subbers exist for the big groups but for smaller acts you're mostly out of luck. YouTube's auto-captions are there, they're just in Korean.

YouTube has a feature to auto-translate captions into another language. The catch is that it's been broken or disabled for a lot of content for a while now. You click the language dropdown and nothing happens, or the option just isn't there. So the captions exist, the translation infrastructure exists, but the button doesn't work.

I figured there had to be a way to just... extract the captions and translate them myself. There was. It took a bit of work to get right, but it works.

How it's built

The app is an Electron desktop app running React and TypeScript on the frontend, with Node.js handling all the heavy lifting on the backend side.

The actual caption extraction is done by yt-dlp, a command-line YouTube downloader. The app shells out to yt-dlp to fetch the auto-generated subtitle file (VTT format), then parses that locally. YouTube's VTT files have a quirky format: they deliver rolling word-by-word captions as accumulating cues, all sharing the same start timestamp, where each cue adds one more word to the previous one. The parser groups by start time and keeps only the final, complete version of each cue.

Those blocks get sent through Google Translate in batches of 50, with 6 batches running concurrently and no artificial delay between them, then written out as translated VTT and SRT files. You can read the translation on screen, export the subtitle file, or watch the original video with translated subtitles directly in the app.

A few other things the app handles:

  • ffmpeg is required to merge DASH-fragmented subtitle streams (how YouTube delivers a lot of auto-captions), so there's a first-run setup screen that downloads it automatically
  • For videos that require a YouTube login, there's an in-app login popup using an isolated Electron browser session — no reading cookies from your system browser
  • If a video has multiple caption tracks (Korean auto, English auto, manual subs), you can pick which one to translate from
  • Translation history is stored locally and auto-imports any folders from older runs when you open the history screen

Watching translations

There are two ways to watch a video with translated subtitles in the app.

Download first, then watch locally. The app downloads the video with yt-dlp (using parallel fragment downloading for speed) and plays it back in a native HTML video element. The translated VTT is loaded as a native <track> element, which means subtitles work in fullscreen without any custom intercept logic. You can toggle them on/off, switch between the translated and original tracks, and resize the text with an Aa button. Arrow keys skip ±10 seconds, matching YouTube's behaviour.

Watch via YouTube embed. If you haven't downloaded the video yet, the app embeds YouTube's actual IFrame player. This uses YouTube's own adaptive streaming, so playback is smooth. Subtitles are rendered by polling getCurrentTime() every 200ms and displaying a subtitle bar just below the player — cross-origin iframe restrictions prevent overlaying DOM elements on top of the player, so the subtitle sits beneath it instead. The same CC toggle, track switching, and size controls are available here. If you decide you want a smoother experience mid-watch, a download button in the player pulls the video in the background and offers to switch you over when it's done.

Video quality

When downloading, you can choose a quality from Best down to 360p — either as a default in Settings, or overridden per-job on the options screen. The selection maps to a yt-dlp format string (bestvideo[height<=1080]+bestaudio and so on) so you get the best available encode at that resolution rather than a transcoded version.

History and navigation

Translations are saved to a history list on the home screen, displayed as a YouTube-style grid with thumbnails. Each card has a three-dot menu for copying the original YouTube link, opening the output folder in Explorer, or deleting the video's folder from disk.

The URL input keeps a history of previously used links and shows them as a dropdown with thumbnails and titles when you click into it.

Settings

A gear icon in the header opens a settings page. From there you can change the default output directory, set a default download quality, toggle whether the output folder is wiped on uninstall, clear translation history, or delete all downloaded files at once. The app version is shown at the bottom.

Installer

The app ships as a Squirrel installer (the same mechanism GitHub Desktop and Discord use on Windows). It installs silently in about a second, creates a desktop shortcut and Start Menu entry automatically, and handles in-place updates cleanly. There's also a portable .exe for people who don't want to install anything.

Next steps

A few things I want to add, roughly in priority order:

  • Batch URL input: paste in a playlist or a list of URLs and translate them all
  • Subtitle timing adjustments: manual offset controls for when the captions are slightly out of sync
  • Auto-download on paste: detect a YouTube URL in the clipboard when the app opens and pre-fill it
  • Auto-update: the installer exists now, but the app doesn't update itself yet
  • More tools: the "YouTube Tools" name is doing work; there's more I want to build here eventually
  • If you have any ideas, feel free to reach out