Saveless FAQ Contact
Your saves
Paste links or your X bookmarks. Each one is cut to three lines and filed under a topic.
Sign in
Enter your address and we will email you a link. It works once, on the device you open it on.
New here? Start a free digest .
Add saves
Paste links
X bookmarks
Drag this button to your bookmarks bar: Saveless: copy bookmarks Open x.com/i/bookmarks and click it in the bar. It scrolls your list, then shows a Copy button. Paste the result below.
What the button does
It reads only the posts on your bookmarks page, in your own browser: each post's link, author, date and text. It sends nothing anywhere; you copy and paste the list yourself. Saveless never sees your X login. This is its full code, exactly what the button runs:
(async () => {
if (!/\/i\/bookmarks/.test(location.pathname)) { alert("Open x.com/i/bookmarks first, then click Saveless again."); return; }
const rows = new Map();
for (let still = 0; still < 4 && rows.size < 400; ) {
const before = rows.size;
for (const a of document.querySelectorAll("article")) {
const link = [...a.querySelectorAll('a[href*="/status/"]')].find((l) => l.querySelector("time"));
if (!link) continue;
const pick = (s) => a.querySelector(s)?.innerText.trim() ?? "";
rows.set(link.href, { link: link.href, date: link.querySelector("time").dateTime,
user: pick('[data-testid="User-Name"]').replace(/\n/g, " "), text: pick('[data-testid="tweetText"]'),
card: pick('[data-testid="card.wrapper"]') });
}
still = rows.size === before ? still + 1 : 0;
scrollBy(0, innerHeight * 0.9);
await new Promise((r) => setTimeout(r, 1200));
}
const box = document.createElement("div");
box.style.cssText = "position:fixed;inset:auto 16px 16px auto;z-index:99999;width:min(420px,calc(100vw - 32px));padding:16px;border-radius:8px;background:#fffaf1;color:#141a2b;font:15px/1.5 system-ui;box-shadow:0 8px 32px rgba(0,0,0,.35)";
const note = document.createElement("p");
note.textContent = rows.size + " bookmarks read. Copy them and paste them into Saveless.";
const button = document.createElement("button");
button.textContent = "Copy";
button.style.cssText = "margin-right:8px;padding:6px 14px;border-radius:8px;border:0;background:#c08a3a;color:#1a1206;font-weight:600";
button.onclick = async () => { await navigator.clipboard.writeText(JSON.stringify([...rows.values()])); note.textContent = "Copied. Paste it into Saveless."; };
const close = document.createElement("button");
close.textContent = "Close";
close.style.cssText = "padding:6px 14px;border-radius:8px;border:1px solid #b9a78a;background:none;color:inherit";
close.onclick = () => box.remove();
box.append(note, button, close);
document.body.append(box);
})();
No bookmarks bar, or on a phone? Open the browser console on your bookmarks page, paste this shorter version and press Enter.
(async () => {
const rows = new Map();
for (let still = 0; still < 4 && rows.size < 400; ) {
const before = rows.size;
for (const a of document.querySelectorAll("article")) {
const link = [...a.querySelectorAll('a[href*="/status/"]')].find((l) => l.querySelector("time"));
if (!link) continue;
const pick = (s) => a.querySelector(s)?.innerText.trim() ?? "";
rows.set(link.href, { link: link.href, date: link.querySelector("time").dateTime,
user: pick('[data-testid="User-Name"]').replace(/\n/g, " "), text: pick('[data-testid="tweetText"]'),
card: pick('[data-testid="card.wrapper"]') });
}
still = rows.size === before ? still + 1 : 0;
scrollBy(0, innerHeight * 0.9);
await new Promise((r) => setTimeout(r, 1200));
}
copy(JSON.stringify([...rows.values()]));
console.log(rows.size + " bookmarks copied. Paste them into Saveless.");
})(); Copy
Copied bookmarks
Import bookmarks
Settings and plan
Send the digest at your time
Send me the digest emails
Save settings
Sign out of this browser
Saveless keeps each save as three lines: what it is, the one lesson and the one action. Topics can be renamed, merged and corrected, and every correction teaches the filing. One email per topic per day, with a stop link in each.