github cenodude/CrossWatch v0.7.7
Update 0.7.7

10 hours ago

CrossWatch - v0.7.7

This update overhauls the Settings UI to make it much easier to navigate.
Plex, Emby, Jellyfin, Scrobbler (Webhooks and Watcher), Metadata, Scheduling, and general Settings are now grouped and organized more clearly.

✨ Highlights

  • Settings UI overhaul
    • Cleaner navigation with better grouping and less scrolling
    • Media servers: Plex / Jellyfin / Emby
    • Scrobbler: Webhooks and Watcher, now easier to manage
    • Metadata and Scheduling reorganized for faster access
    • General Settings improved layout and discoverability

CrossWatch - v0.7.6

This update fixes the episode titles in the UI for History & Ratings.
Adds optional authentication for people who don’t want CrossWatch UI wide open.

✨ Highlights

  • Security: Optional UI authentication
    • Enable it in Settings (UI / Security / CW Tracker) turn on authentication and set a username and password.
    • 30-day “remember me” login once you sign in.

🔧 Fixes & Improvements

  • UI: History & Ratings episode titles

    • Correct episode formatting: episodes now show as Show - S01E01 where possible
    • No more “title flip” after loading: the dashboard no longer overwrites the run summary spotlight items with a simplified version from the insights refresh.
    • More consistent spotlight details: CW keeps episode metadata (show name and season/episode) so the lanes stay stable and readable.
  • UI: Provider library whitelists no longer reset

    • Whitelists are preserved on Save after restarts: Plex/Emby/Jellyfin library selections won’t get wiped just because you restarted the container and hit Save.

CrossWatch - v0.7.5

Sorry people, I normally don’t push two updates in a day, but this one brings some nice performance boosts. Didn’t want to make you wait.

🔧 Fixes & Improvements

  • Performance & stability

    • Less CPU usage when idle: the server no longer keeps re-reading and re-decoding the same big JSON “state” file over and over.
    • Faster dashboard updates: run summaries (the “lanes” / timeline view) are now cached and only recalculated when something actually changed.
    • Smoother streaming updates: the live status stream uses a lightweight change-check instead of repeatedly rebuilding huge JSON strings.
  • Watchers (Plex / Jellyfin / Emby)

    • Smarter polling: watchers back off when nothing is playing, so they don’t waste cycles.
    • Fewer redundant lookups: TV show ID lookups are cached, so episode scrobbles don’t trigger extra network calls all the time.
    • Cleaner event output: fewer duplicate start/pause/stop events, which makes the sync timeline less noisy.
  • UI (Synchronize button)

    • Returning to the main screen now triggers an immediate refresh, so the Synchronize button becomes available right away.
    • More reliable enable/disable logic: the button state is based on real conditions.

CrossWatch - v0.7.4

🔧 Fixes & Improvements

  • Optimalizations

    • The core script now loads only what’s needed for the current screen.
    • CSS cleanup: branding styles are merged and more consistent.
    • Removed duplicate progress handling so the progress bar and sync timeline behave more reliably.
    • Removed leftover/unused code that could cause small edge-case glitches.
  • Cleaner provider icons in Settings

    • Provider logos now only show when that provider is actually configured (instead of showing everything).
    • Scrobbler icons now reflect your enabled Watcher provider and selected sinks (instead of showing everything).
  • SIMKL and Trakt auth behaves better after approval

    • “Waiting for token” polling is smarter: ~2s intervals for ~30s, then it slows down.
    • Switching back to the CrossWatch tab triggers an immediate check (no unnecessary waiting).
  • SIMKL history sync includes completed shows and anime

    • Fixed an issue where shows/anime could disappear from the snapshot after finishing the final episode.
  • Fewer API calls, faster syncs (new batching controls)

    • Added provider-specific batching controls so large syncs can run with fewer requests.
    • Default behavior stays the same (safe 100), but you can override per provider when needed (such as SIMKL).
    • Config-only (for now): currently only SIMKL is wired up; other providers will keep the default until they’re tested and added.

read here for updated orchestrator

Example config.json

"apply_chunk_size_by_provider": {
  "SIMKL": 500,    <-- currently added
  "TRAKT": 500,
  "MDBLIST": 500
}

CrossWatch - v0.7.3

🔧 Fixes & Improvements

  • Auth providers now load only when needed

    • Authentication provider are no longer loaded on every page load.
    • This reduces initial network requests and keeps the UI lighter.
  • Orchestrator: history

    • Fixed a bug where episode entries could be mistaken as “already synced” when the show existed on target provider.
    • Fixed a matching bug that could cause ghost changes during history sync (planned adds that end up being skipped).
    • Result: more accurate history syncs and less noisy sync summaries.
  • Plex authentication UI improvement

    • Clear warning when Plex Media Server (PMS) can’t be reached
    • If Plex account auth succeeds but the configured PMS URL is wrong/unreachable, CrossWatch now shows:
      • Connected, but PMS is not reachable - validate settings.
  • MDBList provider history sync is more stable

    • No more “remove everything / add everything back” loops.
    • MDBList show/season summary entries are ignored; only real history items are synced.
    • Sync summary no longer shows fake “skipped” items when MDBList processes bulk updates.
    • Prevents fake “+1 rating” changes caused by invalid IMDb IDs.

CrossWatch - v0.7.2

🔧 Fixes & Improvements

  • API and performance improvement (SIMKL/TRAKT/MDBLIST)

    • Removed “episode title enrichment” lookups during sync. This was too API-intensive.
      • Episode entries from now on display as Show Name - S01E01 and not the episode title anymore.
    • Prevents hitting daily API limits and avoids API request spikes on first syncs.
    • In future releases, I’ll aim to reduce API calls even further.
    • Thanks to @Entixs for the bug report.
  • Episode display regression in the Sync summary / History spotlight

    • Episode items now show the show name (South Park - S01E05) instead of only S01E05.
  • Plex history sync is faster and lighter

    • The optional “include marked watched” hydration no longer scans entire Plex libraries.
    • CrossWatch now requests only watched items, paginates, and stops once it reaches older plays.
    • Big speed-up on large libraries and fewer Plex API calls after the first run.
  • Web UI network usage reduced

    • The Sync status screen now prefers live updates and uses polling only as a fallback.
    • The Pairs list refresh is now event-driven (updates when something changes), with a slow safety refresh.
    • Scheduler banner updates are now throttled to prevent bursty refresh storms from focus/tab events.
    • “Currently watching” UI updates are de-duplicated
  • Pair-scoped tombstones

    • Tombstones are now pair-scoped and stored under .cw_state, preventing “delete memory” from one provider pair blocking another.
    • Fixes cases where shows (and full seasons) could stay stuck even after a reset.

CrossWatch - v0.7.1

🔧 Fixes & Improvements

  • Big performance fix

    • Fixed an issue that would spam CrossWatch with background requests, causing huge lag.
      - Thanks to @jabrown93 for opening the bug report and debugging.
  • AniList linking

    • Improved the AniList login/link flow so it doesn’t keep “refreshing” in the background.

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.