Aeontropy's avatar
Aeontropy
aeontropy@snort.social
npub1kade...z2an
Lo que se ve no se juzga https://throne.com/aeontropy
Aeontropy's avatar
Aeontropy 1 month ago
Some Nostr clients show already deleted events, some others no changes at all. The most hated one actually honors event deletion lol.
Aeontropy's avatar
Aeontropy 1 month ago
Después de 11 días estoy libre de la gripe!
Aeontropy's avatar
Aeontropy 1 month ago
*phew* good thing no one is asking to Steam, EA, and others what happen to PC discs
Aeontropy's avatar
Aeontropy 1 month ago
gif/thread/30899946 good god I could be hours
Aeontropy's avatar
Aeontropy 1 month ago
A findom girl meets a poor guy who begs to serve her. She looks him up and down and says, "Send me $500 right now." He replies, "I only have $5..." She laughs: "Perfect. Now send it and then fuck off — even my rejection has a price, and you're still short."
Aeontropy's avatar
Aeontropy 1 month ago
Yo lo que entiendo es que después de 10 notas que borres el like, X te pone un limite o de lo contrario si sigues ban.
Aeontropy's avatar
Aeontropy 1 month ago
Creí que la caminadora portable soportaría mas peso mmm así que chiste.
Aeontropy's avatar
Aeontropy 1 month ago
Wear red when you feel bad vibes towards you... oh interesting knowledge from great grandma unlocked
Aeontropy's avatar
Aeontropy 1 month ago
Maravilloso diseñar 2 .js scripts o mejorar los que ya hay por ahí usando una llm para corregir cosas, estupendo!
Aeontropy's avatar
Aeontropy 1 month ago
A new update on X app with tons of performance issues
Aeontropy's avatar
Aeontropy 1 month ago
No mames en lo que Walmart Canada hace memes por lo de Sony, Walmart Mexico esta bien muerto en sus redes sociales que pedo!?
Aeontropy's avatar
Aeontropy 1 month ago
Those first seconds of a woman doing a face sitting on camera with a pink panty and a good size butt 🫦
Aeontropy's avatar
Aeontropy 1 month ago
Hello Nostr once again to remind you can bulk delete notes with this, maybe is not perfect but certainly works in some way, relay operators may or not may delete your notes have fun, improvements are welcome. Also save it as html, paste nsec carefully using a temporary clipboard. PS: I was able to build it with Grok. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>Nostr Mass Delete v3 (NIP-62)</title> <script src="https://cdn.jsdelivr.net/npm/nostr-tools@2.10.0/lib/nostr.bundle.js"></script> <style> body { font-family: system-ui, sans-serif; margin:0; padding:16px; background:#111; color:#ddd; line-height:1.5; } input, button, select { width:100%; padding:14px; margin:10px 0; border-radius:8px; font-size:17px; } button { background:#c00; color:white; border:none; font-weight:bold; } button.secondary { background:#555; } button.danger { background:#900; } .event { margin:12px 0; padding:14px; background:#222; border-radius:8px; } .controls { display:flex; flex-wrap:wrap; gap:8px; margin:10px 0; } .controls button { width:auto; flex:1; min-width:140px; } pre { font-size:13px; white-space:pre-wrap; word-break:break-all; } #status { margin:15px 0; padding:12px; background:#222; border-radius:8px; } </style> </head> <body> <h1>Nostr Mass Delete v3 + NIP-62</h1> <input type="password" id="nsec" placeholder="nsec1... your private key" autocomplete="off"> <button id="connect">Connect & Fetch</button> <div id="status"></div> <div id="controls" style="display:none;"> <select id="kind"> <option value="1">Kind 1 — Notes</option> <option value="3">Kind 3 — Contacts / Follows</option> <option value="7">Kind 7 — Reactions</option> <option value="30023">Kind 30023 — Long-form</option> <option value="0">Kind 0 — Profile (careful)</option> </select> <div class="controls"> <button class="secondary" id="selectAll">Select All</button> <button class="secondary" id="selectNone">Select None</button> <button id="deleteAllFetched">🗑️ Delete ALL Fetched</button> </div> <button id="fetchMore">Fetch More Events</button> <div class="controls"> <button class="danger" id="vanishCurrent">🌪️ Vanish on Current Relays (NIP-62)</button> <button class="danger" id="vanishGlobal">☢️ Global Vanish (ALL_RELAYS)</button> </div> </div> <div id="events"></div> <button id="deleteSelected" style="display:none;" class="danger">Delete Selected</button> <script> let pool, sk, pubkey; let RELAYS = [ "wss://relay.damus.io", "wss://nos.lol", "wss://relay.primal.net", "wss://nostr.wine", "wss://relay.nostr.band", "wss://nostr.orangepill.dev", "wss://relay.snort.social", "wss://eden.nostr.land", "wss://nostr-pub.wellorder.net", "wss://nostr.mom", "wss://relay.current.fyi", "wss://nostr.rocks", "wss://relay.nostr.bg", "wss://nostr.fmt.wiz.biz", "wss://nostr.oxtr.dev", "wss://nostr.bitcoiner.social", "wss://relay.nos.social", "wss://nostr21.com", "wss://premium.primal.net", "wss://relay.nostrplebs.com", "wss://relay.mostr.pub", "wss://relay.ditto.pub", "wss://temp.iris.to", "wss://vault.iris.to", // Add your private/paid relays here ]; async function connect() { /* same as before */ const nsec = document.getElementById('nsec').value.trim(); if (!nsec.startsWith('nsec1')) return alert('Enter valid nsec'); try { sk = NostrTools.nip19.decode(nsec).data; pubkey = NostrTools.getPublicKey(sk); document.getElementById('status').innerHTML = `✅ Connected as ${NostrTools.nip19.npubEncode(pubkey).slice(0,12)}...`; document.getElementById('controls').style.display = 'block'; fetchEvents(); } catch(e) { alert('Invalid nsec'); } } async function fetchEvents() { /* unchanged from v2, but supports kind 3 */ const kind = parseInt(document.getElementById('kind').value); const status = document.getElementById('status'); const eventsDiv = document.getElementById('events'); eventsDiv.innerHTML = ''; status.innerHTML += `<p>Fetching kind ${kind}...</p>`; pool = new NostrTools.SimplePool(); const sub = pool.subscribeMany(RELAYS, [{ kinds: [kind], authors: [pubkey], limit: 200 }], { onevent: (event) => { const div = document.createElement('div'); div.className = 'event'; div.innerHTML = ` <label><input type="checkbox" class="select-event" data-id="${event.id}" checked> ${new Date(event.created_at * 1000).toLocaleString()}</label><br> <pre>${(event.content || JSON.stringify(event.tags || [])).substring(0, 200)}...</pre> `; eventsDiv.appendChild(div); }, oneose: () => status.innerHTML += '<p>Fetch complete.</p>' }); setTimeout(() => sub.close(), 45000); } function toggleAll(checked) { document.querySelectorAll('.select-event').forEach(cb => cb.checked = checked); } async function deleteEvents(ids) { /* unchanged */ if (!ids.length || !confirm(`Delete ${ids.length} events?`)) return; const status = document.getElementById('status'); pool = new NostrTools.SimplePool(); for (let id of ids) { const delEvent = { kind: 5, created_at: Math.floor(Date.now()/1000), content: 'Mass delete', tags: [['e', id], ['k', '1']] }; const signed = NostrTools.finalizeEvent(delEvent, sk); await Promise.any(pool.publish(RELAYS, signed)).catch(()=>{}); status.innerHTML += `🗑️ ${id.slice(0,12)}...<br>`; } status.innerHTML += `<p>✅ Deletion requests sent.</p>`; } async function sendVanish(toAll = false) { if (!confirm(toAll ? 'GLOBAL VANISH — Request ALL relays to delete everything?' : 'Send Vanish request to current relays?')) return; const status = document.getElementById('status'); pool = new NostrTools.SimplePool(); const tags = toAll ? [['relay', 'ALL_RELAYS']] : RELAYS.map(r => ['relay', r]); const vanishEvent = { kind: 62, created_at: Math.floor(Date.now() / 1000), content: 'Mass cleanup via tool — please delete all my events', tags: tags }; const signed = NostrTools.finalizeEvent(vanishEvent, sk); const targets = toAll ? RELAYS : RELAYS; for (let relay of targets) { try { await pool.publish([relay], signed); status.innerHTML += `🌪️ Vanish sent to ${relay}<br>`; } catch(e) {} } status.innerHTML += `<p><strong>✅ NIP-62 Vanish requests sent!</strong></p>`; } // Listeners document.getElementById('connect').onclick = connect; document.getElementById('fetchMore').onclick = fetchEvents; document.getElementById('selectAll').onclick = () => toggleAll(true); document.getElementById('selectNone').onclick = () => toggleAll(false); document.getElementById('deleteAllFetched').onclick = () => { const ids = Array.from(document.querySelectorAll('.select-event')).map(cb => cb.dataset.id); deleteEvents(ids); }; document.getElementById('deleteSelected').onclick = () => { const ids = Array.from(document.querySelectorAll('.select-event:checked')).map(cb => cb.dataset.id); deleteEvents(ids); }; document.getElementById('vanishCurrent').onclick = () => sendVanish(false); document.getElementById('vanishGlobal').onclick = () => sendVanish(true); </script> </body> </html>