Skip to content

Releases: cenodude/CrossWatch

Update 0.9.18

18 Apr 14:30
25072f2

Choose a tag to compare

CrossWatch v0.9.18

New Quick Add for desktop and mobile, manually send history, ratings and watchlist actions to one or more providers for titles watched outside your normal media server flow.

WIKI: https://wiki.crosswatch.app/crosswatch/navigation/quick-add

✨ Highlights

  • Added: new Plex watcher route filter to ignore Live TV & DVR playback.
  • Added: Quick Add for manually sending watched history, watchlist entries, and ratings to configured providers.

🔧 Fixes & Improvements

  • Fixed: Jellyfin and Emby pair setups now correctly hide and disable Ratings where ratings sync is not supported.
  • Fixed: Dashboard startup no longer waits on slow cold /api/status provider probes before loading the main widgets.
  • Improved: /api/status now runs provider user-info lookups concurrently to reduce cold status latency.
  • Improved: /api/state/wall now caches repeated identical responses until sync state, config, or wall filters change.
  • Changed: Watchlist auto-remove now targets providers from enabled watchlist pairs instead of scanning all configured providers.

Update 0.9.17

02 Apr 19:52
dcbd7fa

Choose a tag to compare

CrossWatch v0.9.17

Strict ID matching is now the default for Plex, Jellyfin, and Emby, because title fallback causes too many false positives.
Existing pairs needs to be changed manually (but only if you have issues)

If you have Plex and/or MDBList in your pairs: Maintenance -> Clear everything (or state and provider cache)

✨ Highlights

  • Refactored Sync Hub previews item/title spotlights are now delivered through the UI summary path instead of the raw sync output.
  • Updated: Providers pair settings now use Strict ID matching as the new default standard for newly configured pairs**
    • for existing pairs you need to change it in your pair - providers - Plex/Emby/Jellyfin and enable Strict ID Matching

🔧 Fixes & Improvements

  • Fixed: One-way MDBList -> Plex ratings no longer apply mirror-style removals in non-mirror mode.
  • Fixed: MDBList rating deletions are now detected more reliably when only journal activity changes.
  • Fixed: Watchlist poster view could fail to render covers because of an undefined typeLabel error
  • Fixed: Re-adding ratings after a delete no longer fails because sparse MDBList journal rows dropped needed metadata.
  • Fixed: Plex history items can now be re-added after removal because stale local watched-cache state is cleared correctly.
  • Fixed: upgrade warning reappearing after the first acknowledgement

Update 0.9.16

30 Mar 14:35
a80bf57

Choose a tag to compare

CrossWatch v0.9.16

A lot of work in this version went into making sync behavior easier to trust in day-to-day use.
The goal was simple: make sync behavior more predictable, make summaries easier to trust and reduce false positives.

A big part of the providers (trackers/media servers) are refactored.
All providers, trackers, and media servers now use x.x versioning instead of x.x.x, starting from version 1.0.

As always when providers are changed. Maintenance -> Clear state and provider cache (or Clean everything)

✨ Highlights

  • Ignore dropped shows support for MDBList, Trakt, and SIMKL, so your dropped titles can be excluded from sync behavior.
  • CW Tracker progress support progress can now be synced into and out of the CrossWatch tracker just like Plex, Emby, and Jellyfin.
  • Improved Analyzer is now more useful: as it validates sync providers and orchestrator modules.

