v0.2.16
Version 0.2.16
Tag:
v0.2.16Published:
2025-10-25T23:40:33ZGitHub: https://github.com/cenodude/CrossWatch/releases/tag/v0.2.16
CrossWatch – v0.2.16
Webhooks got a big glow-up (Plex, Jellyfin, Emby). Not gonna lie: making webhooks behave is extremely tricky. The Watcher? Way simpler. The catch with webhooks is we only get what your media server sends, and Plex keeps things a bit… ehmmm...minimal. That’s where credits-skip and “auto play next” from Plex like to mess things up.
Note: For Webhooks; my Jellyfin testing is limited, and I can’t test Emby at all (no Emby Premiere). I’m primarily a Plex user. Recommended advanced webhook settings: set Stop→Pause threshold to 85% and Force stop to 95%. All values as described below are configurable and are based on the recommended settings:
✨ What’s new
“Media server knows best”
Plex:
media.scrobble(threshold/credits) is treated as authoritative so we finish at ≥95% so Trakt marks watched even if offsets look tiny after credits-skip.Jellyfin & Emby: If the payload/UserData indicates Played/Watched (or
PlayCount> 0 / “ItemMarkedAsPlayed”), we treat it as authoritative and finish at ≥95%. Manual “Mark as played” now reliably reflects on Trakt.
Plex autoplay quarantine (new)
After a STOP at ≥95%, if a new episode autostarts quickly, we quarantine the start.
After
suppress_autoplay_seconds(default 15s), we probeGET /status/sessionsand:If the player is playing the quarantined item → we send a normal start.
If not playing → we clear quarantine (no accidental scrobble).
New Plex-only config:
suppress_autoplay_seconds: default 15. Set this a few seconds above your Plex autoplay countdown. For a 10-second countdown, use 13–15s.probe_session_progress: default true (corrects bogus % via/status/sessionswhen credits are skipped).
Trakt-first, safer ID strategy
Prefer ids.trakt; for episodes, fall back to show.ids + S/E.
Adds episode GUID search rescue (
/search/{imdb|tvdb|tmdb}type=episode) when Trakt returns 404.
Smarter end-of-item behavior
Rewatch-aware regression clamp: prevents % from jumping backwards, but correctly resets on a fresh (re)start/new session.
Pause @ ~100% clamp: pauses that report 100% clamp to ≥95% so STOP cleanly completes as watched.
Demote suspicious STOPs (e.g., sudden jumps from low % → 98%) to PAUSE unless thresholds met.
Debounce rapid STOP/PAUSE spam to avoid noisy or duplicate calls.
🔧 Fixes & Changes
Trakt 409 checkin conflicts auto-resolved by clearing
/checkinand retrying.Backoff on 429/5xx responses.
Cross-provider Watchlist auto-remove triggers on STOP
Cleaner logs: clear “intent → response” lines, quarantine probes, and ID resolution.
CrossWatch – v0.2.6
New: Emby provider (early days). Right now it supports watchlists, webhook (code is there, untested), and the Watcher. I don’t have Emby Premiere, so webhook testing cant be done by me. History and Ratings for Emby are planned, just not shipped yet. This is the last new provider for a while as I’m switching focus to polish and speed.
Rule of thumb: Got Plex Pass / Emby Premiere / Jellyfin? → use webhooks. No Pass/Premiere? → use the Watcher.
🔧 Fixes & Changes
Main
Sync bar: a few more UI tweaks..
Sync output: fewer “freeze-like” moments while streaming logs.
Scrobbler
Plex ↔ Emby switch: you can toggle which one scrobbles; only one can be active. Heads-up: filters/libraries apply per provider, so review your scopes when you switch.
Emby
Watchlist
Supports three modes:
favorites(stars),playlist, andcollection.Default list name comes from
watchlist_playlist_nameconfigure in UI. Dont use Playlist as it only supports movies and episodes (no shows)
Webhook (untested): implemented reusing Jellyfin logic; needs Emby Premiere to enable server-side webhooks.
Watcher: polling fallback for folks without Premiere. It’s light, reliable, and works out of the box.
🧠 Known Limits (Emby)
History / Ratings: not available yet here. Dont ask for it. It will be there when its ready.
ID matching: works best when your Emby items have TMDB/IMDB/TVDB IDs.
CrossWatch – v0.2.5
small but solid update: code cleanup, a few fixes, and a new experimental Plex option.
🔧 Fixes & Changes
Main
Synchronization bar – minor UI tweaks and a tooltip so you can quickly see which phase the run is in.
Insights accuracy – adjusted calculations so the statistics reflect more accurate totals.
Plex
Experimental: Fallback GUID – when Plex can’t fully identify a watched or rated item (e.g., it was removed from your PMS or the lookup errors), this tries extra methods to recover IDs so the sync can proceed. ⚠️ Use only if you understand the trade-offs and are having matching issues. Read more: https://github.com/cenodude/CrossWatch/wiki/mod_PLEX
CrossWatch – v0.2.4
Note: This update rearranged some webhook config keys. It should not affect your current
config.json. If it does, rebuild your config (delete it and reconfigure).
✨ Focus - Webhook support for Plex and Jellyfin (Plex & Jellyfin → Trakt)
Now works + Jellyfin support. Have Plex Pass? Prefer Webhook. No Plex Pass? Use the Watcher. Jellyfin users: use the Webhook.
Endpoints:
Plex →
/webhook/plextraktJellyfin (Webhook plugin, Generic) →
/webhook/jellyfintrakt
Setup guide: see the wiki for step-by-step instructions (Jellyfin users: must-read). https://github.com/cenodude/CrossWatch/wiki/Webhooks
🔧 Fixes & Changes
Plex (History)
Whitelist reliability: improved section ID detection for history rows so library whitelisting is consistently applied.
Jellyfin
Improved settings: added in Authentication Providers → Jellyfin → Settings. You can now change users and whitelist libraries.
Analyzer
Better visibility: added a waiting overlay, especially useful for larger
state.jsonfiles.
CrossWatch – v0.2.3
Sorry—another update. The coming weeks I’ll push more frequent fixes to squash those small annoying bugs that have been bugging me for way too long 🙂
🔧 Fixes & Changes
Main
Sync output honors debug: Beautifier is disabled when
runtime.debugorruntime.debug_modsis true.Live log reliability: Added SSE watchdog + auto-reconnect when the stream goes quiet; flushes the remaining buffer on error and preserves slider/stick-to-bottom.
Analyzer
Counts match reality: Issues are filtered by enabled pairs from
/api/pairsand by enabled features (history/watchlist/ratings).Clear footer totals: Footer now shows
Issues: N • H:x • W:y • R:zso feature backlogs can’t hide real deltas.Pair map: Analyzer understands the new pairs schema (
source/target, per-featureenable)
CrossWatch – v0.2.2
🧪 Analyzer added (early-access / best effort ... whatever)
Helps spot items that are stuck across providers (PLEX, JELLYFIN, TRAKT, SIMKL).
Shows Issues: N based on your sync pairs (e.g. missing peers), plus per-item suggestions and where to fix (typically Plex/Jellyfin).
Practical UI: search, toggle IDs, resizable columns, and a footer with provider counts.
It won’t edit SIMKL/TRAKT for you; it guides you to fix metadata at the source and then re-sync.
If it works great—awesome. If not… at least you tried 🙂. (It’s early; feedback welcome)
Tip: Add TMDb/Trakt keys to get smarter suggestions.
Docs: Analyzer Wiki
CrossWatch – v0.2.1
✨ Focus
Numbers that match reality in statistics and insight
Multi-arch images (AMD64 + ARM64)
🔧 Fixes & Changes
No more double counting: We stop stacking the same totals; we keep the highest number instead of adding.
Watchlist is fair: Title tweaks/renames are shown as updated (~), not fake added (+).
Ratings with meaning: Badges now show + / − / ~ (add, remove, update).
Don’t miss events: Ratings/History no longer require a title, so silent providers don’t cause undercounts.
Smarter matching: “Dune Part 2” ≈ “Dune: Part Two” (fewer bogus add+remove combos).
Improved stability: various fixes
CrossWatch v0.2.0 — Big, refactored, and yes… probably many new bugs 🙂
Faster syncs, safer writes, cleaner UI. Two-way flows are steadier, SIMKL + Jellyfin behave better, Trakt refreshes itself, progress bar is sane, scheduler is actually useful. Breakage risk is low but back up /config anyway.
Highlights
Big refactor: FastAPI split into lean routers; providers + orchestrator modules cleaned up for speed and reliability.
Safer syncs: Mass-delete guard rails, health status and “suspect shrink” protection; additions/updates chunked; smarter delta reuse.
Two-way sync that sticks: Less flip-flop from weak IDs; better source-of-truth handling across mixed pairs.
Scheduling 2.0: Hourly / every-N-hours / daily time, per-timezone, optional jitter, manual “run now”, resilient loop.
Debug levels:
Off·On·On + MOD debug·On (full HTTP)best isOn + MOD debugAuth mod Plex improvement: in authentication providers there is now a new settings menu for Plex (server settings, user settings and whitelisting of libraries)
Sync mod Jellyfin improvement: many fixes, should work better now. Also watchlist can now sync to favorites, Playlist and Collections
Watchlist: new GUID normalizations will provide better results
What’s new (user-visible)
UI/UX
Progress bar partly fixed: No early jump to 90%. “Apply” phase is shown only after all snapshots complete.
Run safety: Start/stop visuals are guarded (no more
startRunVisuals is not defined).Troubleshoot panel: One-click Clear cache, Reset stats, Reset state.
Auth flows: Plex PIN and SIMKL OAuth are smoother; clearer status + error toasts.
Wiki surfaced: Help links right in the app (Getting Started, Config, FAQ).
Providers
Plex
Server URL is sticky: Suggestions won’t override a value already saved in config.
Better library scoping and discovery hints.
SIMKL
Fresh “present” snapshots when activity changes (bypasses stale ETag/304). Fewer “why didn’t my add propagate?” moments.
Trakt
Auto token refresh before/after calls; 401/403 retries wired in.
Jellyfin
Capability reporting cleaned up; fewer re-add loops via smarter ID/shadow handling.
Orchestrator
Faster snapshots; smarter enrichment ordering; fewer duplicate passes.
Safer writes with chunking + tiny pauses to avoid API spikes.
Telemetry (opt-in) trimmed and less noisy.
Scheduling
Modes:
disabled | hourly | every_n_hours | daily_time.Timezone-aware start; optional
jitter_secondsto avoid herd starts.Visible “next run at” + last result in the UI.
Config (still JSON, still simple)
New debug trio:
runtime.debug,runtime.debug_mods,runtime.debug_http.Stability knobs:
snapshot_ttl_sec,apply_chunk_size,apply_chunk_pause_ms, and mass-shrink guards (suspect_min_prev,suspect_shrink_ratio).
Fixed (the greatest hits)
Watchlist delete (SIMKL/Trakt): actually removes items and stays removed.
Endless re-adds from weak/agent IDs reduced (IMDb/TMDb/TVDb priority).
Insight/List noise reduced (hide disconnected providers).
UI errors from timing/race conditions hardened.
Breaking/behavior changes
Internal API/routers were refactored; external endpoints remain the same for normal use.
If you see odd counts after upgrade: use Maintenance → Clear cache and hard-refresh the UI.
Upgrade notes
Stop container; back up your /config.
Remove your complete /config
Pull latest: ghcr.io/cenodude/crosswatch:latest.
Start; visit Settings → verify tokens + library scopes.
Test one pair first; then enable Scheduling if desired.
Known rough edges (being honest)
Stats can be off in edge cases (work in progress).
Some UI sections don’t auto-refresh perfectly (do manual refresh).
SIMKL & Jellyfin are still maturing; report weirdness with logs.
see WIKI for more issues: https://github.com/cenodude/CrossWatch/wiki
Last updated