Version 0.7
Release 0.7.0
Tag:
v0.7.0Published:
2026-01-18T19:39:48ZGitHub: https://github.com/cenodude/CrossWatch/releases/tag/v0.7.0
CrossWatch - v0.7.0
This release has many many many changes and big changes. Really big!.....
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 absolutely necessary. Analyzer and Editor still aren’t perfect, but they’re functional enough to get the job done...
IMPORTANT: I've fixed a critical bug present in v0.6.4 where going to Settings could kick off an infinite /api/config request loop, effectively 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 need to be recreated.
Global
Baselines & drop-guard remain global per provider and feature.
Used for sanity checks and 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)
SIMKL and 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.
Updated the
/scripts/mdblist_cleanup.pywith 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.
UI / Status Probes (API call reduction)
Reduced provider API calls on browser refresh
Some UI improvements in settings
Scrobble/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 consistency 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)
*Note: The default 5% is mentioned above; adjust via Watcher/Advanced to fit your preference.