From 815bea7f1edeb2b00ce96a1614f4ed9f151c3b11 Mon Sep 17 00:00:00 2001 From: thorsten Date: Thu, 27 Aug 2026 18:35:22 +0200 Subject: [PATCH 1/8] Follow reposts to their own tab (#64) --- extension/manifest.json | 2 +- extension/src/background.ts | 2 +- release-notes/v3.5.1.md | 12 ++++++++++++ scripts/build-standalone.mjs | 2 +- src-tauri/Cargo.lock | 2 +- src-tauri/Cargo.toml | 2 +- src-tauri/src/commands/site.rs | 4 ++-- src-tauri/tauri.conf.json | 2 +- 8 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 release-notes/v3.5.1.md diff --git a/extension/manifest.json b/extension/manifest.json index 9cfa4e0..fbe713f 100644 --- a/extension/manifest.json +++ b/extension/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "CleanMyPosts", - "version": "1.0.0", + "version": "1.0.1", "description": "Bulk-delete your posts, replies, reposts, likes and followings on X, and your comments and liked videos on YouTube.", "icons": { "32": "icons/32x32.png", diff --git a/extension/src/background.ts b/extension/src/background.ts index 3d15428..61f98e8 100644 --- a/extension/src/background.ts +++ b/extension/src/background.ts @@ -43,7 +43,7 @@ function targetUrl(platform: Platform, action: Action, userName: string): string case 'deleteReplies': return `https://x.com/${user}/with_replies`; case 'deleteReposts': - return `https://x.com/${user}`; + return `https://x.com/${user}/reposts`; case 'deleteLikes': return `https://x.com/${user}/likes`; case 'deleteFollowing': diff --git a/release-notes/v3.5.1.md b/release-notes/v3.5.1.md new file mode 100644 index 0000000..cdadaa6 --- /dev/null +++ b/release-notes/v3.5.1.md @@ -0,0 +1,12 @@ +### What's Changed + +**Reposts moved, the app follows** + +- Fix: X moved reposts off the profile timeline into a Reposts tab of their own. Deleting + reposts still opened the profile, found nothing there that could be unretweeted, and + reported nothing to remove (#64). The app and the extension now open + `x.com//reposts`, which is where the reposts went. +- Fix: The standalone script for reposts names the Reposts tab as the page to run it on. + Download it again if you kept a copy. + +The extension carries the same fix on its own version line as v1.0.1. diff --git a/scripts/build-standalone.mjs b/scripts/build-standalone.mjs index ffb8355..d34a839 100644 --- a/scripts/build-standalone.mjs +++ b/scripts/build-standalone.mjs @@ -41,7 +41,7 @@ const ACTIONS = [ file: 'cleanmyposts-x-delete-reposts', from: 'x/reposts', name: 'repostsAction', - page: 'your profile' + page: 'your profile’s Reposts tab' }, { file: 'cleanmyposts-x-delete-likes', from: 'x/likes', name: 'likesAction', page: 'your likes' }, { diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 1b4a9f3..e15a499 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -518,7 +518,7 @@ dependencies = [ [[package]] name = "cleanmyposts" -version = "3.5.0" +version = "3.5.1" dependencies = [ "dirs", "keyring", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 2174371..0131812 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cleanmyposts" -version = "3.5.0" +version = "3.5.1" description = "Bulk-delete your posts, reposts, replies, likes and comments on X and YouTube" authors = ["thorstenalpers"] repository = "https://github.com/thorstenalpers/CleanMyPosts" diff --git a/src-tauri/src/commands/site.rs b/src-tauri/src/commands/site.rs index f6bc74f..5772032 100644 --- a/src-tauri/src/commands/site.rs +++ b/src-tauri/src/commands/site.rs @@ -23,7 +23,7 @@ fn target_url(platform: &str, action: &str, user_name: &str) -> Option { ("x", "showReplies" | "deleteReplies") => { format!("https://x.com/{user}/with_replies") } - ("x", "showReposts" | "deleteReposts") => format!("https://x.com/{user}"), + ("x", "showReposts" | "deleteReposts") => format!("https://x.com/{user}/reposts"), ("x", "showLikes" | "deleteLikes") => format!("https://x.com/{user}/likes"), ("x", "showFollowing" | "deleteFollowing") => { format!("https://x.com/{user}/following") @@ -663,7 +663,7 @@ mod tests { ); assert_eq!( target_url("x", "deleteReposts", "someuser").unwrap(), - "https://x.com/someuser" + "https://x.com/someuser/reposts" ); assert_eq!( target_url("x", "deleteLikes", "someuser").unwrap(), diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 958eb0c..2c1e204 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "CleanMyPosts", - "version": "3.5.0", + "version": "3.5.1", "identifier": "com.thorstenalpers.cleanmyposts", "build": { "frontendDist": "../build", From a6ad59ff5578714c422d33ff59afeea0d4c83cd7 Mon Sep 17 00:00:00 2001 From: thorsten Date: Thu, 27 Aug 2026 18:56:56 +0200 Subject: [PATCH 2/8] Reload button beside the address in the header --- release-notes/v3.5.1.md | 5 +++++ src/lib/components/page-header.svelte | 16 ++++++++++++++++ src/lib/i18n/ar.ts | 1 + src/lib/i18n/de.ts | 1 + src/lib/i18n/en.ts | 1 + src/lib/i18n/es.ts | 1 + src/lib/i18n/fr.ts | 1 + src/lib/i18n/hi.ts | 1 + src/lib/i18n/it.ts | 1 + src/lib/i18n/ja.ts | 1 + src/lib/i18n/pt.ts | 1 + src/lib/i18n/ru.ts | 1 + src/lib/i18n/zh.ts | 1 + src/routes/+layout.svelte | 3 +++ 14 files changed, 35 insertions(+) diff --git a/release-notes/v3.5.1.md b/release-notes/v3.5.1.md index cdadaa6..9c4d979 100644 --- a/release-notes/v3.5.1.md +++ b/release-notes/v3.5.1.md @@ -9,4 +9,9 @@ - Fix: The standalone script for reposts names the Reposts tab as the page to run it on. Download it again if you kept a copy. +**Elsewhere** + +- New: A reload button sits left of the address in the header while X or YouTube is up — + the same reload a run already does when it finishes, now one click away. + The extension carries the same fix on its own version line as v1.0.1. diff --git a/src/lib/components/page-header.svelte b/src/lib/components/page-header.svelte index 720d3a0..75b6a95 100644 --- a/src/lib/components/page-header.svelte +++ b/src/lib/components/page-header.svelte @@ -4,6 +4,7 @@ import LanguageMenu from '$lib/components/language-menu.svelte'; import ModeToggle from '$lib/components/mode-toggle.svelte'; import PanelLeftIcon from '@lucide/svelte/icons/panel-left'; + import RefreshCwIcon from '@lucide/svelte/icons/refresh-cw'; import SparklesIcon from '@lucide/svelte/icons/sparkles'; import { cn } from '$lib/utils'; import type { SettingsStore } from '$lib/stores/settings.svelte'; @@ -28,6 +29,8 @@ * it, so this is the way back. */ onOpenActions?: () => void; + /** Given only while a platform is up: the app's own pages have nothing to reload. */ + onReload?: () => void; /** The assistant lives in the app's own column, so its way in belongs in this bar. */ onToggleAssistant?: () => void; assistantOpen?: boolean; @@ -40,6 +43,7 @@ iconOnly = false, settingsStore, onMenuOpenChange, + onReload, onOpenActions, onToggleAssistant, assistantOpen = false @@ -67,6 +71,18 @@ {title} + {#if onReload} + + {/if} + = { 'assistant.dismiss': 'إخفاء', 'header.url': 'أنت هنا', + 'header.reload': 'إعادة تحميل الصفحة', 'log.column.time': 'الوقت', 'log.column.level': 'المستوى', diff --git a/src/lib/i18n/de.ts b/src/lib/i18n/de.ts index e9af0e7..4dd9c72 100644 --- a/src/lib/i18n/de.ts +++ b/src/lib/i18n/de.ts @@ -345,6 +345,7 @@ export const de: Record = { 'assistant.dismiss': 'Ausblenden', 'header.url': 'Du bist hier', + 'header.reload': 'Seite neu laden', 'log.column.time': 'Zeit', 'log.column.level': 'Stufe', diff --git a/src/lib/i18n/en.ts b/src/lib/i18n/en.ts index dd9343c..f872d02 100644 --- a/src/lib/i18n/en.ts +++ b/src/lib/i18n/en.ts @@ -346,6 +346,7 @@ export const en = { 'assistant.dismiss': 'Dismiss', 'header.url': 'You are here', + 'header.reload': 'Reload page', 'log.column.time': 'Time', 'log.column.level': 'Level', diff --git a/src/lib/i18n/es.ts b/src/lib/i18n/es.ts index edad9a7..0af4294 100644 --- a/src/lib/i18n/es.ts +++ b/src/lib/i18n/es.ts @@ -342,6 +342,7 @@ export const es: Record = { 'assistant.dismiss': 'Ocultar', 'header.url': 'Estás aquí', + 'header.reload': 'Recargar la página', 'log.column.time': 'Hora', 'log.column.level': 'Nivel', diff --git a/src/lib/i18n/fr.ts b/src/lib/i18n/fr.ts index 5cfbe1a..bc6c09c 100644 --- a/src/lib/i18n/fr.ts +++ b/src/lib/i18n/fr.ts @@ -344,6 +344,7 @@ export const fr: Record = { 'assistant.dismiss': 'Masquer', 'header.url': 'Tu es ici', + 'header.reload': 'Recharger la page', 'log.column.time': 'Heure', 'log.column.level': 'Niveau', diff --git a/src/lib/i18n/hi.ts b/src/lib/i18n/hi.ts index 64f974d..b909441 100644 --- a/src/lib/i18n/hi.ts +++ b/src/lib/i18n/hi.ts @@ -335,6 +335,7 @@ export const hi: Record = { 'assistant.dismiss': 'हटाएँ', 'header.url': 'आप यहाँ हैं', + 'header.reload': 'पेज फिर से लोड करें', 'log.column.time': 'समय', 'log.column.level': 'स्तर', diff --git a/src/lib/i18n/it.ts b/src/lib/i18n/it.ts index b32957c..d4f3f1f 100644 --- a/src/lib/i18n/it.ts +++ b/src/lib/i18n/it.ts @@ -342,6 +342,7 @@ export const it: Record = { 'assistant.dismiss': 'Nascondi', 'header.url': 'Sei qui', + 'header.reload': 'Ricarica la pagina', 'log.column.time': 'Ora', 'log.column.level': 'Livello', diff --git a/src/lib/i18n/ja.ts b/src/lib/i18n/ja.ts index fe36c18..342edc7 100644 --- a/src/lib/i18n/ja.ts +++ b/src/lib/i18n/ja.ts @@ -333,6 +333,7 @@ export const ja: Record = { 'assistant.dismiss': '閉じる', 'header.url': '現在の場所', + 'header.reload': 'ページを再読み込み', 'log.column.time': '時刻', 'log.column.level': 'レベル', diff --git a/src/lib/i18n/pt.ts b/src/lib/i18n/pt.ts index dc56ad4..24f7efd 100644 --- a/src/lib/i18n/pt.ts +++ b/src/lib/i18n/pt.ts @@ -341,6 +341,7 @@ export const pt: Record = { 'assistant.dismiss': 'Esconder', 'header.url': 'Estás aqui', + 'header.reload': 'Recarregar a página', 'log.column.time': 'Hora', 'log.column.level': 'Nível', diff --git a/src/lib/i18n/ru.ts b/src/lib/i18n/ru.ts index 3a6dd3e..5aa5967 100644 --- a/src/lib/i18n/ru.ts +++ b/src/lib/i18n/ru.ts @@ -337,6 +337,7 @@ export const ru: Record = { 'assistant.dismiss': 'Скрыть', 'header.url': 'Вы здесь', + 'header.reload': 'Перезагрузить страницу', 'log.column.time': 'Время', 'log.column.level': 'Уровень', diff --git a/src/lib/i18n/zh.ts b/src/lib/i18n/zh.ts index f23cbdd..9f3ace3 100644 --- a/src/lib/i18n/zh.ts +++ b/src/lib/i18n/zh.ts @@ -320,6 +320,7 @@ export const zh: Record = { 'assistant.dismiss': '关闭', 'header.url': '你在这里', + 'header.reload': '重新加载页面', 'log.column.time': '时间', 'log.column.level': '级别', diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index d2093de..7826c7f 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -555,6 +555,9 @@ {location} {settingsStore} onMenuOpenChange={(open: boolean) => (headerMenuOpen = open)} + onReload={railPlatform + ? () => void bridge.call('site.reload', { platform: railPlatform }).catch(() => {}) + : undefined} onToggleAssistant={assistantReady ? () => (assistantOpen = !assistantOpen) : undefined} assistantOpen={assistantVisible} onOpenActions={railPlatform && !panelVisible From 45d61d4e893e672cced90d4f69676e4178f98ff6 Mon Sep 17 00:00:00 2001 From: thorsten Date: Thu, 27 Aug 2026 19:06:48 +0200 Subject: [PATCH 3/8] Move the reload button left of the platform name --- release-notes/v3.5.1.md | 2 +- src/lib/components/page-header.svelte | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/release-notes/v3.5.1.md b/release-notes/v3.5.1.md index 9c4d979..13c5371 100644 --- a/release-notes/v3.5.1.md +++ b/release-notes/v3.5.1.md @@ -11,7 +11,7 @@ **Elsewhere** -- New: A reload button sits left of the address in the header while X or YouTube is up — +- New: A reload button sits left of the platform name in the header while X or YouTube is up — the same reload a run already does when it finishes, now one click away. The extension carries the same fix on its own version line as v1.0.1. diff --git a/src/lib/components/page-header.svelte b/src/lib/components/page-header.svelte index 75b6a95..914b84c 100644 --- a/src/lib/components/page-header.svelte +++ b/src/lib/components/page-header.svelte @@ -62,15 +62,6 @@ {/if} - {#if icon} - {@const Icon = icon} - - {/if} - - - {title} - - {#if onReload} {/if} - {#if onReload} - - {/if} - {#if icon} {@const Icon = icon} @@ -83,15 +88,37 @@ {title} - - {location} - + {#if onNavigate} + + {:else} + + {location} + + {/if}
+ {#if onReload} + + {/if} {#if onToggleAssistant}