🔧 Fixes & Improvements

  • Fixed: Multiple edge cases where rating changes in two-way sync could be misread as adds or removals.
  • Fixed: Re-rating items after deleting a rating could be blocked by stale pair tombstone behavior.
  • Fixed: Recent sync summaries could show wrong counts because fallback stats could overwrite real zero-result runs.
  • Fixed: Spotlight rows stay aligned with the actual applied sync results.
  • Fixed: Apply events now carry richer spotlight data, improving reliability of the live sync UI.
  • Fixed: Watermarks, shadow caches, and unresolved tracking are now handled more safely during capture/backup-style operations.
  • Fixed: Progress fields are now preserved more reliably in persisted state, improving editor visibility and analyzer accuracy.
  • Fixed: Editor loading was improved
  • Improved: MDBList history syncing now handles rollups, episode removals, and journal-driven deletes much more reliably.
  • Improved: SIMKL, Trakt, and MDBList large delete/apply operations now use safer provider-side chunking
  • Improved: Cleanup tools now run in capture-style mode
  • Improved: Compact/mobile handling is now smarter.
  • Improved: Provider comparison logic was refactored to better match the way different services represent.
  • Improved: Internal sync guardrails around tombstones, unresolved items, etc.
  • Improved: Analyzer results are now more readable for end users, with clearer messages and better grouping.

Update 0.9.15

21 Mar 01:03

Choose a tag to compare

CrossWatch v0.9.15

Normally, I do about one release per week. But...

