CrossWatch – v0.2.8
Reliability & clarity release. Safer syncs, truer totals, and cleaner output, especially for watchlists.
✨ Highlights
- Safer one‑way sync. Handles zero‑add runs without crashing, writes are counted only when confirmed, and state/tombstones are updated accordingly.
- Truer totals (no more inflated “+adds”). Lane counters (Watchlist/Ratings/History/Playlists) now de‑duplicate per item across providers. If the same title is touched on multiple providers in one run, it’s counted once.
- Smarter delete handling. Observed‑deletes are auto‑disabled for a pair when either side doesn’t support them or is down; mass‑delete guard + optional snapshot drop‑guard keep you safe.
- Less nonsence. Blocklist + Phantom Guard suppress accidental re‑adds and record successes/failures.
- Clearer progress. Every apply phase shows attempted · added/removed · skipped · unresolved · errors; bars finish cleanly even if the final tick is missed.
- Richer final summary. “Done.” and the
run:done
now include skipped / unresolved / errors (when available).
🔧 Fixes & Changes
Orchestrator
- Always initialize add/remove result objects; read
errors
/unresolved
safely. - Final “Done.” line may include:
Total skipped
,Total unresolved
,Total errors
. run:done
event mirrors those totals so higher layers can surface them.
UI (Log event Beautifier)
- Final “Sync complete” card shows +added / −removed and, when present, ~skipped / !unresolved / ×errors.
📝 Note
Edge cases like “added on one provider and removed on another in the same run” are still shown as +1 and −1 (by design).
CrossWatch – v0.2.7
Small release (from enduser perspective): but big code cleanup, a few UI touches, and a key Plex history fix.
🔧 Fixes & Changes
Plex
- History sync (SIMKL/TRAKT → Plex): Added reversed ID validation and server-wide lookup. Fixes misses from stale IDs/metadata drift; movies & shows now mark watched more reliably (still best-effort).
- Logs: Clearer skip reasons when Plex can’t resolve an item.
- Note: Syncing history/ratings from trackers (SIMKL/TRAKT) to media servers (Plex/Emby/Jellyfin) isn’t recommended. In some specific cases, this fix can help.
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_name
configure in UI. Dont use Playlist as it only supports movies and episodes (no shows)
- Supports three modes:
- 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/plextrakt
- Jellyfin (Webhook plugin, Generic) →
/webhook/jellyfintrakt
- Plex →
- 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.json
files.
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.debug
orruntime.debug_mods
is 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/pairs
and by enabled features (history/watchlist/ratings). - Clear footer totals: Footer now shows
Issues: N • H:x • W:y • R:z
so 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 debug
- Auth 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_seconds
to 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