github cenodude/CrossWatch v0.7.0
Release 0.7.0

latest release: v0.7.1
9 hours ago

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.

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)

Don't miss a new CrossWatch release

NewReleases is sending notifications on new releases.