github cenodude/CrossWatch v0.2.18
Version 0.2.18

23 hours ago

CrossWatch – v0.2.18

Webhook and Watcher improvements Safer “finished” detection, better logs, and watchlist auto-remove happens for the types you allow.

Explaination about Plex autoplay quarantine: when you skip credits, Plex’s autoplay pops up and after few sec. the next episode will play...BUT Plex doesn’t fire a new webhook play event.
As a result, Trakt shows nothing in “Now Playing” (it’ll only mark it watched at the end or when you pause/play).
Autoplay quarantine will wait a few seconds, checks in your PMS if the next episode is really playing, then sends one clean start to Trakt.
"Now Playing" works in Trakt without the need to do pause/play. Tiny quality-of-life win, but it’s there and can be disabled if you dont like it.
Please note that this is a webhook only issue, the watcher is already realtime and therefore doesnt need Plex quarantine.

✨ What’s new

Watchlist auto-remove

  • Auto-remove now runs after a confirmed finish for the types you allow
  • Plex/Jellyfin/Emby webhooks no longer try to remove items themselves. One brain, zero double-deletes.

Respect your content types

  • Auto-remove obeys your allowed types:
    • Default is movies only.
    • Shows/episodes are removed only if you enable those types.
  • For episodes, we clean up using show-level IDs (how most watchlists store TV).

🔧 Fixes & changes

  • 409 Conflict (active check-in) is handled: we clear Trakt’s /checkin and retry. If Trakt still says it’s watched, we proceed to auto-remove once finished.
  • Backoff for 429/5xx stays in place; tokens refresh automatically on 401.
  • Cleaner logs: watchers log short event summaries; the Trakt sink logs the final user/action line. Deep details live in DEBUG only.
  • UI improvement: Added user selection and user_id filtering and automatically hydrate from your config.

Result: finish a movie (or show/episode if allowed), and it’s removed from your connected watchlists—once, correctly.


CrossWatch – v0.2.17

Small fix but important: Plex Watchlist no longer stops at 20. We now fetch everything.

🚀 What changed

  • Full watchlist, every time. Proper pagination with X-Plex-Container-Start/Size + offset/limit and totalSize.
  • More reliable reads. We prefer JSON from Plex Discover so we don’t lose paging info.
  • Clear progress. Logs now show index size, raw, coll, and types for quick sanity checks.

🧪 Notes for power users

  • Page size defaults to 100. You can optionally set plex.watchlist_page_size if you want to tune it.
  • If you see coll > 0, Plex returned duplicates; we collapse them by canonical key on purpose.

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

✨ What’s new

“Media server knows best”

  • Plex: media.scrobble (threshold/credits) is treated as authoritative — 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 probe GET /status/sessions and:
    • 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/sessions when 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 /checkin and retrying.
  • Backoff on 429/5xx responses.
  • Consistent defaults: force_stop_at 95 across Plex/Jellyfin/Emby; stop_pause_threshold stays 80.
  • Cross-provider Watchlist auto-remove triggers on STOP ≥95%.
  • Cleaner logs: clear “intent → response” lines, quarantine probes, and ID resolution.

CrossWatch – v0.2.15

Yesterday I taught CrossWatch a new trick: finish a movie and poof it gets kicked off your Plex watchlist.
Then I thought, “why only for plex?” I have all the logics in-place... Well, now it works across all your media servers AND trackers.

Also squashed a issue where deleted items could boomerang back in depending on your sync pairs. Not anymore.
Two flies, one swatter: broader support AND that reappearing-item is gone.

Anyways, i hope you enjoy it.


✨ What’s new

Auto-remove finished movies from ALL your Watchlists

  • When you finish a movie in Plex/Emby/Jellyfin, CrossWatch can automatically remove it from your all your Watchlist.
  • Works in both CrossWatch modes (webhooks and watcher)
  • Safe by default:
    • Off until you turn it on
    • Only removes movies (not shows)
    • Triggers near the end of playback
  • Honors your user/server filters and avoids double removals.

✅ How to turn it on

  1. Go to Settings → Scrobbler / webhook or watcher in filtering
  2. Enable Auto-remove from Watchlists
  3. Make sure your watchlists are syncing between your media servers and trackers as the magic depends based on your state.json.

That’s it: finish a movie in Plex, Jellyfin or Emby and zap, it disappears from your Watchlist once you’re done.

🔧 Fixes & Changes

  • Finishing a movie now registers more reliably using webhook/watcher on Trakt, even if you just let it play through the credits.
  • CrossWatch keeps a lower profile while it’s working.
  • Jellyfin/Emby webhooks now follow the same start/pause/stop smarts as Plex.
  • One simple line per action in the UI logs (no duplicates, less noise).
  • Small fixes and polish across webhooks and watcher.

