mirror of
https://github.com/Shik3i/KoalaSync.git
synced 2026-07-26 12:08:15 +00:00
95ff460856
Two issues surfaced by a holistic audit of the combined desync-persist + reconcile-on-init changes: 1. Stale desync outside gated-guest state. hcmDesynced is persisted, but neither ROOM_DATA nor CONTROL_MODE cleared it when the local peer became host or the room switched to 'everyone'. Combined with reconcile-on-init, a desynced guest promoted to host (host-leave fallback) while content was reloading could re-adopt desynced=true — self-labelling "Solo" to all peers and ignoring host commands in 'everyone' mode. Enforce the invariant centrally (hcmEnforceDesyncInvariant: desynced ⟹ host-only && !host) on every role/mode change, and guard the content reconcile to only adopt when actually a gated guest. 2. Solo-badge flicker. The host-side PEER_STATUS handler set peer.desynced unconditionally, but the background-driven keepAlive heartbeat omits the field — so every ~30s it clobbered desynced to false, flickering the badge. Only update when present (matching the sibling fields), and include desynced in the background heartbeat so both heartbeat sources are consistent. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
KoalaSync Browser Extension
A Manifest V3 Browser Extension (Chrome & Firefox) for synchronized video playback across any website.
Key Features
- Manifest V3: Optimized Service Worker architecture with session persistence.
- Pure Vanilla JS: No external dependencies or heavy libraries.
- Smart Peer IDs: Hexadecimal IDs combined with customizable Usernames for easy identification.
- On-Demand Connection: The service worker only maintains a WebSocket connection while you're in a room. No persistent background connections — privacy-first architecture. Based on
connectIntentflag that gates all reconnect attempts. - Live Diagnostics: Built-in "Dev" tab for real-time video state debugging (ReadyState, CurrentTime, etc.).
- Dynamic i18n (Multi-Language): Fully localized in 13 languages (
en,de,fr,es,it,pl,tr,nl,ja,ko,pt-BR,pt,ru) with auto-detected fallback and dynamic on-the-fly language selectors.
Tab Overview
- Room: Manage connections, view active peers, and share invitation links.
- Sync: Control video playback (Play/Pause/Force Sync) and view recent activity.
- Settings: Customize your Username, toggle domain-based Noise Filtering, and switch the App Language.
- Dev: Monitor connection status and view real-time video element metadata for debugging.
Privacy & Permissions
KoalaSync requires <all_urls> permission to detect and interact with video elements (<video>) on websites.
- No Browsing History: We do not track or store your browsing history.
- State Management: Sensitive data (Room Passwords) is stored locally using
chrome.storage. - Zero Telemetry: No analytics or external tracking scripts.
- Zero Runtime Dependencies: The extension is built with pure Vanilla JS and contains no external libraries or tracking scripts, ensuring performance and privacy.
Installation
- Prepare Extension: From the repository root, run:
npm run build:extension - Open Chrome and go to
chrome://extensions/. - Enable Developer mode (top right).
- Click Load unpacked and select the
dist/chromefolder.
Development
If you modify shared/constants.js, you must synchronize the changes by running the build script from the root:
npm run build:extension
This ensures that the extension/shared folder is updated with the latest protocol constants.
Module Structure
| File | Purpose |
|---|---|
background.js |
Service worker: message routing, tab listeners, startup |
content.js |
Video detection, audio processing, episode transition (IIFE) |
popup.js |
Popup UI: join/create, tabs, status, settings |
bridge.js |
Landing page bridge (injected into sync.koalastuff.net) |
episode-utils.js |
Shared extractEpisodeId() / sameEpisode() — used by background.js, injected into content.js at build time |
i18n.js |
Translation loader |
shared/ |
Constants, blacklist, name generator |