Vacía tus publicaciones guardadas de X de una vez, o solo las más recientes. Gratis, en tu navegador.
// Responsive Muse · Remove All Bookmarks on X (Twitter) · v1.1 · 2026-10-22
// Removes your bookmarks, newest first: all of them, or only the latest LIMIT. Runs only on
// x.com/i/history (bookmarks). It asks before changing anything, then clicks the same bookmark
// button you would. It makes no network requests of its own and never reads cookies,
// passwords or tokens.
(async () => {
const TOOL = 'Borrar todos los guardados';
const LIMIT = 0; // only the latest this many posts (0 = all)
const DELAY = 1200; // pause between removals, in milliseconds
if (!/^(x|twitter)\.com$/.test(location.hostname) || !/^\/i\/(history|bookmarks)\/?$/.test(location.pathname)) {
alert('Abre primero tus guardados (con tu sesión iniciada):\nhttps://x.com/i/bookmarks');
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} ${n === 1 ? word : ({ canal: 'canales', 'canción': 'canciones', 'publicación': 'publicaciones', 'elemento guardado': 'elementos guardados' })[word] || word + 's'}`; // 1 vídeo, 2 vídeos
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('Cancelar', false, () => { row.replaceChildren(); r(false); });
button(yes, true, () => { row.replaceChildren(); r(true); });
});
},
stoppable(onStop) { row.replaceChildren(); button('Parar', false, onStop); },
actions(t, list) {
msg.textContent = t;
row.replaceChildren();
list.forEach(([label, primary, run]) => button(label, primary, run));
},
finish(t) { this.actions(t, [['Cerrar', true, () => box.remove()]]); },
close() { box.remove(); },
};
})();
const sleep = ms => new Promise(r => setTimeout(r, ms));
const idOf = art => ((art.querySelector('a[href*="/status/"] time')?.closest('a')?.getAttribute('href') || '')
.match(/\/status\/(\d+)/) || [])[1];
const done = new Set(); // X keeps removed posts on screen, so remember which ones are handled
// 1. Ask (X loads bookmarks as you scroll, so the total isn't known in advance)
const scope = LIMIT ? `tus últimos ${LIMIT} guardados` : 'todos tus guardados';
if (!await panel.ask(`¿Borrar ${scope}?\nNo se puede deshacer. Si puede que los quieras más adelante, expórtalos antes.`, LIMIT ? `Borrar ${LIMIT}` : 'Borrar todo')) {
panel.finish('Cancelado. No se ha cambiado nada.');
return 0;
}
// 2. Remove one by one, scrolling to load more
let stop = false;
panel.stoppable(() => { stop = true; });
window.scrollTo(0, 0);
await sleep(DELAY);
let count = 0, idle = 0;
while (!stop && idle < 4 && !(LIMIT && count >= LIMIT)) {
const art = [...document.querySelectorAll('article[data-testid="tweet"]')]
.find(a => a.querySelector('button[data-testid="removeBookmark"]') && !done.has(idOf(a)));
if (!art) {
window.scrollBy(0, window.innerHeight * 0.8);
await sleep(DELAY);
idle++;
continue;
}
idle = 0;
done.add(idOf(art));
art.scrollIntoView({ block: 'center' });
art.querySelector('button[data-testid="removeBookmark"]').click();
count++;
panel.text(`Borrando… ${count}${LIMIT ? ` de ${LIMIT}` : ''}`);
await sleep(DELAY);
}
if (!count && !stop) {
panel.finish('No tienes guardados que borrar.');
return 0;
}
panel.finish(`${stop ? 'Parado' : 'Hecho'}: borrados ${many(count, 'guardado')}.\nRecarga la página para ver el resultado.`);
return count;
})();
Marcador: arrastra el botón del medio a tu barra de marcadores, abre x.com y pulsa el marcador. Ejecuta el mismo script con las opciones de arriba.
Por qué es seguro ejecutarloComprobación automática superada 23 oct 2026 · probado en una cuenta real el 22 oct 2026
- No envía nada a ningún sitio. Sin fetch, XHR ni scripts externos. La única actividad de red es la de x.com cargando tu lista.
- No toca tu sesión. No lee cookies, contraseñas, tokens ni el almacenamiento del navegador.
- Solo funciona en x.com. En cualquier otra web se detiene antes de hacer nada.
- Corto y legible. 101 líneas comentadas, sin minificar ni ofuscar.
- Pregunta antes de cambiar nada. Un recuadro en la página muestra lo que ha encontrado y espera tu OK. Puedes pararlo cuando quieras.
- El mismo código para todos. SHA-256 de la versión por defecto:
741f558fe10d48dd…
Compruébalo tú mismo en 30 segundos
- Léelo: todas las líneas están arriba, con comentarios.
- Busca en el código
fetch,XMLHttpRequest,cookie,localStorageoeval. No aparece ninguna. - Abre la pestaña Red (Network) antes de ejecutarlo: solo verás peticiones a x.com.
Ten en cuenta: esto no se puede deshacer en bloque. El script siempre muestra cuántos hay y pregunta antes de empezar. Deja la pestaña abierta hasta que el recuadro diga «Hecho».
¿Te ha funcionado?
Cómo usarlo
- Abre tus guardados con tu sesión iniciada.
- Abre la consola: F12 o Ctrl+Mayús+J (Cmd+Opción+J en Mac). Si Chrome te lo pide, escribe
permitir pegar(oallow pastingsi lo tienes en inglés) y pulsa Enter. - Elige las opciones, copia el script, pégalo en la consola y pulsa Enter. Un recuadro te dice cuántos ha encontrado y espera tu confirmación antes de empezar. Puedes pulsar Parar cuando quieras.
Antes de vaciar
Si puede que quieras los guardados más adelante, expórtalos primero con el exportador de guardados.
Preguntas frecuentes
¿X no tiene una opción de «borrar todo»?
En la nueva página de Guardados no. Hay que quitarlos uno a uno, que es lo que hace este script por ti.
¿Los exporto antes?
Sí, si puede que los quieras más adelante: usa el exportador de guardados y después vacía.
