Empty your Liked videos list and remove every like in one go. Free, runs in your browser, nothing to install.
// Responsive Muse · Unlike All YouTube Videos · v1.1 · 2026-10-22
// Removes every video from your Liked videos list, which also removes your like.
// Runs only on youtube.com/playlist?list=LL. It counts first and asks before changing anything,
// then clicks the same "Remove from Liked videos" menu you would. It makes no network requests
// of its own and never reads cookies, passwords or tokens.
(async () => {
const TOOL = 'Unlike all videos';
const LIMIT = 0; // stop after this many videos (0 = no limit)
const DELAY = 700; // pause between actions, in milliseconds
if (location.hostname !== 'www.youtube.com' || new URLSearchParams(location.search).get('list') !== 'LL') {
alert('Open your Liked videos first (signed in):\nhttps://www.youtube.com/playlist?list=LL');
return;
}
// A small box on the page shows progress and asks before changing anything,
// so you never need to read or edit the console.
const many = (n, word) => `${n} ${word}${n === 1 ? '' : 's'}`; // 1 video, 2 videos
const panel = (() => {
const box = document.createElement('div');
box.style.cssText = 'position:fixed;right:16px;bottom:16px;z-index:2147483647;width:340px;max-width:calc(100vw - 32px);' +
'background:#111318;color:#e6e8ee;font:14px/1.5 system-ui,sans-serif;border-radius:12px;padding:16px;' +
'box-shadow:0 8px 30px rgba(0,0,0,.4);text-align:left';
const head = document.createElement('strong');
head.textContent = TOOL;
const msg = document.createElement('p');
msg.style.cssText = 'margin:8px 0 12px;white-space:pre-line';
const row = document.createElement('div');
row.style.cssText = 'display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end';
box.append(head, msg, row);
document.body.append(box);
const button = (label, primary, onClick) => {
const b = document.createElement('button');
b.textContent = label;
b.style.cssText = 'font:600 14px system-ui,sans-serif;padding:8px 14px;border-radius:8px;cursor:pointer;' +
(primary ? 'background:#0f766e;color:#fff;border:1px solid #0f766e' : 'background:none;color:#e6e8ee;border:1px solid #3a3f4b');
b.onclick = onClick;
row.append(b);
};
return {
text(t) { msg.textContent = t; },
ask(t, yes) {
msg.textContent = t;
row.replaceChildren();
return new Promise(r => {
button('Cancel', false, () => { row.replaceChildren(); r(false); });
button(yes, true, () => { row.replaceChildren(); r(true); });
});
},
stoppable(onStop) { row.replaceChildren(); button('Stop', false, onStop); },
actions(t, list) {
msg.textContent = t;
row.replaceChildren();
list.forEach(([label, primary, run]) => button(label, primary, run));
},
finish(t) { this.actions(t, [['Close', true, () => box.remove()]]); },
close() { box.remove(); },
};
})();
const sleep = ms => new Promise(r => setTimeout(r, ms));
// Wait until something shows up on screen (menus can take a moment to open)
const visible = e => e.getClientRects().length > 0;
const waitFor = async (find, ms = 4000) => {
for (let t = 0; t < ms; t += 150) {
const hit = find();
if (hit) return hit;
await sleep(150);
}
return null;
};
// "Remove from Liked videos" in English, Spanish, Portuguese, French, German and Italian
const REMOVE = /remove from liked videos|quitar de videos que me gustan|remover de vídeos marcados como "gostei"|retirer des vidéos .*j'aime|aus .*mag ich.* entfernen|rimuovi da video piaciuti/i;
const rows = () => [...document.querySelectorAll('yt-lockup-view-model, ytd-playlist-video-renderer')]
.filter(el => el.querySelector('a[href*="/watch?v="][href*="index="]'));
// 1. Load the whole list
let last = -1, idle = 0;
while (idle < 3) {
window.scrollTo(0, document.documentElement.scrollHeight);
await sleep(1200);
const n = rows().length;
idle = n === last ? idle + 1 : 0;
last = n;
panel.text(`Loading your liked videos… ${n}`);
}
const total = LIMIT ? Math.min(LIMIT, rows().length) : rows().length;
if (!total) {
panel.finish('You have no liked videos.');
return 0;
}
// 2. Ask
if (!await panel.ask(`Unlike ${many(total, 'video')}?\nThis can't be undone.`, `Unlike ${total}`)) {
panel.finish('Cancelled. Nothing was changed.');
return 0;
}
// 3. Remove them one by one. YouTube's new layout keeps removed rows on screen,
// so remember which videos are done.
let stop = false;
panel.stoppable(() => { stop = true; });
const videoId = el => new URL(el.querySelector('a[href*="/watch?v="]').href).searchParams.get('v');
const done = new Set();
// The row's three-dot menu: by its English label, else by its place in the layout (any language)
const menuButton = el => el.querySelector('button[aria-label="Action menu"], button[aria-label="More actions"]')
|| el.querySelector('[class*="MenuButton"] button, ytd-menu-renderer yt-icon-button button, ytd-menu-renderer #button button, #menu button');
let removed = 0;
while (!stop && removed < total) {
const el = rows().find(r => !done.has(videoId(r)));
if (!el) break;
done.add(videoId(el));
el.scrollIntoView({ block: 'center' });
menuButton(el).click();
const item = await waitFor(() => [...document.querySelectorAll('yt-list-item-view-model, ytd-menu-service-item-renderer')]
.find(i => visible(i) && REMOVE.test(i.textContent)));
if (!item) {
panel.finish(`Unliked ${removed}, then could not find "Remove from Liked videos" in the menu.\nYouTube may have changed its layout: please report it on responsive-muse.com.`);
return removed;
}
item.click();
// Wait for the menu to close, so the next video doesn't reuse this menu
await waitFor(() => ![...document.querySelectorAll('yt-list-item-view-model, ytd-menu-service-item-renderer')]
.some(i => visible(i) && REMOVE.test(i.textContent)) || null);
removed++;
panel.text(`Unliking… ${removed} of ${total}`);
await sleep(DELAY);
}
panel.finish(`${stop ? 'Stopped' : 'Done'}: unliked ${removed} of ${many(total, 'video')}.\nReload the page to see the result.`);
return removed;
})();
Bookmarklet: drag the middle button to your bookmarks bar, open www.youtube.com and click the bookmark. It runs the same script with the options above.
- Sends nothing anywhere. No fetch, XHR or external scripts. The only network activity is www.youtube.com itself loading your list.
- Never touches your login. It doesn't read cookies, passwords, tokens or browser storage.
- Only runs on www.youtube.com. Anywhere else it stops before doing anything.
- Short and readable. 130 commented lines, not minified or obfuscated.
- Asks before it changes anything. A box on the page shows what it found and waits for your OK. You can stop it at any time.
- Same code for everyone. SHA-256 of the default version:
ddf422fe80307bd3…
Verify it yourself in 30 seconds
- Read it: every line is above, with comments.
- Search the code for
fetch,XMLHttpRequest,cookie,localStorageoreval. None of them appear. - Open the Network tab before running it: you'll only see requests to www.youtube.com.
Good to know: this can't be undone in bulk. The script always shows the count and asks before it starts. Leave the tab open until the box says "Done".
How to use it
- Open youtube.com/playlist?list=LL (Liked videos) while signed in.
- Open the console: F12 or Ctrl+Shift+J (Cmd+Option+J on Mac). If Chrome asks, type
allow pastingand press Enter. - Copy the script, paste it in the console and press Enter. A small box shows how many liked videos you have: click Unlike to confirm, or Cancel.
- Keep the tab open until the box says “Done”. You can stop it at any time.
How it works
Removing a video from the Liked videos list is the same as clicking its like button again. The script opens each video’s menu and picks “Remove from Liked videos”, one by one, with a short pause so YouTube keeps up.
FAQ
Does removing a video from Liked videos remove the like?
Yes. Removing it from the Liked videos list is the same as clicking the like button again.
Why does it pause between videos?
To act at a human pace so YouTube doesn't slow down or block the requests. You can change the pause in the script.
