Find, search, and bulk-delete every YouTube comment and live chat you've ever posted, from your Google Takeout.
More screenshots
git clone https://github.com/getBoolean/youtube_takeout_manager.git
cd youtube_takeout_manager
cp .env.example .env
flutter run -d windows --dart-define-from-file=.env # or macos, linux, chromeProblem: YouTube keeps every comment you've posted, scattered across the videos you posted them on. You can't search them, and you can't delete them by channel, by video, or by what they say. Google Takeout will give you a copy, but it's a pile of CSV files with video IDs instead of titles and no way to act on any of it.
Solution: Takeout Manager opens that export and lays out every comment and live chat by channel and video. Search all of them at once, pick what should go, and delete it — through YouTube's API, or with a script on Google's My Activity page that has no daily limit.
| You want to… | Takeout Manager |
|---|---|
| Find one comment from years ago | Searches every comment, live chat, and video title at once, ignoring case and accents |
| Clear out everything you said on one channel | Select all on that channel, add to the queue, delete |
| Delete thousands in one sitting | Script deletion: about one per second, no API quota |
| Delete steadily without babysitting it | API deletion: live queue with pause/resume and a quota meter |
| Keep a copy before deleting | Export to CSV or JSON |
| Look back at what you watched | Watch and search history by day, month, channel or category |
How it works:
- Export your YouTube data from Google Takeout (steps below).
- Import the zip. It's read and saved on your device; nothing is uploaded.
- Browse, search, select, delete.
Download the app for Windows, macOS, Linux, Android or the web from Releases, or build it yourself with the Flutter SDK. No Google Cloud setup is needed to start: without it you can browse, search, export, and delete with the script. Sign-in adds API deletion and video titles whenever you want them, and the app walks you through setting it up.
# 1. Get the code
git clone https://github.com/getBoolean/youtube_takeout_manager.git
cd youtube_takeout_manager
# 2. Create an empty config (sign-in is then set up inside the app)
cp .env.example .env
# 3. Run it
flutter run -d windows --dart-define-from-file=.envReplace windows with macos, linux, or chrome. For phones and release builds, see Run on any platform.
- Open takeout.google.com and click Deselect all.
- Scroll to YouTube and YouTube Music and tick it.
- Click All YouTube data included and untick videos. That option is your uploaded video files and can make the export enormous. Keep comments, live chats, history, channel, and subscriptions; the table below shows what the app does with each.
- Click Next step, choose Export once, then Create export. It can take hours or days; Google emails you when it's ready.
- Download the zip and import it in the app.
History can be HTML or JSON; both import. Large exports are split into several zips. Import them together, or one at a time: any part with something the app reads imports on its own.
Everything sits under Takeout/YouTube and YouTube Music/ in the zip. Anything the app doesn't read is skipped, so there's no harm in leaving it ticked.
| Folder | What it holds | Supported | What the app does with it |
|---|---|---|---|
comments |
Every comment you've posted (comments.csv, split into numbered files) |
Yes | Browse, search, delete, export |
live chats |
Every live chat message and Super Chat (live chats.csv, numbered the same way) |
Yes | Browse, search, delete, export |
history |
watch-history and search-history, as HTML or JSON |
Read-only | Browse and search by day, month, channel or category; YouTube's API can't delete history |
channels |
channel.csv and channel URL configs.csv |
Yes | Names your account's channels and their handles |
channels |
Community moderation settings, feature data, images, page settings | No | |
subscriptions |
subscriptions.csv |
Yes | Lists the channels you subscribe to beside the ones you watched, including ones you never watched, and filters to them |
playlists |
playlists.csv, plus one …-videos.csv per playlist |
No | |
video metadata |
Details of your uploads: videos.csv, video texts.csv, video recordings.csv |
No | |
videos |
Your uploaded video files | No | Untick it; it only makes the export bigger |
clips |
clips.csv |
No | |
music (library and uploads) |
music library songs.csv and any music you uploaded |
No | |
playables |
Save data for YouTube Playables games | No |
- Everything in one place. Every comment and live chat you've posted, grouped by channel and video.
- Search it all. Comment text, video titles, and emoji, ignoring case and accents.
- Bulk delete. Select a whole channel at once and delete through YouTube's API or a quota-free script, from one queue that survives restarts.
- Merge takeouts. Import newer exports on top of older ones; anything since gone from YouTube is kept and marked.
- Watch and search history. Browse and search it by day, month, channel or category, filtered to Shorts, YouTube Music, the channels you subscribe to, or the categories and channels you pick. The filters show how much of what you watched each category is.
- Export. Save comments and live chats as CSV or JSON.
| YouTube API | My Activity script | |
|---|---|---|
| Speed | About 200 a day (each delete costs 50 of the 10,000 daily quota units) | About one per second, no quota |
| Needs | Sign-in with your own Google Cloud client | A browser signed in to the same Google account |
| Runs | Inside the app, with pause and resume | In a My Activity tab you keep open |
| Results | Tracked live in the queue | The script copies a report; paste it back into the app |
| Best for | Steady, hands-off cleanup | One big cleanup |
Mix them freely. Queue everything, send some through the API, and hand the rest to the script.
The script path takes four steps, and the app walks you through each one: open My Activity's YouTube comments page, copy the generated script, paste it into the browser console, and paste its results back in. The script's source is assets/scripts/delete_comments.js; read it before you run it.
- Your takeout is read and saved locally: in the app's data folder on desktop and mobile, in browser storage on web. There's no server behind this app.
- No analytics or telemetry.
- The app only goes online for what you ask of YouTube: sign-in, deletions, and — once you've signed in — video titles, thumbnails, and channel pictures. It also reads YouTube's public live chat replays to name custom emoji the takeout leaves unnamed (desktop and mobile only).
- Sign-in tokens are kept in the OS's secure storage. A Google Cloud client you set up in the app is saved on your device with its other settings.
- Quota use is counted as it happens, so you always see what's left today.
| YouTube's comment history | The raw Takeout files | Takeout Manager | |
|---|---|---|---|
| Every comment and live chat in one place | Yes | Yes, as CSV rows | Yes, by channel and video |
| Delete by channel, video, or search match | No | No | Yes |
| Video titles beside your comments | Yes | No, video IDs only | Yes, once signed in |
| Works after your channel is deleted | No | Yes | Yes |
| Remembers what's since been deleted | No | Only in old exports | Yes, merged and marked |
Use YouTube's comment history to delete a handful of recent comments. Use Takeout Manager to find specific comments among thousands, or to clean up in bulk.
| Limitation | Workaround |
|---|---|
| Release builds aren't store-signed: macOS warns on first open, the iOS build needs a sideloading tool, and an Android update needs the old version uninstalled first | Build and sign it yourself from Quick Start |
| API deletion tops out around 200 a day | Use the script path |
| The script relies on My Activity's internals; a Google change can break it | The API path still works; open an issue |
| Sign-in needs your own Google Cloud OAuth client | The app walks you through making one; everything but API deletion and video titles works without it |
| Video titles, thumbnails, and channel pictures need sign-in | Every comment still links to its video |
| Watch and search history is read-only | Delete it on My Activity |
| Custom emoji names aren't looked up on web (browser CORS rules) | Use a desktop or mobile build |
| Deleting from YouTube is permanent | Export first; use Remove to hide items without deleting them |
Is it safe to paste a script into the browser console?
Only paste code you've read. This one is generated from assets/scripts/delete_comments.js with the IDs you selected filled in. It calls My Activity's own delete action for those IDs, one per second, and copies a results report to your clipboard. It sends nothing anywhere else.
Does it work if I'm signed out, or my channel is deleted?
Yes. Browsing, searching, history, and export all run from the takeout alone. Only deletion needs a live account.
Can I undo a deletion?
No. YouTube doesn't restore deleted comments. Export what you want to keep first.
Why do I only see video IDs, not titles?
Takeout's comment files don't include titles. Sign in and the app fetches them, 50 videos per quota unit, and keeps them on your device.
My Google account has several channels. Which one do I see?
One at a time. A takeout covers the whole Google account, so it can include several channels. Pick one to view, and sign in as that channel to delete its comments.
Every command takes --dart-define-from-file=.env (shortened to … below). Run flutter devices to see what's connected, and flutter doctor to check the toolchain for a platform.
| Platform | Run | Release build | Toolchain |
|---|---|---|---|
| Windows | flutter run -d windows … |
flutter build windows … |
Visual Studio 2026, "Desktop development with C++" |
| macOS | flutter run -d macos … |
flutter build macos … |
Xcode + command-line tools |
| Linux | flutter run -d linux … |
flutter build linux … |
clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev |
| Web | flutter run -d chrome --web-port=9000 … |
flutter build web … |
Chrome |
| Android | flutter run -d <device> … |
flutter build apk … |
Android Studio + SDK |
| iOS | flutter run -d <device> … |
flutter build ipa … |
Xcode |
On web, keep --web-port equal to the port you registered for sign-in. The VS Code launch configs in .vscode/launch.json pass .env for you. Sign-in tokens use flutter_secure_storage, which needs extra setup on some platforms.
The web app keeps its data in a Web Worker. Compile the workers before running or building for the web, and again after changing their code:
dart run tool/compile_workers.dartSign-in turns on API deletion, video titles, thumbnails, and channel pictures. It needs a Google Cloud OAuth client, which is free. The YouTube API quota belongs to the client's project, so everyone using the same client shares one daily quota.
In the app: open Takeouts with the account button, then choose Set up under Google Cloud client. The app walks you through the steps below and saves the client on that device. Change or remove it there too; switching clients signs your channels out, since their sign-ins only work with the client that made them.
In a build: to ship a client with the app, fill in .env before building (step 5 below). That build always uses its own client, and its users share its quota.
Step-by-step Google Cloud setup
-
Open the Google Cloud Console and create or select a project.
-
Enable the YouTube Data API v3: go to APIs & Services > Library, search for "YouTube Data API v3", and click Enable.
-
Configure Google Auth Platform (in the sidebar):
- Branding — set an app name and support email.
- Audience — choose External and add your Google account as a test user. Without this, sign-in fails with 403 while the app is in "Testing".
- Data Access — add the scopes
openid,email,profile, andhttps://www.googleapis.com/auth/youtube.force-ssl.
-
Create OAuth clients under Clients:
- Desktop app (desktop and mobile) — copy the Client ID and Client Secret. Google shows the secret only once.
- Web application — add your run URL (e.g.
http://localhost:9000) to Authorized JavaScript origins and copy the Client ID. No secret is needed.
-
Paste the client into the app's setup. Or, for a build that ships its own client, fill in
.envin the project root (it's gitignored):GOOGLE_CLIENT_ID=your-desktop-client-id GOOGLE_CLIENT_SECRET=your-desktop-client-secret GOOGLE_WEB_CLIENT_ID=your-web-client-id
-
After changing
.env, restart the app.
Signed in, channels get categories from YouTube's topics. With an API key, AI checks those and names the ones YouTube has none for: Jev by TypeSafe checks and picks from known categories for a fraction of a cent, and Claude by Anthropic names what Jev can't settle. Add either key, or both. Each service bills your own account.
Tap a channel's category to see where it came from. With a key, you can ask AI for another when YouTube's is wrong; what you choose is never replaced. Signed out with no key, channels stay uncategorized.
To pick a category, a channel's name and description, and the titles of videos you watched from it, go to the services you add keys for.
In the app: open Takeouts with the account button, then choose Add keys under AI categories. Keys stay in the device's secure storage.
In a personal build: fill in .env before building. Anyone can read a key out of a built app, including a web build's JavaScript, so never build a release you share with your keys. CI never passes .env to its builds, and a test keeps it that way.
TYPESAFE_API_KEY=your-typesafe-key
ANTHROPIC_API_KEY=your-anthropic-key
ANTHROPIC_MODEL= # blank uses claude-haiku-4-5A key built into the app can't be changed in it; the app offers only the keys the build lacks.
--dart-define-from-file can't find .env
Create it: cp .env.example .env.
"Access blocked" or 403 on sign-in Your Google account isn't a test user. Add it under Google Auth Platform > Audience.
Web sign-in redirect fails The port in your URL must match Authorized JavaScript origins exactly.
"Google didn't accept the client" on sign-in The client ID or secret is wrong, or the client was deleted. Check them under Takeouts > Google Cloud client > Change. If a Desktop client's secret is lost, add a new secret on the client's page in Google Cloud.
The script stops with "Could not find XSRF token" or "Could not discover delete rpcid" Run it on My Activity's YouTube comments page, signed in, after the page has finished loading. If it still fails, Google may have changed the page; open an issue.
API deletion stopped with the quota used up YouTube's quota resets at midnight Pacific time. Switch to the script to keep going today.
flutter doctor flags a platform
Fix that platform's toolchain before running on it.
Requires Dart 3.11 or newer (any current stable Flutter). Generated files (*.g.dart, *.mapper.dart, *.gr.dart) are checked in. After editing annotated sources, regenerate them:
dart run build_runner build --delete-conflicting-outputs # once
dart run build_runner watch --delete-conflicting-outputs # while you workTests:
flutter test # everything that runs on the Dart VM
dart test -p chrome test_browser # web storage (IndexedDB), in ChromeThe web storage tests use dart test, not flutter test --platform chrome: the Flutter browser test host crashes before running any test (its page lacks the #play element the test runner expects).
CI (.github/workflows/ci.yml) checks formatting, analyzes, runs both test suites, and builds every platform on each push to any branch and each pull request. The builds are downloadable from the run's page.
To release, push a tag like v1.2.0. release.yml runs the same checks, builds every platform at that version, and publishes a GitHub release with the Android APK, the web, Windows, macOS and Linux archives, and an unsigned iOS IPA. A tag with a suffix, like v1.2.0-beta.1, becomes a pre-release. Release builds carry no Google Cloud client, so each user sets up their own. The macOS app isn't notarized, and the IPA needs a sideloading tool that signs it.