This one is an URGENT UPDATE and I strongly recommend everyone update to this image as soon as possible. Why? Because I broke it :-(

✨ Highlights

  • Global defaults and per-route control: Watcher settings now support both global defaults and route-specific options.
    • Simple setups stay easy while advanced setups get much more flexibility. #172
    • For the plex ratings webhook you can now create a webhook per route. I think nobody will use it...but its there.
    • For auto-remove on watchlist, same thing. You can set it globally or per route.
  • Watcher routes refreshed: Filters and options now open directly per route, making watcher setup much easier to understand. #172
  • Better active playback UI: The playing card and scheduler banner supports better multiple active streams. #173
  • Trailer modal refreshed: provides a cleaner and better embedded viewing experience. #182

🔧 Fixes & Improvements

  • Removed: Old legacy watcher code, leftover UI pieces, and outdated migration paths. #169
  • Fixed: MDBList watchlist items are now classified more accurately. #177
  • Fixed: Watchlist trailer playback now opens correctly again from the watchlist detail card. #182
  • Fixed: Route filters now work correctly for Plex, Jellyfin, and Emby, including usernames, user IDs, and server UUIDs. #168
  • Fixed: Watcher output tab showed only Plex and traks logs, thats fixed now and includes all watcher providers #170
  • Fixed: Settings no longer spam repeated background config requests when you are not actively setting up a provider. #176
  • Fixed: Watcher logs no longer spam the same filtered-session message over and over during blocked playback. #179
  • Fixed: Unified watchlist items are now merged more reliably when different providers store the same title under different IDs. #177
  • Added: Per-route watcher options such as route-specific auto-remove, plus custom Plex ratings webhooks. #172
  • Added: New lightweight health check endpoints: /api/health and /healthz for your docker healthcheck #175
  • Improved: Plex history and ratings indexing now use parallel workers. In testing, about a 34% speed improvement #181
  • Improved: Jellyfin and Emby watcher behavior is now much closer to Plex for seek, progress, and stop handling. #172
  • Improved: Watcher and sink logging is now more consistent and easier to follow. #172
  • Improved: Watchlist delete actions now resolve correctly across providers with merged IDs. #177
  • Improved: Watchlist metadata is now batched per visible set instead of sending one metadata request per item. #174
  • Improved: Watchlist row hydration now only requests the metadata needed for the list view. #174
  • Improved: Metadata cache reuse on the watchlist page is more effective and reducing unnecessary TMDb traffic. #174
  • Improved: Main-page watchlist preview now loads faster by rendering sooner. #182
  • Improved: Watchlist and playing-card metadata reuse is now more effective. #182

🔐 Security

  • UI and Security: In Security UI added “Other browser sessions” summary with a single “Log out other sessions” action. #183

Update 0.9.14

18 Mar 20:17

Choose a tag to compare

CrossWatch v0.9.14

Authentication is now mandatory. As it is the only reliable way to properly protect the endpoints.
To make things a bit easier, I added extended session caching and also Plex SSO support.

In the background, I am also working on a major overhaul of the orchestrator and providers, with more improvements coming in the next releases. The goal for the orchestrator/provider overhaul is better matches and less API requests.

After the upgrade to a hard browser refresh: Ctrl+Shift+R or Ctrl+F5

✨ Highlights

  • Authentication:
    • New login screen: cleaner layout, improved session options.
    • Plex SSO: CrossWatch can now use a linked Plex account for sign-in, while still keeping the normal local admin login as fallback.
  • Settings refresh: Settings overview has now a more progress-step approach. Making it easier for new users...well, i hope.
  • Advanced Scheduling: can now trigger actions by events (watcher/webhook activity) and capture scheduling
  • Scheduling UX refresh: Standard Scheduling is now more flexible with more recurrence options.
    • both Standard and Advanced Scheduling have a clearer setup experience.
  • Connection Setup: the Configure Connection modal was refreshed.

🔧 Fixes & Improvements

  • New: optional Sign in with Plex button on the login page for linked Plex admins.
  • New: Security settings now allow linking or unlinking a Plex account for CrossWatch sign-in.
  • Improved: authentication now reuses existing CrossWatch session cache and middleware protection.
  • Improved: login and security settings received additional UI polish and clearer auth/session messaging.
  • Improved: Standard Scheduling now supports Every hour, Every N hours, Daily at, and Custom interval modes. #165
  • Improved: Standard Scheduling now uses a more guided wizard-style setup #165
  • Improved: both Standard and Advanced Scheduling now include a clearer Current plan summary. #165
  • Fixed: Sync Output no longer replays duplicate scheduler log lines after reconnecting the live log stream.
  • Fixed: some frontend views did not correctly use cached TMDb metadata #143
  • Fixed: History sync could miss watched history when rating a new movie auto-moved it to completed #153
  • Fixed: editor watchlist entry could duplicate on sync due to TMDb/IMDb key mismatch #147
  • Fixed: Sync Details output now refreshes reliably across consecutive syncs #154
  • Fixed: disabling the CrossWatch tracker now properly hides CrossWatch from Insights, Watchlist, Editor, and Snapshots #160
  • Removed: the old watcher bridge is removed; if you're still using the legacy watcher setup (<0.9), you need to move to watcher routes.
  • Change: Captures now support bundles/full captures for diff compare #144
  • Change: Captures can be scheduled directly in advanced scheduler or add as queue in Captures #89
  • Change: added a separate Event Triggers panel next to the existing Time Plan in Advanced Scheduling #148
  • Change: settings and connection setup now include more helper icons and tooltips #158

🔐 Security hardening #146

  • username masking: for all watcher/sink and webhook logs. You now see only the first two letters of a username.

📚 WIKI updates:

Update 0.9.13

11 Mar 23:41

Choose a tag to compare

CrossWatch v0.9.13

Important, after your upgrade to v0.9.13 you cant downgrade. This version now includes encrypted config file, and is not comptabile with older versions. Hope you like the improved interface. The orchestrator and adapters were not changed, so there is no need to delete your cache.

✨ Highlights

  • UI Refresh: Updated with a cleaner, more modern and improved status presentation for a fresher overall look (i hope) #137
    • updated: UI changes for main, analyzer, exporter, syncbar, Watchlist, Captures, Editor, Settings
  • Refactor: Cleaned up, updated, and removed unnecessary parts for significantly better performance. #134

🔧 Fixes & Improvements

  • Fixed: Scheduler thread is being started even when scheduling is fully disabled. #133
  • Fixed: Setup wizard now opens correctly again after using Reset all to default #136
  • Fixed: Browser accessibility/compliance warnings caused by unbound labels. #135
  • Fixed: Increased modal slightly and fixed status badge clipping in the header area.
  • Fixed: Cut down repeated scheduler start/stop messages during save and refresh. #132
  • Fixed: Insight Settings Filtering:** The provider list in Insight Settings now shows only providers that are configured.
  • Change: Added a Copy button to the Sync output toolbar so you can quickly copy the active Sync or Watcher log. #131
  • Change: Watchlist, swapped the numeric overview for Coverage Pulse.

🔐 Security Enhancements #123

Update 0.9.12

06 Mar 14:13

Choose a tag to compare

CrossWatch v0.9.12

Another huge update as i've continuing the work started in 0.9.11, where we moved from IMDb-first to TMDB-first.
I’ve made a bunch of optimizations and tightened up the orchestrator integration, so your sync results should be more reliable.

There’s also a new experimental feature called Progress, which lets you sync resume positions between media servers.

And last, but definitely not least, security has been improved.

IMPORTANT - what you absolutely need to do:

  • All Webhooks are now protected with a unique URL/ID token. After updating, every (webhook)user must copy and paste the new webhook URL into their media server.
  • As always, clear your existing cache first, it’s the smartest thing you can do. In Settings - Maintenance - Maintenance tools and then Clear Everything
    • If you don’t clear your existing cache, most improvements won’t be applied. That makes all my work a complete waste....so sad..

✨ Highlights

🔧 Fixes & Improvements

  • History Sync Reliability: #117

    • Fixed a state persistence issue that could cause history statistics to shrink after a subsequent sync run.
    • CW now preserves watched timestamps/metadata when a provider returns sparse history.
    • Improved ID reconciliation to prevent duplicate history entries when providers disagree on IDs:
      • Uses TMDb first, then falls back to IMDb, then TVDb (in that order) to match the same title across systems.
    • Two-way sync: improved safeguards so ID drift doesn’t trigger false adds/removes or inflated counts.
  • Plex Instances / Profiles: Fixed an issue where Plex per-instance library whitelists)were not being saved #126

  • Plex Instances / Profiles: Fixed an issue where an extra PLEX-P01 could appear in settings. #129

  • Upgrade Migration: The Migrate action in the upgrade warning modal now performs a real migration for required settings. #130

  • History Sync Performance (Jellyfin / Emby / Trakt): Much faster history indexing....more speeeeeeeeeeeed #125

  • Provider Rate Limiting (SIMKL / Trakt / MDBList): Added configurable request throttling to respect upstream API limits. #128

  • Security Enhancements: #123

    • Authentication now fails closed if `config.json exists but can’t be loaded/parsed correctly.
    • Hardened TMDb artwork caching to block path traversal / unintended file overwrite.
    • Webhook endpoints are now protected via a unique URL token generated by CW:
      • /webhook/plextrakt?uniqueID
      • /webhook/jellyfintrakt?uniqueID
      • /webhook/embytrakt?uniqueID
      • /webhook/plexwatcher?uniqueID
    • Added Trusted reverse proxies setting in Settings - Security
      • Use this only if you run CW behind reversed proxies. This will improves secure cookies and rate limiting accuracy.
    • UI logs now redact common secrets (tokens/keys) to reduce leakage.
    • TLS certificate download endpoint now only serves valid X.509 cert files
    • Improved error handling to avoid leaking internal details via API responses.
    • Stronger path validation to prevent unintended directory access via file listing.

Update 0.9.11

01 Mar 12:45

Choose a tag to compare

CrossWatch v0.9.11

Read this. Or cry later. Your choice.

BREAKING UPDATE: ID priority is now TMDb-first

Classic small change, huge impact.
This affects every sync pair. The old split (IMDb for UI/state, TMDb for sync) became too fragile and kept causing avoidable bugs.
I've changing it now so we can actually reach a stable release someday.

CrossWatch now prefers IDs in this order: TMDb → IMDb → TVDb → (everything else).

Why this matters

  • Better matching across providers
  • Fewer duplicates and unresolved items

Migration behavior (important)

When you upgrade and click Migrate, we will:

  • Wipe your current state and cache
  • Temporarily stop your scheduler

This is intentional. It prevents duplicate entries from being pushed to your trackers.

After migration

  • Re-enable one pair at a time and let it rebuild your state gradually
  • If you have captures; recreate them.
  • At the moment DONT do any tracker to media server pairs.

Testing
This also means that large parts of CrossWatch need to be re-tested. I’ll phase this in, because I’m a one-person operation.

  • Webhooks / Watcher: Tested
  • Sync pairs - Plex to trackers: Tested
  • Sync pairs - tracker from/to tracker: Tested

Next up: testing Emby/Jellyfin (and friends). I’m not expecting major issues, but please be careful. Plex has already been updated as a delta provider; we still need to apply the same change for Emby/Jellyfin. Until that’s done, the Emby/Jellyfin results won’t reflect any improvements yet.

🔧 Fixes & Improvements

  • CrossWatch: Reorder ID keys for consistency across various modules (TMDB first) #117
  • Orchestrator: Many improvements for better sync results.
  • Plex Sync (History): Fixed an issue where Plex history could drop to 0 on the second sync
  • Plex Sync (History): Improved state handling so Plex history is treated as incremental (“delta”)
  • Plex Sync (History): Reduced false weird counters in Insights caused by incremental snapshots being stored as full snapshots.
  • Plex Sync (History): Improved shows/episode enrichment.
  • Trakt Sync (History): Fixed a loop where history sync could report +1 added on every run even when nothing new was added.
  • Trakt Sync (History): Improved episode matching
  • Trakt Sync (History): Corrected unresolved/blocked handling so repeated failures are properly blocked

Update 0.9.10

28 Feb 01:13

Choose a tag to compare

CrossWatch v0.9.10

🔧 Fixes & Improvements

  • Scrobble: Suppressed user=None playback alerts to reduce filter-log noise when no one is actively watching.
  • Scrobble: Fixed non-default scrobble watchers missing playback events when Plex alert payloads omit the account/user field.
  • Scrobble: Added a debug log entry before dropping unresolved-user alerts to make it clearer why an event was ignored.
  • Scrobble: Improved support for Plex shared-server tokens by using the configured profile username for that watcher.
  • Scrobble UI: Fixed route filter settings leaking into the default profile due to cached provider presets while editing routes.
  • Captures: Fixed history-restore gaps when two entries share the same watch timestamp.
  • Captures: Fixed an edge case where items can return multiple distinct items with the same IMDb ID.
  • Sync Engine: Improved bulk sync completion performance by batching internal blackbox/flap bookkeeping instead of updating it item-by-item.
    • Fixed an issue where large sync runs, especially history imports, could appear to stall after the write phase while CrossWatch was still processing internal retry/unresolved tracking.
    • Reduced post-sync overhead for large add/remove operations so runs can finish and report completion more reliably.
  • Sync Engine: Improved sync result reporting for large one-way runs.
    • Added clearer accounting for provider-confirmed adds versus internally deduplicated items.
    • Improved skipped-item reporting so inferred remainder skips are tracked more transparently during bulk syncs.
    • Added better visibility into duplicate canonical-key collapse during apply/reporting, which helps explain mismatches between provider-reported adds and final run totals.
  • MDBList: Updated the MDBList adapter to v4.1.0.
    • Improved sync compatibility with the current MDBList API blueprint across history, ratings, watchlist, and scrobble flows.
    • Fixed watched-history sync handling for show-level and season-level updates/removals.
    • Improved ratings sync support for additional MDBList-supported IDs, including Trakt, MDBList, and Kitsu where applicable.
    • Hardened watchlist parsing for unified responses and aligned internal health checks/activity tracking with MDBList sync behavior.
  • SIMKL: Updated the SIMKL adapter to v4.1.0.
    • Improved compatibility with the current SIMKL API blueprint across history, ratings, watchlist, and scrobble flows.
    • Fixed anime scrobble handling by sending the correct SIMKL payload shape and supporting additional anime IDs where available.
    • Improved history and ratings sync matching by preserving a broader set of SIMKL-supported IDs.
    • Fixed an anime ratings sync issue where SIMKL anime library data could be parsed incorrectly, causing weaker item matching.
    • Hardened Plan to Watch sync by correctly accepting successful SIMKL removals even when the API returns an empty response body.
    • Fixed history season sync handling by sending season entries using SIMKL's documented season payload shape instead of treating them like plain show-level writes.
    • Improved SIMKL history write accounting so successful season-level additions are counted correctly during bulk imports.
  • Trakt: Updated the Trakt adapter to v4.4.0.
    • Improved compatibility with the current Trakt API blueprint across history, ratings, watchlist, and scrobble flows.
    • Fixed watched-history sync handling for show-level and season-level updates/removals, and improved support for removing entries by Trakt history ID.
    • Improved watchlist sync support for movies, shows, seasons, and episodes to better match Trakt's supported payloads.
    • Fixed scrobble behavior that could create multiple watched dates when stopping near the end and finishing later (configurable via stop_pause_threshold).
    • Improved scrobble logging by downgrading Trakt 422 pause rejections near the scrobble cutoff to WARN (no longer treated as hard errors).
    • Hardened scrobble handling for duplicate/recent playback conflicts to better align with Trakt responses.

Update 0.9.9

25 Feb 11:17

Choose a tag to compare

CrossWatch v0.9.9 (quick-fix)

Because of filtering issues affecting Plex users. I’m releasing this quick fix.

This patch is focused on improving user detection and filtering behavior, which should reduce incorrect matches and missed events.
It removes the PMS owner fallback and relies more on actual session/user data, which should give more consistent results.
The main or real issue is that Plex is very inconsistent when it comes to providing the actual usernames.

This is a quick fix(hotfix). It hasn’t been thoroughly tested yet, so treat it as an improvement release rather than a guaranteed final fix.
That said, it should deliver better results than the current (0.9.8) version regaring watcher and filtering for Plex.

🔧 Fixes & Improvements

  • Plex: Fixed misidentificationstreams as the server owner, which affect route filters.

CrossWatch v0.9.8

Important (Plex users)

CrossWatch now supports shared Plex servers (servers you don’t own - no PMS owner) thanks for the idea and support @mesitisg
This required major changes to Plex authentication and sync adapters.

Recommended action: Recreate your Plex authentication configs (delete and re-add)

  • Disable Watcher first before recreating Plex auth
  • You can keep your pairs and watcher config.
  • Dont forget to set your whitelists and double check your Plex settings.

✨ Highlights

  • Plex: Shared Plex server support is now supported (sync and watcher)

🔧 Fixes & Improvements

  • Plex: Keeps separate tokens for Plex account (cloud) and Plex server (PMS) access, so PMS features use the correct token.
  • Plex: History and ratings sync now use the PMS-scoped token, fixing shared-server authorization issues.
  • Plex: Manual Mark as Watched/Unwatched actions in Plex are now tracked more reliably for history sync and use a separate cache.
  • Plex: Fallback-GUID option. History sync no longer drops entries. #111
  • Scrobble: With multiple scrobble routes, CW now logs a single summary line (wired providers: X | wired sinks: Y).
  • Scrobble: Newly created provider profiles/instances now appear immediately in Watcher route dropdowns.
  • Scrobble: Fixed route filter UI state leaking between routes. Opening Filters now loads the correct filters for the selected route.
  • Scrobble: Removed the Live panel/toggle from the Watcher screen. It was confusing for most users.
  • Tautulli: Fixed auth UI where the auth buttons were not visible. (Issue #112)
  • Captures: CW now uses a dedicated Capture Mode when creating captures, ignoring cache and watermarks for consistancy. #110