diff --git a/README.md b/README.md
index 9215e0e..de0709f 100644
--- a/README.md
+++ b/README.md
@@ -138,7 +138,7 @@ gh attestation verify dist/koalasync-chrome.zip \
---
-

+
Built with ❤️ by Shik3i. KoalaSync is Open Source under the MIT License.
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 5f4635c..aefa3af 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -7,7 +7,7 @@ All notable changes to the KoalaSync browser extension and relay server.
## [v2.4.2] — 2026-06-19
### Changed
-- **Extension: Optimized uninstall URL registration** — Extracted registration into a reusable, race-condition-protected `initUninstallURL()` helper. It now generates a unique, anonymous token (`t`) stored in `chrome.storage.local` to securely track uninstalls, and registers the URL on both extension installation/update and browser startup to prevent state loss.
+- **Extension: Optimized uninstall URL registration** — Extracted registration into a reusable, race-condition-protected `initUninstallURL()` helper. It registers the uninstall feedback URL with browser context on both extension installation/update and browser startup to prevent state loss, without storing or sending an installation token.
## [v2.4.1] — 2026-06-19
@@ -149,7 +149,7 @@ All notable changes to the KoalaSync browser extension and relay server.
- **Feature Hint System**: Generic `dismissedHints` array in sync storage for announcing new features. First hint highlights the Audio Options entry in Settings. Extensible for future features.
### Changed
-- **Ko-Fi Support Links**: Static footer badges on the Settings and Status tabs linking to the developer's support page. README and website footer updated with Ko-Fi badge.
+- **Support Links**: Static footer badges on the Settings and Status tabs linking to the developer's support page. README and website footer updated with a Support KoalaSync badge.
### Fixed
- **Portuguese (PT) locale**: Removed Italian contamination — "sincronizzazione" → "sincronização", "tempo reale" → "tempo real", "Link di Invito" → "Link de Convite", "Sair della Sala" → "Sair da Sala".
diff --git a/extension/background.js b/extension/background.js
index f184038..ee26bfa 100644
--- a/extension/background.js
+++ b/extension/background.js
@@ -19,24 +19,8 @@ async function initUninstallURL() {
if (UNINSTALL_URL && UNINSTALL_URL.trim() !== '') {
try {
- if (typeof chrome === 'undefined' || !chrome.storage || !chrome.storage.local) {
- console.warn("Storage API not available, skipping uninstall URL token generation");
- return;
- }
-
- const data = await chrome.storage.local.get("koalaByeToken");
- let token = data?.koalaByeToken;
-
- if (!token) {
- token = (typeof self.crypto !== 'undefined' && typeof self.crypto.randomUUID === 'function')
- ? self.crypto.randomUUID()
- : Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
- await chrome.storage.local.set({ koalaByeToken: token });
- }
-
const url = new URL(UNINSTALL_URL);
url.searchParams.set("browser", BROWSER_TYPE);
- url.searchParams.set("t", token);
const runtimeAPI = typeof browser !== 'undefined' ? browser.runtime : chrome.runtime;
if (runtimeAPI && runtimeAPI.setUninstallURL) {
@@ -1751,11 +1735,16 @@ async function handleAsyncMessage(message, sender, sendResponse) {
sendResponse({ status: 'ok' });
} else if (message.type === 'CMD_ACK') {
const commandSenderId = message.commandSenderId;
- if (commandSenderId && commandSenderId !== peerId) {
- emit(EVENTS.EVENT_ACK, {
- senderId: peerId,
+ // Only ACK if the command sender is still a known peer in our room.
+ // If we've already seen their PEER_STATUS 'left', skip the ACK — it would
+ // only be dropped server-side as an absent-peer ACK anyway.
+ const senderStillPresent = currentRoom && Array.isArray(currentRoom.peers) &&
+ currentRoom.peers.some(p => (typeof p === 'object' ? p.peerId : p) === commandSenderId);
+ if (commandSenderId && commandSenderId !== peerId && senderStillPresent) {
+ emit(EVENTS.EVENT_ACK, {
+ senderId: peerId,
targetId: commandSenderId,
- actionTimestamp: message.actionTimestamp
+ actionTimestamp: message.actionTimestamp
});
}
sendResponse({ status: 'ok' });
diff --git a/shared/constants.js b/shared/constants.js
index dfa1298..7e16878 100644
--- a/shared/constants.js
+++ b/shared/constants.js
@@ -13,7 +13,6 @@ export const OFFICIAL_SERVER_URL = 'wss://syncserver.koalastuff.net';
export const OFFICIAL_LANDING_PAGE_URL = 'https://sync.koalastuff.net';
export const OFFICIAL_SERVER_TOKEN = '62170b705234c4f4807a9b22420bb93cf1a2aacfa4c5d3b47804482babb8eb50';
export const SUPPORT_URL = 'https://support.koalastuff.net';
-export const KOFI_URL = 'https://ko-fi.com/koaladev';
export const GITHUB_URL = 'https://github.com/Shik3i/KoalaSync';
export function isFirefox() {