CrossWatch – v0.2.14

Plex doesn’t auto-remove movies you’ve finished from your Watchlist. CrossWatch now does.


✨ What’s new

Auto-remove finished movies from your Plex Watchlist

  • When you finish a movie in Plex, CrossWatch can automatically remove it from your Plex Watchlist.
  • Works in both CrossWatch modes (webhooks and watcher)
  • Safe by default:
    • Off until you turn it on
    • Only removes movies (not shows)
    • Triggers near the end of playback
  • Honors your user/server filters and avoids double removals.

✅ How to turn it on

  1. Go to Settings → Scrobbler / webhook or watcher in Plex filtering
  2. Enable Auto-remove from Plex Watchlist

That’s it—watch a movie in Plex, and it disappears from your Watchlist once you’re essentially done.
If you also use two-way sync, that other service might add it back. So keep track on it!

🔧 Also improved Webhooks

  • Clearer episode titles (now shows display like Show Name S02E04 — Episode Title).
  • Smoother start/pause/stop detection with fewer duplicate updates.
  • Smarter matching to the right movie/show.
  • General polish and small fixes.

--

CrossWatch – v0.2.13

Exporter is now available. Export your state.json (Watchlist/History/Ratings) to CSV for various services.
It’s a nice-to-have—handy when needed—but remember: CrossWatch is a synchronizer, not a media tracker.


✨ Highlights

Export CSV files with the new Exporter

  • Open Exporter (next to Analyzer).
  • Pick your Provider (Trakt, Plex, Emby, Jellyfin, SIMKL).
  • Pick What to export: Watchlist, History, or Ratings.
  • Pick Where it’s going: Letterboxd, IMDb, JustWatch, Yamtrack, or TMDB.
  • Use Search (title / id / year) to filter.
  • Toggle Select all (filtered) or tick items one-by-one; the counter shows how many you’ll export.
  • Click Export — done.

https://github.com/cenodude/CrossWatch/wiki/Exporter

🔧 Fixes & Changes

  • UI save fixes fixed an issue where some provider settings weren’t saved to config.json

CrossWatch – v0.2.12

Some auth cleanup, one-click token nukes, and a smarter empty-state, plus some improved Plex Watchlist syncing.


✨ Highlights

One-click Delete token (all providers)

  • New Delete button on each auth panel.
  • Instantly clears the stored token for Emby, Jellyfin, Plex, Trakt, SIMKL.

Smarter empty-state (Insights)

  • The “No synchronization pairs configured” wizard now shows only if:
    • you have zero sync pairs AND
    • the Scrobbler is not enabled (Webhook/Watcher).
  • If you have pairs OR Scrobbler, you won’t see the wizard.

🔧 Plex Watchlist changes

  • ID-first resolver (optional, ON by default): tries METADATA.matches with external IDs before doing text search.
  • Text search for candidates (ON by default): uses title / slug / year on Plex Discover to collect candidates, then matches by IDs.
  • PMS fallback (OFF by default): optional local PMS fallback for add/remove if Discover resolution fails.
  • Explicit GUID priority (first hit wins):
    tmdb → imdb → tvdb → agent:themoviedb:en → agent:themoviedb → agent:imdb

⚠️ Note about Discover search: Plex Discover does not support direct search by IMDb/TMDB/TVDB IDs. For tricky regional/AKA titles, consider enabling PMS fallback or fixing the match manually on your PMS.


CrossWatch – v0.2.11

Trakt Collections

  • New “Add collections to Trakt.”
  • Trakt collections = titles you have in your library (e.g., Plex/Emby/Jellyfin)

✨ Highlights

Trakt Collections (History)

  • Toggle: Pair → History → “Add collections to Trakt.”

Drop guard / Suspect guard (Globals) ùpdated

  • Toggle: Pair → Globals → “Drop guard.”
  • Purpose: protects against accidental mass removals when a source suddenly reports far fewer items.

🔧 Fixes & Changes

Trakt Watchlist (moved existing options from Providers into the feature)

  • Location: Pair → Watchlist → Advanced → Trakt
  • Use ETag — Cache-friendly reads.
  • Shadow TTL (hours) — Local shadow freshness window (default ~168h).
  • Batch size — Control write chunking.
  • Log rate limits — Extra visibility when Trakt throttles.
  • Freeze details — Don’t churn item details each run.

Trakt History — Unresolved Freeze (moved existing options from Providers into the feature)

  • Toggle: Pair History → Advanced → → “Unresolved Freeze.”
  • Purpose: park unresolved items so runs don’t keep hammering the same misses.

Trakt Number Fallback (History)

  • Toggle: Pair → Advanced → History → “Number Fallback.”
  • Uses numbers-form payload when per-episode IDs aren’t available but show IDs and S/E numbers are.
  • Reduces resolver calls and avoids mismatches. Off by default.

