CrossWatch - v0.7.0
This release has many many many changes and big changes. Really big!.....
- Existing users: you’ll see a migration window. It wipes the old cache. After upgrading and migrating, do a hard cache refresh in your browser (CTR-F5)
- New users: you'll get a welcome message that opens op the settings page for you.
The orchestrator got a serious overhaul, which means bugs are more likely. So watch your step and report bugs!
It’ll take some iterations/versions to get things fine-tuned, but this major change was absolute necessary.
Analyzer and Editor still aren’t perfect, but they’re functional enough to get the job done....
IMPORTANT:
i've also fixed a real murder bug that was in v0.6.4. Going to Settings could kick off an infinite /api/config request loop, basically freezing CrossWatch.
Orchestrator state vs Pair-scoped provider caches (what changed in v0.7.0)
CrossWatch now clearly separates global orchestration state from pair-specific provider caches.
This means that the old provider caches are useless and needs to be recreated.
Global
- Baselines & drop-guard remain global per provider and feature.
- Used for sanity checksand delta safety.
- Manual blocks / allow-lists remain global.
- If you block an item via the Editor state.json, it’s filtered out of planning across all pairs where that provider and feature applies.
- If you block an item via the Editor Pair cache, it’s filtered out of planning for that specific pair only.
Pair-scoped (new provider-side caches/shadows)
- Providers now store watermarks, snapshots and write-through shadows per pair scope.
This means:
- Multiple pairs can run without overwriting each other’s cached snapshots/watermarks.
- Providers can safely reuse cached “present” indexes (when activities timestamps match) without risking cross-pair contamination.
- Less API traffic because “unchanged” states can reuse pair-local shadows instead of re-fetching full lists.
Practical impact
- Reliability improves in multi-pair setups: pairs no longer “move the clock” for each other.
- State editing still works: blocking items in the Editor still affects planning (global policy),
while pair-scoped files only affect provider caching behavior and incremental checkpoints.
🔧 Fixes & Improvements
FIX: Scrobble settings leak fix
- Navigating to Settings could previously trigger an infinite request loop to
/api/config, effectively freezing CrossWatch.
This is now fixed: the scrobbler is properly gated and no longer hammers/api/config.
Pair-specific watermarks (SIMKL, TRAKT, MDBList)
- SIMKLand MDBList now use pair-specific watermarks
- Every sync pair keeps its own “last synced” timestamps per feature (watchlist / ratings / history).
- This prevents one pair from “moving the clock forward” for another pair and accidentally skipping items.
MDBList
- New: Watch History support
- MDBList can now sync your watch history in addition to watchlist and ratings.
- i've also updated the /scripts/mdblist_cleanup.py with watch history support and fixed pagination issue with ratings.
Pair deletion cleanup
- New: Pair-scoped cache cleanup on delete
- When a sync pair is deleted, CrossWatch now removes the corresponding pair-scoped provider cache/shadow files from
.cw_state. - Prevents stale cache buildup and avoids old pair artifacts lingering after cleanup.
- When a sync pair is deleted, CrossWatch now removes the corresponding pair-scoped provider cache/shadow files from
UI / Status Probes (API call reduction)
- Reduced provider API calls on browser refresh
- Some UI improvements in settings
- Scrobbe/Watcher UI fine-tuned.
Auth UI reliability
- Popup opening made consistent across providers
- SIMKL now opens a blank tab immediately on click, then navigates to the real authorize URL once fetched (prevents popup blockers from killing the flow).
- Trakt now shows a clear warning when the activation tab is blocked by the browser ("Popup blocked - allow popups and try again").
- Plex now shows the same warning when the link tab is blocked, and closes the placeholder tab if PIN creation fails.
- Some consitancy tweaks across all providers
Watcher Scrobble sinks (Trakt - MDBList - SIMKL)
- Progress throttling to reduce API calls
- Trakt, MDBList, and SIMKL scrobble sinks now support sending progress updates in steps (default: 5%*).
- This turns “~one call per 1%” into “~one call per 5%”, which is a big drop in API traffic during long plays.
- This value can be adjusted in Watcher/Advanced (1%-25%) where 1% is almost realtime (most API calls) and 25% acts more like webhooks (minimum API calls)