Version 0.7

Release 0.7.0

  • Tag: v0.7.0

  • Published: 2026-01-18T19:39:48Z

  • GitHub: 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!.....

1

Migration / First-run notes

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 up the settings page for you.

circle-exclamation
triangle-exclamation

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.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

  • 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.