Drop guard / Suspect guard (Globals)

  • Location: Pair → Globals → Drop guard
  • When enabled, a Suspect guard (shrinking inventories) panel appears with:
    • Min previous size — ignore tiny lists below this size.
    • Shrink threshold (%) — mark run suspect when
      current_size < (1 − threshold) × previous_size.
  • Effect: on a suspect run, bulk removals are blocked and a warning is shown, helping avoid bad deletes after partial reads/outages.

CrossWatch – v0.2.10

SIMKL to TRAKT and TRAKT to SIMKL history syncs now works

  • Great two-way backup/import for SIMKL and Trakt
  • Episodes resolve to real episode IDs, less show-ID screwups.
  • watched_at timestamps preserved, so multiple plays stay intact.
  • Movies and episodes sync cleanly in both directions.
    - To unlock this amazing functionality you’ll need a $5/month subscription… just kidding 😉
    - in the future i will add some real backup functionalities, with date, etc for easy restore

The experimental fallback_GUID for Plex worked absolutely like ass, so it needed fixing.
The fallback_guid logic is rather complex, and CrossWatch is basically the only that has this option.
Only enable fallback_guid if you truly need it (though it’s fun seeing ancient Plex items reappear). Heads-up: it can take ages depending on your library size; watch the progress in your container console log… and chilllllllll.


✨ Highlights

  • SIMKL ⇄ TRAKT history sync now works.

    • SIMKL → TRAKT: episodes are resolved to real episode IDs; multiple plays are preserved via watched_at.
    • TRAKT → SIMKL: movies and episodes transfer with correct IDs and timestamps.
    • BACKUP: great way to backup your data between SIMKL and Trakt.
  • Discover actually finds things again.
    Smarter query variants: we now try &and, and convert digits 1–9 ↔ words (e.g., House 1House One).
    Also strip locale junk like (NL) or any parentheses before searching (e.g., Encanto (NL)Encanto).

  • SIMKL/TRAKT mappings restored.
    The GUID fallback/enrichment path is back to the old reliability, but with safer checks.

  • Plex history sync is sturdier.
    Better ratingKey resolution, saner episode heuristics, fewer silent skips, clearer debug logs.


CrossWatch – v0.2.9

History-first release for Emby and a handful of quality-of-life tweaks...and some other things i probably forgot.


✨ Highlights

  • Emby History → SIMKL/TRAKT and Emby History → Plex now works for movies and episodes.
  • Resilient episode fallback.
    When writing episodes, we resolve using series IDs and SxxEyy when required. Works even if per‑episode IDs are thin, as long as the series is recognizable.
  • Presence‑aware writes.
    If Emby already shows an item as played (even without a stored date), CrossWatch avoids destructive rewrites unless you explicitly opt in.

🔧 Fixes & Changes

Emby — History (destination)

  • Accurate writes: Played state is toggled through Playstate; timestamps are set via UserData only when a valid watched_at exists.
  • Backdate tolerance: By default, we don’t overwrite a newer Emby date if it’s within a small window of the source time (default 300s).
  • Force overwrite (optional): If enabled, we unmark+remark to apply your exact timestamp (still requires a real timestamp). Disabled by default.
  • Episodes: Safer resolution using SeriesId + SxxEyy; adds series year when available to assist resolution.
  • Progress debug Apply logs show wrote, forced, backdated, skip_newer, skip_played_untimed, skip_missing_date, fail_mark.

Important: When watched_at is missing, the item is skipped regardless of other flags. We never invent timestamps.

Insights – title clarity & grouping

  • Smarter titles. Normalization handles minor punctuation/spacing variants and common sequel patterns.
  • Series/Episode display. Episodes are labeled Show Name S01E07 (or S0 for specials), with episode names still visible in supporting columns.
  • Year-aware disambiguation. When two movies share a title, the year is surfaced to avoid “phantom duplicates.”
  • Canonical key de‑dupe. Provider rows that only differ by harmless title quirks are collapsed under one canonical entry (counts and IDs are preserved).
  • ID badges cleaned. IMDb/TMDb/TVDb are prioritized; we avoid showing the same ID twice under different casing or formats.
  • Fewer false deltas. Normalized titles reduce bogus +add/−remove pairs caused by tiny title formatting differences.

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, and collection.
    • Default list name comes from watchlist_playlist_name configure 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/plextrakt
    • Jellyfin (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.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 or runtime.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-feature enable)

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 is On + 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

  1. Stop container; back up your /config.
  2. Remove your complete /config
  3. Pull latest: ghcr.io/cenodude/crosswatch:latest.
  4. Start; visit Settings → verify tokens + library scopes.
  5. 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

Don't miss a new CrossWatch release

NewReleases is sending notifications on new releases.