Ctrl K
ComunidadGuías…

changelog.json

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
{
  "version": "2.2.4",
  "updatedAt": "2026-11-05T22:24:37.070Z",
  "entries": [
    {
      "version": "2.2.4",
      "version5Digit": "2.2.4.0.0",
      "date": "2026-11-05T22:24:37.070Z",
      "commit": "9f41cac14842f6792d1f8156ad758c79e551faef",
      "message": "This update adds per-show alternate episode orders, a Download range for logs, an opt-in anonymous install check and a Plembfin image notice, and fixes Trakt double writes and many sync, restore and sign-in gaps.",
      "websiteUrl": "https://plekt.net",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Choose Aired, DVD or any other order TVDB lists for a show from its Episode order menu, using TVDB's own name for the order. The dialog says plainly when a show has no alternative orders.",
        "Feature: Review, save, replace and remove DVD-to-aired episode links from the show menu. Each link records which order it belongs to, and links saved before this count as DVD.",
        "Feature: Plex library-change notifications, the scheduled recently-watched import for Plex, Emby and Jellyfin, and live-session completion now translate the chosen episode order before saving, so nothing is stored under the media server's own numbers.",
        "Feature: A watch whose episode cannot be translated is skipped and logged with the reason, and the rest of the poll carries on.",
        "Feature: Choosing a non-Aired episode order for a show now warns that Simkl cannot confirm the episode and requires a checkbox before it can be used; without Simkl connected, a shorter note explains the same.",
        "Feature: Watches for a show in a non-Aired order are no longer sent to Simkl, while Plex, Emby, Jellyfin and Trakt still receive them. Other shows are not affected, and a Simkl item skipped by this policy is closed instead of being resent every minute.",
        "Feature: Download Logs on the Logs screen now has a Download range choice (last hour, 6 hours, 24 hours, 3 days or all kept logs) and exports up to the 20,000 lines Plekt keeps instead of the newest 500, and its Clear, Download and Copy buttons stay visible on shorter windows.",
        "Feature: Installs still running the Plembfin Docker image now see a dismissible notice card at the top of the app that tells them to switch to the Plekt image, with a link to the switch steps.",
        "Feature: The notice returns after each update until the install switches, and never appears on the Plekt image.",
        "Feature: Added four short switch steps for Docker Compose, Docker run, Unraid and Watchtower to the README and the upgrade guide, and stated that the old image names keep receiving updates until at least 11 April 2027.",
        "Feature: Add an optional anonymous daily install check in the Privacy section of General. It is off until you turn it on, shows the exact payload it would send, and sends no identifier, server address or library data.",
        "Fix: Stop a saved watch from being split into two Trakt writes that left it held for review, and keep a manual watch on Trakt when Retry Sync replays it.",
        "Tweak: Block watch-state changes when episode identities cannot be verified for every required destination, including before clearing progress or removing episodes.",
        "Tweak: Prevent stale background retries from restoring a deleted or superseded watch.",
        "Tweak: The Logs screen fills the window with the same gap at the bottom as the other edges, and the filter box and Download range dropdown now match the rest of the app, with their labels beside them.",
        "Tweak: Log entries on a phone show the message on its own full-width line instead of one word per line.",
        "Tweak: The show and movie Info panel on a phone starts below the top bars, so its poster and title are no longer hidden, and a long title wraps by words instead of one letter per line.",
        "Tweak: Show the last confirmed Up Next cards while checking for changes after a reload",
        "Tweak: Reuse shared snapshots and saved library answers to reduce repeated queue builds",
        "Tweak: Pages and the API stay responsive while tracker polls, cache warm-ups and Up Next rebuilds run; requests that took up to 22 seconds now answer in well under one",
        "Tweak: Settings storage totals load quickly on large artwork caches, the changelog loads quickly after the first view, and the Logs page stops polling while its tab is hidden",
        "Tweak: Up Next: one queue change now causes fewer rebuilds (a removal went from 5 builds to 3), and an automatic push no longer sends the same queue to your providers twice after their own echo",
        "Tweak: Up Next: the diagnostic log now shows who asked for each build, why the saved queue was out of date, and exactly which cards were added, removed or reordered",
        "Tweak: Restoring a full Plekt backup now saves a recovery copy of your current database first, and the error names where it is if the restore fails part way",
        "Tweak: Safety snapshots taken before imports or syncs are kept for at least seven days, and one locked backup file no longer stops old backups being cleaned up",
        "Tweak: Diagnostic logs are kept for fourteen days instead of being cut at twenty files, orphaned artwork is cleaned up daily, and the database log file is trimmed so it stops growing without limit",
        "Tweak: Artwork and show-progress files are written safely so a failed write keeps the previous complete file, and oversized artwork downloads are stopped early",
        "Tweak: Force Sync reads every Plex section in pages and reports a failed or incomplete library scan instead of treating it as empty, so nothing is wrongly replayed",
        "Tweak: Force Sync is faster: library replay runs four items at once while keeping each item's order, Emby and Jellyfin scans use cheaper paging, and cancelling a preview stops it between pages",
        "Tweak: A watch is no longer sent twice when a live play and the background retry overlap, and the retry pass no longer repeats work for rows that do not need it",
        "Tweak: Trakt rejecting only some items in a batch now keeps the successful ones settled and retries just the rejected ones, and an unidentifiable rejection is held for review instead of being retried blindly",
        "Tweak: Dropped titles sync to Trakt and Simkl per user, a failed write is retried after an hour, and a new drop or un-drop retries immediately without two processes sending the same change",
        "Tweak: A rating list that comes back completely empty from a provider is held for review instead of clearing your ratings, and a lost playlist ledger no longer removes entries from the connected server",
        "Tweak: TMDB and TVDB rate limits are handled with bounded retries and a short cool-down, and Plex live-connection restarts no longer open duplicate sockets or poll in a tight loop",
        "Tweak: Watching the same title twice in one local day is judged by your server's calendar day, Plex ids with query strings are read correctly, and the Sync jobs list pages correctly",
        "Tweak: Browser caches for posters, details and search results are capped so a long session no longer keeps growing",
        "Tweak: A signed-in added user can no longer read the administrator's API key or webhook secret by sending any API key header",
        "Tweak: Backup restore and backup upload on the Restore page are now for the install administrator only",
        "Tweak: Backup uploads are limited to 4 GB and are refused when the server would be left with too little free disk space",
        "Tweak: Testing a Plex, Emby or Jellyfin connection only uses the saved token for the saved server address; a different address needs the token entered",
        "Tweak: An added user no longer sees the admin's watch history, shows, movies, stats or dashboard preview when both happen to be at the same data version",
        "Tweak: The pending manual-review list is cached per user as well",
        "Tweak: Switching between users no longer forces their caches to rebuild; up to 8 users stay cached in memory",
        "Tweak: Logging out now revokes that session for good, even after a restart or from another process, and each session cookie is unique",
        "Tweak: Changes made from another website or an untrusted origin are rejected, while your own pages and server-to-server callers such as webhooks keep working",
        "Tweak: The cron and stop endpoints now refuse plain GET requests, and webhook errors no longer reveal internal error details",
        "Tweak: Successful logins no longer count against the failed-login allowance",
        "Tweak: Login and claim requests are limited to 32 KiB and webhooks to 1 MiB before they are read",
        "Tweak: The saved settings file is created readable only by Plekt before any secrets are written to it",
        "Tweak: Redirects to another site no longer carry your tokens, API keys or request bodies with them",
        "Tweak: New website guide on importing each friend's Tautulli watch history into their own Plekt user and Emby or Jellyfin account",
        "Tweak: The Guides list, the Users settings guide and the Tautulli guide now link to it"
      ],
      "sections": {
        "newFeatures": [
          "Choose Aired, DVD or any other order TVDB lists for a show from its Episode order menu, using TVDB's own name for the order. The dialog says plainly when a show has no alternative orders.",
          "Review, save, replace and remove DVD-to-aired episode links from the show menu. Each link records which order it belongs to, and links saved before this count as DVD.",
          "Plex library-change notifications, the scheduled recently-watched import for Plex, Emby and Jellyfin, and live-session completion now translate the chosen episode order before saving, so nothing is stored under the media server's own numbers.",
          "A watch whose episode cannot be translated is skipped and logged with the reason, and the rest of the poll carries on.",
          "Choosing a non-Aired episode order for a show now warns that Simkl cannot confirm the episode and requires a checkbox before it can be used; without Simkl connected, a shorter note explains the same.",
          "Watches for a show in a non-Aired order are no longer sent to Simkl, while Plex, Emby, Jellyfin and Trakt still receive them. Other shows are not affected, and a Simkl item skipped by this policy is closed instead of being resent every minute.",
          "Download Logs on the Logs screen now has a Download range choice (last hour, 6 hours, 24 hours, 3 days or all kept logs) and exports up to the 20,000 lines Plekt keeps instead of the newest 500, and its Clear, Download and Copy buttons stay visible on shorter windows.",
          "Installs still running the Plembfin Docker image now see a dismissible notice card at the top of the app that tells them to switch to the Plekt image, with a link to the switch steps.",
          "The notice returns after each update until the install switches, and never appears on the Plekt image.",
          "Added four short switch steps for Docker Compose, Docker run, Unraid and Watchtower to the README and the upgrade guide, and stated that the old image names keep receiving updates until at least 11 April 2027.",
          "Add an optional anonymous daily install check in the Privacy section of General. It is off until you turn it on, shows the exact payload it would send, and sends no identifier, server address or library data."
        ],
        "majorBugFixes": [
          "Stop a saved watch from being split into two Trakt writes that left it held for review, and keep a manual watch on Trakt when Retry Sync replays it."
        ],
        "tweaks": [
          "Block watch-state changes when episode identities cannot be verified for every required destination, including before clearing progress or removing episodes.",
          "Prevent stale background retries from restoring a deleted or superseded watch.",
          "The Logs screen fills the window with the same gap at the bottom as the other edges, and the filter box and Download range dropdown now match the rest of the app, with their labels beside them.",
          "Log entries on a phone show the message on its own full-width line instead of one word per line.",
          "The show and movie Info panel on a phone starts below the top bars, so its poster and title are no longer hidden, and a long title wraps by words instead of one letter per line.",
          "Show the last confirmed Up Next cards while checking for changes after a reload",
          "Reuse shared snapshots and saved library answers to reduce repeated queue builds",
          "Pages and the API stay responsive while tracker polls, cache warm-ups and Up Next rebuilds run; requests that took up to 22 seconds now answer in well under one",
          "Settings storage totals load quickly on large artwork caches, the changelog loads quickly after the first view, and the Logs page stops polling while its tab is hidden",
          "Up Next: one queue change now causes fewer rebuilds (a removal went from 5 builds to 3), and an automatic push no longer sends the same queue to your providers twice after their own echo",
          "Up Next: the diagnostic log now shows who asked for each build, why the saved queue was out of date, and exactly which cards were added, removed or reordered",
          "Restoring a full Plekt backup now saves a recovery copy of your current database first, and the error names where it is if the restore fails part way",
          "Safety snapshots taken before imports or syncs are kept for at least seven days, and one locked backup file no longer stops old backups being cleaned up",
          "Diagnostic logs are kept for fourteen days instead of being cut at twenty files, orphaned artwork is cleaned up daily, and the database log file is trimmed so it stops growing without limit",
          "Artwork and show-progress files are written safely so a failed write keeps the previous complete file, and oversized artwork downloads are stopped early",
          "Force Sync reads every Plex section in pages and reports a failed or incomplete library scan instead of treating it as empty, so nothing is wrongly replayed",
          "Force Sync is faster: library replay runs four items at once while keeping each item's order, Emby and Jellyfin scans use cheaper paging, and cancelling a preview stops it between pages",
          "A watch is no longer sent twice when a live play and the background retry overlap, and the retry pass no longer repeats work for rows that do not need it",
          "Trakt rejecting only some items in a batch now keeps the successful ones settled and retries just the rejected ones, and an unidentifiable rejection is held for review instead of being retried blindly",
          "Dropped titles sync to Trakt and Simkl per user, a failed write is retried after an hour, and a new drop or un-drop retries immediately without two processes sending the same change",
          "A rating list that comes back completely empty from a provider is held for review instead of clearing your ratings, and a lost playlist ledger no longer removes entries from the connected server",
          "TMDB and TVDB rate limits are handled with bounded retries and a short cool-down, and Plex live-connection restarts no longer open duplicate sockets or poll in a tight loop",
          "Watching the same title twice in one local day is judged by your server's calendar day, Plex ids with query strings are read correctly, and the Sync jobs list pages correctly",
          "Browser caches for posters, details and search results are capped so a long session no longer keeps growing",
          "A signed-in added user can no longer read the administrator's API key or webhook secret by sending any API key header",
          "Backup restore and backup upload on the Restore page are now for the install administrator only",
          "Backup uploads are limited to 4 GB and are refused when the server would be left with too little free disk space",
          "Testing a Plex, Emby or Jellyfin connection only uses the saved token for the saved server address; a different address needs the token entered",
          "An added user no longer sees the admin's watch history, shows, movies, stats or dashboard preview when both happen to be at the same data version",
          "The pending manual-review list is cached per user as well",
          "Switching between users no longer forces their caches to rebuild; up to 8 users stay cached in memory",
          "Logging out now revokes that session for good, even after a restart or from another process, and each session cookie is unique",
          "Changes made from another website or an untrusted origin are rejected, while your own pages and server-to-server callers such as webhooks keep working",
          "The cron and stop endpoints now refuse plain GET requests, and webhook errors no longer reveal internal error details",
          "Successful logins no longer count against the failed-login allowance",
          "Login and claim requests are limited to 32 KiB and webhooks to 1 MiB before they are read",
          "The saved settings file is created readable only by Plekt before any secrets are written to it",
          "Redirects to another site no longer carry your tokens, API keys or request bodies with them",
          "New website guide on importing each friend's Tautulli watch history into their own Plekt user and Emby or Jellyfin account",
          "The Guides list, the Users settings guide and the Tautulli guide now link to it"
        ]
      },
      "sectionGroups": {
        "newFeatures": [
          {
            "title": "Sync & connection recovery",
            "details": [
              "Choose Aired, DVD or any other order TVDB lists for a show from its Episode order menu, using TVDB's own name for the order. The dialog says plainly when a show has no alternative orders.",
              "Review, save, replace and remove DVD-to-aired episode links from the show menu. Each link records which order it belongs to, and links saved before this count as DVD.",
              "Plex library-change notifications, the scheduled recently-watched import for Plex, Emby and Jellyfin, and live-session completion now translate the chosen episode order before saving, so nothing is stored under the media server's own numbers.",
              "A watch whose episode cannot be translated is skipped and logged with the reason, and the rest of the poll carries on.",
              "Choosing a non-Aired episode order for a show now warns that Simkl cannot confirm the episode and requires a checkbox before it can be used; without Simkl connected, a shorter note explains the same.",
              "Watches for a show in a non-Aired order are no longer sent to Simkl, while Plex, Emby, Jellyfin and Trakt still receive them. Other shows are not affected, and a Simkl item skipped by this policy is closed instead of being resent every minute.",
              "Download Logs on the Logs screen now has a Download range choice (last hour, 6 hours, 24 hours, 3 days or all kept logs) and exports up to the 20,000 lines Plekt keeps instead of the newest 500, and its Clear, Download and Copy buttons stay visible on shorter windows.",
              "Installs still running the Plembfin Docker image now see a dismissible notice card at the top of the app that tells them to switch to the Plekt image, with a link to the switch steps.",
              "The notice returns after each update until the install switches, and never appears on the Plekt image.",
              "Added four short switch steps for Docker Compose, Docker run, Unraid and Watchtower to the README and the upgrade guide, and stated that the old image names keep receiving updates until at least 11 April 2027.",
              "Add an optional anonymous daily install check in the Privacy section of General. It is off until you turn it on, shows the exact payload it would send, and sends no identifier, server address or library data."
            ]
          }
        ],
        "majorBugFixes": [
          {
            "title": "Sync & provider recovery",
            "details": [
              "Stop a saved watch from being split into two Trakt writes that left it held for review, and keep a manual watch on Trakt when Retry Sync replays it."
            ]
          }
        ],
        "tweaks": [
          {
            "title": "Up Next & watch-state",
            "details": [
              "Block watch-state changes when episode identities cannot be verified for every required destination, including before clearing progress or removing episodes.",
              "Show the last confirmed Up Next cards while checking for changes after a reload",
              "Pages and the API stay responsive while tracker polls, cache warm-ups and Up Next rebuilds run; requests that took up to 22 seconds now answer in well under one",
              "Up Next: one queue change now causes fewer rebuilds (a removal went from 5 builds to 3), and an automatic push no longer sends the same queue to your providers twice after their own echo",
              "Up Next: the diagnostic log now shows who asked for each build, why the saved queue was out of date, and exactly which cards were added, removed or reordered"
            ]
          },
          {
            "title": "Sync & connection recovery",
            "details": [
              "Prevent stale background retries from restoring a deleted or superseded watch.",
              "The Logs screen fills the window with the same gap at the bottom as the other edges, and the filter box and Download range dropdown now match the rest of the app, with their labels beside them.",
              "Log entries on a phone show the message on its own full-width line instead of one word per line.",
              "The show and movie Info panel on a phone starts below the top bars, so its poster and title are no longer hidden, and a long title wraps by words instead of one letter per line.",
              "Reuse shared snapshots and saved library answers to reduce repeated queue builds",
              "Settings storage totals load quickly on large artwork caches, the changelog loads quickly after the first view, and the Logs page stops polling while its tab is hidden",
              "Restoring a full Plekt backup now saves a recovery copy of your current database first, and the error names where it is if the restore fails part way",
              "Safety snapshots taken before imports or syncs are kept for at least seven days, and one locked backup file no longer stops old backups being cleaned up",
              "Diagnostic logs are kept for fourteen days instead of being cut at twenty files, orphaned artwork is cleaned up daily, and the database log file is trimmed so it stops growing without limit",
              "Artwork and show-progress files are written safely so a failed write keeps the previous complete file, and oversized artwork downloads are stopped early",
              "Force Sync reads every Plex section in pages and reports a failed or incomplete library scan instead of treating it as empty, so nothing is wrongly replayed",
              "Force Sync is faster: library replay runs four items at once while keeping each item's order, Emby and Jellyfin scans use cheaper paging, and cancelling a preview stops it between pages",
              "A watch is no longer sent twice when a live play and the background retry overlap, and the retry pass no longer repeats work for rows that do not need it",
              "Trakt rejecting only some items in a batch now keeps the successful ones settled and retries just the rejected ones, and an unidentifiable rejection is held for review instead of being retried blindly",
              "Dropped titles sync to Trakt and Simkl per user, a failed write is retried after an hour, and a new drop or un-drop retries immediately without two processes sending the same change",
              "A rating list that comes back completely empty from a provider is held for review instead of clearing your ratings, and a lost playlist ledger no longer removes entries from the connected server",
              "TMDB and TVDB rate limits are handled with bounded retries and a short cool-down, and Plex live-connection restarts no longer open duplicate sockets or poll in a tight loop",
              "Watching the same title twice in one local day is judged by your server's calendar day, Plex ids with query strings are read correctly, and the Sync jobs list pages correctly",
              "Browser caches for posters, details and search results are capped so a long session no longer keeps growing",
              "A signed-in added user can no longer read the administrator's API key or webhook secret by sending any API key header",
              "Backup restore and backup upload on the Restore page are now for the install administrator only",
              "Backup uploads are limited to 4 GB and are refused when the server would be left with too little free disk space",
              "Testing a Plex, Emby or Jellyfin connection only uses the saved token for the saved server address; a different address needs the token entered",
              "An added user no longer sees the admin's watch history, shows, movies, stats or dashboard preview when both happen to be at the same data version",
              "The pending manual-review list is cached per user as well",
              "Switching between users no longer forces their caches to rebuild; up to 8 users stay cached in memory",
              "Logging out now revokes that session for good, even after a restart or from another process, and each session cookie is unique",
              "Changes made from another website or an untrusted origin are rejected, while your own pages and server-to-server callers such as webhooks keep working",
              "The cron and stop endpoints now refuse plain GET requests, and webhook errors no longer reveal internal error details",
              "Successful logins no longer count against the failed-login allowance",
              "Login and claim requests are limited to 32 KiB and webhooks to 1 MiB before they are read",
              "The saved settings file is created readable only by Plekt before any secrets are written to it",
              "Redirects to another site no longer carry your tokens, API keys or request bodies with them",
              "New website guide on importing each friend's Tautulli watch history into their own Plekt user and Emby or Jellyfin account",
              "The Guides list, the Users settings guide and the Tautulli guide now link to it"
            ]
          }
        ]
      }
    },
    {
      "version": "2.2.3",
      "version5Digit": "2.2.3.0.0",
      "date": "2026-10-31T10:15:55.414Z",
      "commit": "221ae622e065b0c4eb2ab68de27bfa4a1f974f0a",
      "message": "Stop a saved watch from being split into two Trakt writes and held for review, and keep a manual watch on Trakt when Retry Sync replays it.",
      "websiteUrl": "https://plekt.net",
      "author": "Lasikiewicz",
      "details": [
        "Fix: Stop a saved watch from being split into two Trakt writes and held for review, and keep a manual watch on Trakt when Retry Sync replays it."
      ],
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [
          "Stop a saved watch from being split into two Trakt writes and held for review, and keep a manual watch on Trakt when Retry Sync replays it."
        ],
        "tweaks": []
      },
      "sectionGroups": {
        "newFeatures": [],
        "majorBugFixes": [
          {
            "title": "Sync & connection recovery",
            "details": [
              "Stop a saved watch from being split into two Trakt writes and held for review, and keep a manual watch on Trakt when Retry Sync replays it."
            ]
          }
        ],
        "tweaks": []
      }
    },
    {
      "version": "2.2.2",
      "version5Digit": "2.2.2.0.0",
      "date": "2026-10-31T08:05:36.208Z",
      "commit": "04090acd7ea8a5f3e68d8a41af6023f847fe53df",
      "message": "This release improves Emby and Jellyfin sync diagnostics, adds safer webhook tests and split episode repair, and refines upcoming episode handling.",
      "websiteUrl": "https://plekt.net",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Improve Emby sync and webhook diagnostics",
        "Feature: Add an audited Emby and Jellyfin split episode repair with backup, per-show approval and undo.",
        "Feature: Resolve series IDs during Force Sync and suppress conflicting watched and unwatched writes.",
        "Feature: Parse Emby multipart notifications, link Stats by show ID, and preserve History search input.",
        "Feature: Add Emby and Jellyfin webhook delivery tests with safe mark removal and cause-specific results.",
        "Feature: Align webhook setup controls and improve dialog contrast and mobile spacing.",
        "Feature: Rename the Emby Up Next device and keep its refresh out of Now Playing.",
        "Feature: Deduplicate Upcoming episodes, cap its month range, and use recorded TVDB IDs for next-airing lookups.",
        "Feature: Reorganize website installation, onboarding and provider guides, and improve documentation navigation and tables.",
        "Fix: Stop a single Trakt play being held for review as two competing writes."
      ],
      "sections": {
        "newFeatures": [
          "Improve Emby sync and webhook diagnostics",
          "Add an audited Emby and Jellyfin split episode repair with backup, per-show approval and undo.",
          "Resolve series IDs during Force Sync and suppress conflicting watched and unwatched writes.",
          "Parse Emby multipart notifications, link Stats by show ID, and preserve History search input.",
          "Add Emby and Jellyfin webhook delivery tests with safe mark removal and cause-specific results.",
          "Align webhook setup controls and improve dialog contrast and mobile spacing.",
          "Rename the Emby Up Next device and keep its refresh out of Now Playing.",
          "Deduplicate Upcoming episodes, cap its month range, and use recorded TVDB IDs for next-airing lookups.",
          "Reorganize website installation, onboarding and provider guides, and improve documentation navigation and tables."
        ],
        "majorBugFixes": [
          "Stop a single Trakt play being held for review as two competing writes."
        ],
        "tweaks": []
      },
      "sectionGroups": {
        "newFeatures": [
          {
            "title": "Sync & connection recovery",
            "details": [
              "Improve Emby sync and webhook diagnostics",
              "Add an audited Emby and Jellyfin split episode repair with backup, per-show approval and undo.",
              "Resolve series IDs during Force Sync and suppress conflicting watched and unwatched writes.",
              "Parse Emby multipart notifications, link Stats by show ID, and preserve History search input.",
              "Add Emby and Jellyfin webhook delivery tests with safe mark removal and cause-specific results.",
              "Align webhook setup controls and improve dialog contrast and mobile spacing.",
              "Rename the Emby Up Next device and keep its refresh out of Now Playing.",
              "Deduplicate Upcoming episodes, cap its month range, and use recorded TVDB IDs for next-airing lookups.",
              "Reorganize website installation, onboarding and provider guides, and improve documentation navigation and tables."
            ]
          }
        ],
        "majorBugFixes": [
          {
            "title": "Sync & connection recovery",
            "details": [
              "Stop a single Trakt play being held for review as two competing writes."
            ]
          }
        ],
        "tweaks": []
      }
    },
    {
      "version": "2.2.1",
      "version5Digit": "2.2.1.0.0",
      "date": "2026-10-28T00:53:10.354Z",
      "commit": "bb6f0f44f6c459b207cacd8158c4f31fc04f0450",
      "message": "Hotfix: This update gives each added user their own scheduled sync and shared Plex Now Playing, adds Server Logs controls, and stops large Emby and Jellyfin watched imports timing out.",
      "websiteUrl": "https://plekt.net",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Added users now get their own scheduled sync and queued-job processing.",
        "Feature: Shared Plex playback now shows in the matching user's Now Playing, while each user's credentials and history stay separate.",
        "Feature: Server Logs can pause live updates, follow the newest entries and filter by text, and keep your reading position during refreshes.",
        "Fix: The initial watched-status import from Emby and Jellyfin now reads played history in pages of 500, so a large watch history no longer fails with \"Upstream request timed out after 10000ms\".",
        "Fix: Anonymous Plex owner-ID sessions are now ignored, and the same Plex account can no longer be connected twice.",
        "Fix: Completed playback now reuses its pending tracker update, so an interrupted run can no longer send conflicting updates to a tracker.",
        "Fix: Same-title shows with conflicting provider identities are now kept separate in Stats.",
        "Fix: AniDB anime descriptions no longer keep partial HTML tag fragments after markup is stripped.",
        "Tweak: Watched-history reads no longer request artwork from Emby and Jellyfin, so third-party image plugins cannot slow them down.",
        "Tweak: Historical Simkl baseline evidence no longer shows as a persistent warning, and tracker reviews show a compact title, watch date and history buttons.",
        "Tweak: Idle playback checks now run every 5 minutes (every 10 seconds once playback is detected), and setup help explains how plugins or webhooks give prompt updates."
      ],
      "sections": {
        "newFeatures": [
          "Added users now get their own scheduled sync and queued-job processing.",
          "Shared Plex playback now shows in the matching user's Now Playing, while each user's credentials and history stay separate.",
          "Server Logs can pause live updates, follow the newest entries and filter by text, and keep your reading position during refreshes."
        ],
        "majorBugFixes": [
          "The initial watched-status import from Emby and Jellyfin now reads played history in pages of 500, so a large watch history no longer fails with \"Upstream request timed out after 10000ms\".",
          "Anonymous Plex owner-ID sessions are now ignored, and the same Plex account can no longer be connected twice.",
          "Completed playback now reuses its pending tracker update, so an interrupted run can no longer send conflicting updates to a tracker.",
          "Same-title shows with conflicting provider identities are now kept separate in Stats.",
          "AniDB anime descriptions no longer keep partial HTML tag fragments after markup is stripped."
        ],
        "tweaks": [
          "Watched-history reads no longer request artwork from Emby and Jellyfin, so third-party image plugins cannot slow them down.",
          "Historical Simkl baseline evidence no longer shows as a persistent warning, and tracker reviews show a compact title, watch date and history buttons.",
          "Idle playback checks now run every 5 minutes (every 10 seconds once playback is detected), and setup help explains how plugins or webhooks give prompt updates."
        ]
      },
      "sectionGroups": {
        "newFeatures": [
          {
            "title": "Sync & connection recovery",
            "details": [
              "Added users now get their own scheduled sync and queued-job processing.",
              "Shared Plex playback now shows in the matching user's Now Playing, while each user's credentials and history stay separate.",
              "Server Logs can pause live updates, follow the newest entries and filter by text, and keep your reading position during refreshes."
            ]
          }
        ],
        "majorBugFixes": [
          {
            "title": "Sync & provider recovery",
            "details": [
              "The initial watched-status import from Emby and Jellyfin now reads played history in pages of 500, so a large watch history no longer fails with \"Upstream request timed out after 10000ms\".",
              "Anonymous Plex owner-ID sessions are now ignored, and the same Plex account can no longer be connected twice.",
              "Completed playback now reuses its pending tracker update, so an interrupted run can no longer send conflicting updates to a tracker.",
              "Same-title shows with conflicting provider identities are now kept separate in Stats.",
              "AniDB anime descriptions no longer keep partial HTML tag fragments after markup is stripped."
            ]
          }
        ],
        "tweaks": [
          {
            "title": "Sync & connection recovery",
            "details": [
              "Watched-history reads no longer request artwork from Emby and Jellyfin, so third-party image plugins cannot slow them down.",
              "Historical Simkl baseline evidence no longer shows as a persistent warning, and tracker reviews show a compact title, watch date and history buttons.",
              "Idle playback checks now run every 5 minutes (every 10 seconds once playback is detected), and setup help explains how plugins or webhooks give prompt updates."
            ]
          }
        ]
      }
    },
    {
      "version": "2.2.0",
      "version5Digit": "2.2.0.0.0",
      "date": "2026-10-26T22:53:00.455Z",
      "commit": "4c4bde8f5ff86203acd94964cf7832888b7f80a9",
      "message": "This update adds Simkl, Netflix imports and multi-user accounts, while improving sync, navigation and mobile layouts.",
      "websiteUrl": "https://plekt.net",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Connect Simkl without a personal Client ID to sync watch history and ratings alongside Trakt, with a reviewable first sync and on-demand checks.",
        "Feature: Create multiple user accounts with administrator-managed access, keeping each person's data and sessions separate.",
        "Feature: Use the Plekt Emby and Jellyfin plugins for media-server events, with setup guides for each plugin and the webhook alternative.",
        "Feature: Import Netflix viewing history from a CSV or personal-information ZIP, choose a profile, review matches and import selected watches with their original dates.",
        "Feature: Browse cast filmographies with Movies and TV Shows tabs and year and genre filters.",
        "Feature: Watch History offers a Days view, grouping watches by date, alongside the existing Cards view.",
        "Feature: Drop (with a [bequbed](https://github.com/bequbed) animation) and restore titles from Up Next or their detail pages; filter dropped titles and see their count in Stats.",
        "Feature: Enable AniDB titles and descriptions for anime, review matches, and safely match titles with a single supported link.",
        "Feature: Subscribe to upcoming movie and TV releases using a private calendar feed; regenerate the URL to revoke the old one.",
        "Feature: Add TV season source selection, episode translation, unmatched episode handling, and translated Up Next warmup.",
        "Fix: Up Next and Recently Watched refresh across open dashboards and devices, and returning to the dashboard shows cached cards while fresh results load.",
        "Fix: Resume sync preserves newer stop positions, avoids repeated Plex resume updates and restores eligible Emby Continue Watching items.",
        "Fix: Jellyfin webhook events recognize dashed user IDs, and the higher webhook rate limit accommodates bursts.",
        "Fix: A title that is playing live no longer also appears as its own part watched card in Now Playing or the Up Next rail",
        "Tweak: Add sidebar links to Discord and Reddit, with an option to hide project links.",
        "Tweak: Review confirmed TV episode numbering conflicts in Manual Watch, with a count and dismiss action that leaves watch state unchanged.",
        "Tweak: Setup guides explain the Plekt Emby and Jellyfin plugins and their webhook alternatives, and warn against enabling both.",
        "Tweak: Media server cards in the setup wizard show their logos, and backup options are grouped into local and remote sections.",
        "Tweak: Setup cards and status indicators follow Settings styling in both themes, with clearer tracker and import progress.",
        "Tweak: Library pages show loading progress, retain the first page while refreshing and preserve distinct titles sharing artwork.",
        "Tweak: Desktop navigation and library controls remain visible without empty action space.",
        "Tweak: Opening Info from a scrolled media page keeps the header visible and closes the Options menu.",
        "Tweak: On phones, featured Up Next and Now Playing cards have larger posters, and Up Next actions use a compact toolbar.",
        "Tweak: Opened Watchlist, Ratings and Watch History posters retain their folded size on phones.",
        "Tweak: Phone layouts improve cast profiles, TV library cards, Discover and Playlists rows, and the timeline live panel.",
        "Tweak: Playing sessions show a Now playing label, while paused sessions retain their Paused label.",
        "Tweak: Settings shows plain connection statuses and keeps Help cards compact until expanded.",
        "Tweak: First-run tracker imports can run in parallel and start an add-only outward sync with progress and held-item counts.",
        "Tweak: Tautulli and Netflix imports are grouped under One Time Imports in Settings.",
        "Tweak: Opening Settings no longer automatically requests Seerr capabilities.",
        "Tweak: Webhook rate limits allow larger media-server event bursts.",
        "Tweak: Installation steps remain readable on phones in both themes.",
        "Tweak: Trakt errors and restore conflicts show safe messages, and security-related dependencies have been updated.",
        "Tweak: This update includes improve watch state, season mapping and presentation, tighten match flow and confirm Plex unwatches, restyle appearance, brand surfaces and the login page, fall back when cached artwork files are missing, and hide card art on media detail pages.",
        "Tweak: Preserve completed Plex watch state across stale resume data and protect unwatch races.",
        "Tweak: Preserve Trakt-only plays during show replacement and fail closed on occupied targets.",
        "Tweak: Split sync, history import, polling, and scheduling work into focused modules with retry and lease safeguards.",
        "Tweak: Improve appearance controls, changelog navigation, Reddit release bundling, and README screenshots.",
        "Tweak: Re-check suspected Plex unwatches against live metadata and keep cached episode state aligned, preventing stale reports from reaching manual watch review.",
        "Tweak: Keep TV season-source choice and watch-impact confirmation beside search controls, with less blank space across phone, tablet, and desktop.",
        "Tweak: Use provider-neutral empty-season messaging when episode lists are unavailable while preserving TV and movie match results.",
        "Tweak: Modern is the only look; the Classic style and its switch are removed.",
        "Tweak: Card Art and Background Art checkboxes added to the Appearance menu (Background Art only on the Dashboard and details pages).",
        "Tweak: Appearance menu rows match the media option rows with icons, and Text size sits at the bottom.",
        "Tweak: Buttons use a neutral default state in both themes; hover changes only text and border.",
        "Tweak: Spoiler toggle no longer tints the whole button when checked; only the checkbox shows the state.",
        "Tweak: Settings use two brand surfaces in both themes, aligned with the left menu.",
        "Tweak: Dashboard and settings surfaces aligned with the left menu.",
        "Tweak: Navbar on every page uses the left-menu tone, not only media pages.",
        "Tweak: About card uses the left-menu tone in both themes.",
        "Tweak: Left-menu search is an underline field in light mode, as in dark.",
        "Tweak: Light-mode changelog entries use the white panel tone.",
        "Tweak: Softer outline on the selected settings section.",
        "Tweak: Onboarding and sign-in footer theme toggle shows the Light and Dark words only.",
        "Tweak: Login panel uses the left-menu tone and its fields use the main-background tone.",
        "Tweak: Login heading reads \"Please log in\"; the long intro text is removed.",
        "Tweak: \"Forgot your password?\" sits right-aligned under the password field.",
        "Tweak: Sign-in fields no longer show the default focus outline.",
        "Tweak: Show and movie posters now use provider artwork when a saved local image is unavailable.",
        "Tweak: Card Art is no longer offered in the Appearance menu on media detail pages, which have no cards to show it on"
      ],
      "sections": {
        "newFeatures": [
          "Connect Simkl without a personal Client ID to sync watch history and ratings alongside Trakt, with a reviewable first sync and on-demand checks.",
          "Create multiple user accounts with administrator-managed access, keeping each person's data and sessions separate.",
          "Use the Plekt Emby and Jellyfin plugins for media-server events, with setup guides for each plugin and the webhook alternative.",
          "Import Netflix viewing history from a CSV or personal-information ZIP, choose a profile, review matches and import selected watches with their original dates.",
          "Browse cast filmographies with Movies and TV Shows tabs and year and genre filters.",
          "Watch History offers a Days view, grouping watches by date, alongside the existing Cards view.",
          "Drop (with a [bequbed](https://github.com/bequbed) animation) and restore titles from Up Next or their detail pages; filter dropped titles and see their count in Stats.",
          "Enable AniDB titles and descriptions for anime, review matches, and safely match titles with a single supported link.",
          "Subscribe to upcoming movie and TV releases using a private calendar feed; regenerate the URL to revoke the old one.",
          "Add TV season source selection, episode translation, unmatched episode handling, and translated Up Next warmup."
        ],
        "majorBugFixes": [
          "Up Next and Recently Watched refresh across open dashboards and devices, and returning to the dashboard shows cached cards while fresh results load.",
          "Resume sync preserves newer stop positions, avoids repeated Plex resume updates and restores eligible Emby Continue Watching items.",
          "Jellyfin webhook events recognize dashed user IDs, and the higher webhook rate limit accommodates bursts.",
          "A title that is playing live no longer also appears as its own part watched card in Now Playing or the Up Next rail"
        ],
        "tweaks": [
          "Add sidebar links to Discord and Reddit, with an option to hide project links.",
          "Review confirmed TV episode numbering conflicts in Manual Watch, with a count and dismiss action that leaves watch state unchanged.",
          "Setup guides explain the Plekt Emby and Jellyfin plugins and their webhook alternatives, and warn against enabling both.",
          "Media server cards in the setup wizard show their logos, and backup options are grouped into local and remote sections.",
          "Setup cards and status indicators follow Settings styling in both themes, with clearer tracker and import progress.",
          "Library pages show loading progress, retain the first page while refreshing and preserve distinct titles sharing artwork.",
          "Desktop navigation and library controls remain visible without empty action space.",
          "Opening Info from a scrolled media page keeps the header visible and closes the Options menu.",
          "On phones, featured Up Next and Now Playing cards have larger posters, and Up Next actions use a compact toolbar.",
          "Opened Watchlist, Ratings and Watch History posters retain their folded size on phones.",
          "Phone layouts improve cast profiles, TV library cards, Discover and Playlists rows, and the timeline live panel.",
          "Playing sessions show a Now playing label, while paused sessions retain their Paused label.",
          "Settings shows plain connection statuses and keeps Help cards compact until expanded.",
          "First-run tracker imports can run in parallel and start an add-only outward sync with progress and held-item counts.",
          "Tautulli and Netflix imports are grouped under One Time Imports in Settings.",
          "Opening Settings no longer automatically requests Seerr capabilities.",
          "Webhook rate limits allow larger media-server event bursts.",
          "Installation steps remain readable on phones in both themes.",
          "Trakt errors and restore conflicts show safe messages, and security-related dependencies have been updated.",
          "This update includes improve watch state, season mapping and presentation, tighten match flow and confirm Plex unwatches, restyle appearance, brand surfaces and the login page, fall back when cached artwork files are missing, and hide card art on media detail pages.",
          "Preserve completed Plex watch state across stale resume data and protect unwatch races.",
          "Preserve Trakt-only plays during show replacement and fail closed on occupied targets.",
          "Split sync, history import, polling, and scheduling work into focused modules with retry and lease safeguards.",
          "Improve appearance controls, changelog navigation, Reddit release bundling, and README screenshots.",
          "Re-check suspected Plex unwatches against live metadata and keep cached episode state aligned, preventing stale reports from reaching manual watch review.",
          "Keep TV season-source choice and watch-impact confirmation beside search controls, with less blank space across phone, tablet, and desktop.",
          "Use provider-neutral empty-season messaging when episode lists are unavailable while preserving TV and movie match results.",
          "Modern is the only look; the Classic style and its switch are removed.",
          "Card Art and Background Art checkboxes added to the Appearance menu (Background Art only on the Dashboard and details pages).",
          "Appearance menu rows match the media option rows with icons, and Text size sits at the bottom.",
          "Buttons use a neutral default state in both themes; hover changes only text and border.",
          "Spoiler toggle no longer tints the whole button when checked; only the checkbox shows the state.",
          "Settings use two brand surfaces in both themes, aligned with the left menu.",
          "Dashboard and settings surfaces aligned with the left menu.",
          "Navbar on every page uses the left-menu tone, not only media pages.",
          "About card uses the left-menu tone in both themes.",
          "Left-menu search is an underline field in light mode, as in dark.",
          "Light-mode changelog entries use the white panel tone.",
          "Softer outline on the selected settings section.",
          "Onboarding and sign-in footer theme toggle shows the Light and Dark words only.",
          "Login panel uses the left-menu tone and its fields use the main-background tone.",
          "Login heading reads \"Please log in\"; the long intro text is removed.",
          "\"Forgot your password?\" sits right-aligned under the password field.",
          "Sign-in fields no longer show the default focus outline.",
          "Show and movie posters now use provider artwork when a saved local image is unavailable.",
          "Card Art is no longer offered in the Appearance menu on media detail pages, which have no cards to show it on"
        ]
      },
      "sectionGroups": {
        "newFeatures": [
          {
            "title": "Sync & connection recovery",
            "details": [
              "Connect Simkl without a personal Client ID to sync watch history and ratings alongside Trakt, with a reviewable first sync and on-demand checks.",
              "Create multiple user accounts with administrator-managed access, keeping each person's data and sessions separate.",
              "Use the Plekt Emby and Jellyfin plugins for media-server events, with setup guides for each plugin and the webhook alternative.",
              "Import Netflix viewing history from a CSV or personal-information ZIP, choose a profile, review matches and import selected watches with their original dates.",
              "Browse cast filmographies with Movies and TV Shows tabs and year and genre filters.",
              "Watch History offers a Days view, grouping watches by date, alongside the existing Cards view.",
              "Drop (with a [bequbed](https://github.com/bequbed) animation) and restore titles from Up Next or their detail pages; filter dropped titles and see their count in Stats.",
              "Enable AniDB titles and descriptions for anime, review matches, and safely match titles with a single supported link.",
              "Subscribe to upcoming movie and TV releases using a private calendar feed; regenerate the URL to revoke the old one.",
              "Add TV season source selection, episode translation, unmatched episode handling, and translated Up Next warmup."
            ]
          }
        ],
        "majorBugFixes": [
          {
            "title": "Up Next & watch-state",
            "details": [
              "Up Next and Recently Watched refresh across open dashboards and devices, and returning to the dashboard shows cached cards while fresh results load.",
              "A title that is playing live no longer also appears as its own part watched card in Now Playing or the Up Next rail"
            ]
          },
          {
            "title": "Sync & provider recovery",
            "details": [
              "Resume sync preserves newer stop positions, avoids repeated Plex resume updates and restores eligible Emby Continue Watching items.",
              "Jellyfin webhook events recognize dashed user IDs, and the higher webhook rate limit accommodates bursts."
            ]
          }
        ],
        "tweaks": [
          {
            "title": "Up Next & watch-state",
            "details": [
              "On phones, featured Up Next and Now Playing cards have larger posters, and Up Next actions use a compact toolbar.",
              "This update includes improve watch state, season mapping and presentation, tighten match flow and confirm Plex unwatches, restyle appearance, brand surfaces and the login page, fall back when cached artwork files are missing, and hide card art on media detail pages.",
              "Preserve completed Plex watch state across stale resume data and protect unwatch races."
            ]
          },
          {
            "title": "Manual Watch review",
            "details": [
              "Review confirmed TV episode numbering conflicts in Manual Watch, with a count and dismiss action that leaves watch state unchanged.",
              "Re-check suspected Plex unwatches against live metadata and keep cached episode state aligned, preventing stale reports from reaching manual watch review."
            ]
          },
          {
            "title": "Sync & connection recovery",
            "details": [
              "Add sidebar links to Discord and Reddit, with an option to hide project links.",
              "Setup guides explain the Plekt Emby and Jellyfin plugins and their webhook alternatives, and warn against enabling both.",
              "Media server cards in the setup wizard show their logos, and backup options are grouped into local and remote sections.",
              "Setup cards and status indicators follow Settings styling in both themes, with clearer tracker and import progress.",
              "Library pages show loading progress, retain the first page while refreshing and preserve distinct titles sharing artwork.",
              "Desktop navigation and library controls remain visible without empty action space.",
              "Opening Info from a scrolled media page keeps the header visible and closes the Options menu.",
              "Opened Watchlist, Ratings and Watch History posters retain their folded size on phones.",
              "Phone layouts improve cast profiles, TV library cards, Discover and Playlists rows, and the timeline live panel.",
              "Playing sessions show a Now playing label, while paused sessions retain their Paused label.",
              "Settings shows plain connection statuses and keeps Help cards compact until expanded.",
              "First-run tracker imports can run in parallel and start an add-only outward sync with progress and held-item counts.",
              "Tautulli and Netflix imports are grouped under One Time Imports in Settings.",
              "Opening Settings no longer automatically requests Seerr capabilities.",
              "Webhook rate limits allow larger media-server event bursts.",
              "Installation steps remain readable on phones in both themes.",
              "Trakt errors and restore conflicts show safe messages, and security-related dependencies have been updated.",
              "Preserve Trakt-only plays during show replacement and fail closed on occupied targets.",
              "Split sync, history import, polling, and scheduling work into focused modules with retry and lease safeguards.",
              "Improve appearance controls, changelog navigation, Reddit release bundling, and README screenshots.",
              "Keep TV season-source choice and watch-impact confirmation beside search controls, with less blank space across phone, tablet, and desktop.",
              "Use provider-neutral empty-season messaging when episode lists are unavailable while preserving TV and movie match results.",
              "Modern is the only look; the Classic style and its switch are removed.",
              "Card Art and Background Art checkboxes added to the Appearance menu (Background Art only on the Dashboard and details pages).",
              "Appearance menu rows match the media option rows with icons, and Text size sits at the bottom.",
              "Buttons use a neutral default state in both themes; hover changes only text and border.",
              "Spoiler toggle no longer tints the whole button when checked; only the checkbox shows the state.",
              "Settings use two brand surfaces in both themes, aligned with the left menu.",
              "Dashboard and settings surfaces aligned with the left menu.",
              "Navbar on every page uses the left-menu tone, not only media pages.",
              "About card uses the left-menu tone in both themes.",
              "Left-menu search is an underline field in light mode, as in dark.",
              "Light-mode changelog entries use the white panel tone.",
              "Softer outline on the selected settings section.",
              "Onboarding and sign-in footer theme toggle shows the Light and Dark words only.",
              "Login panel uses the left-menu tone and its fields use the main-background tone.",
              "Login heading reads \"Please log in\"; the long intro text is removed.",
              "\"Forgot your password?\" sits right-aligned under the password field.",
              "Sign-in fields no longer show the default focus outline.",
              "Show and movie posters now use provider artwork when a saved local image is unavailable.",
              "Card Art is no longer offered in the Appearance menu on media detail pages, which have no cards to show it on"
            ]
          }
        ]
      }
    },
    {
      "version": "2.1.1",
      "version5Digit": "2.1.1.0.0",
      "date": "2026-10-18T20:37:39.660Z",
      "commit": "98e0aee09bbf65640dde09a720718dadf9b7ddd4",
      "message": "This update improves watch state and season matching, restyles the appearance and login page, and hides Card Art on media detail pages.",
      "websiteUrl": "https://plekt.net",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Add TV season source selection, episode translation, unmatched episode handling, and translated Up Next warmup.",
        "Fix: An item removed from Up Next no longer comes back minutes later when Plekt finishes syncing its unwatch.",
        "Fix: A title that is playing live no longer also appears as its own part watched card in Now Playing or the Up Next rail.",
        "Tweak: Preserve completed Plex watch state across stale resume data and protect unwatch races.",
        "Tweak: Preserve Trakt-only plays during show replacement and fail closed on occupied targets.",
        "Tweak: Re-check suspected Plex unwatches against live metadata and keep cached episode state aligned, preventing stale reports from reaching manual watch review.",
        "Tweak: Keep TV season-source choice and watch-impact confirmation beside search controls, with less blank space across phone, tablet, and desktop.",
        "Tweak: Use provider-neutral empty-season messaging when episode lists are unavailable while preserving TV and movie match results.",
        "Tweak: Show and movie posters use provider artwork when a saved local image is unavailable.",
        "Tweak: Modern is the only look; the Classic style and its switch are removed.",
        "Tweak: Card Art and Background Art checkboxes are in the Appearance menu; Background Art shows only on the Dashboard and details pages, and Card Art is hidden on media detail pages, which have no cards to show it on.",
        "Tweak: Appearance menu rows match the media option rows with icons, and Text size sits at the bottom.",
        "Tweak: Improve appearance controls and changelog navigation.",
        "Tweak: Navbar, dashboard, settings, About card, and changelog panels use the left-menu tone in both themes; left-menu search is an underline field in light mode.",
        "Tweak: Buttons use a neutral default state in both themes (hover changes only text and border), the spoiler toggle tints only its checkbox, and the selected settings section has a softer outline.",
        "Tweak: Sign-in page uses a \"Please log in\" heading, a shorter intro, left-menu panel tone, a right-aligned \"Forgot your password?\" link, and no default focus outline on fields; the footer theme toggle shows the Light and Dark words only."
      ],
      "sections": {
        "newFeatures": [
          "Add TV season source selection, episode translation, unmatched episode handling, and translated Up Next warmup."
        ],
        "majorBugFixes": [
          "An item removed from Up Next no longer comes back minutes later when Plekt finishes syncing its unwatch.",
          "A title that is playing live no longer also appears as its own part watched card in Now Playing or the Up Next rail."
        ],
        "tweaks": [
          "Preserve completed Plex watch state across stale resume data and protect unwatch races.",
          "Preserve Trakt-only plays during show replacement and fail closed on occupied targets.",
          "Re-check suspected Plex unwatches against live metadata and keep cached episode state aligned, preventing stale reports from reaching manual watch review.",
          "Keep TV season-source choice and watch-impact confirmation beside search controls, with less blank space across phone, tablet, and desktop.",
          "Use provider-neutral empty-season messaging when episode lists are unavailable while preserving TV and movie match results.",
          "Show and movie posters use provider artwork when a saved local image is unavailable.",
          "Modern is the only look; the Classic style and its switch are removed.",
          "Card Art and Background Art checkboxes are in the Appearance menu; Background Art shows only on the Dashboard and details pages, and Card Art is hidden on media detail pages, which have no cards to show it on.",
          "Appearance menu rows match the media option rows with icons, and Text size sits at the bottom.",
          "Improve appearance controls and changelog navigation.",
          "Navbar, dashboard, settings, About card, and changelog panels use the left-menu tone in both themes; left-menu search is an underline field in light mode.",
          "Buttons use a neutral default state in both themes (hover changes only text and border), the spoiler toggle tints only its checkbox, and the selected settings section has a softer outline.",
          "Sign-in page uses a \"Please log in\" heading, a shorter intro, left-menu panel tone, a right-aligned \"Forgot your password?\" link, and no default focus outline on fields; the footer theme toggle shows the Light and Dark words only."
        ]
      },
      "sectionGroups": {
        "newFeatures": [
          {
            "title": "Sync & connection recovery",
            "details": [
              "Add TV season source selection, episode translation, unmatched episode handling, and translated Up Next warmup."
            ]
          }
        ],
        "majorBugFixes": [
          {
            "title": "Up Next & watch-state",
            "details": [
              "An item removed from Up Next no longer comes back minutes later when Plekt finishes syncing its unwatch.",
              "A title that is playing live no longer also appears as its own part watched card in Now Playing or the Up Next rail."
            ]
          }
        ],
        "tweaks": [
          {
            "title": "Up Next & watch-state",
            "details": [
              "Preserve completed Plex watch state across stale resume data and protect unwatch races."
            ]
          },
          {
            "title": "Manual Watch review",
            "details": [
              "Re-check suspected Plex unwatches against live metadata and keep cached episode state aligned, preventing stale reports from reaching manual watch review."
            ]
          },
          {
            "title": "Sync & connection recovery",
            "details": [
              "Preserve Trakt-only plays during show replacement and fail closed on occupied targets.",
              "Keep TV season-source choice and watch-impact confirmation beside search controls, with less blank space across phone, tablet, and desktop.",
              "Use provider-neutral empty-season messaging when episode lists are unavailable while preserving TV and movie match results.",
              "Show and movie posters use provider artwork when a saved local image is unavailable.",
              "Modern is the only look; the Classic style and its switch are removed.",
              "Card Art and Background Art checkboxes are in the Appearance menu; Background Art shows only on the Dashboard and details pages, and Card Art is hidden on media detail pages, which have no cards to show it on.",
              "Appearance menu rows match the media option rows with icons, and Text size sits at the bottom.",
              "Improve appearance controls and changelog navigation.",
              "Navbar, dashboard, settings, About card, and changelog panels use the left-menu tone in both themes; left-menu search is an underline field in light mode.",
              "Buttons use a neutral default state in both themes (hover changes only text and border), the spoiler toggle tints only its checkbox, and the selected settings section has a softer outline.",
              "Sign-in page uses a \"Please log in\" heading, a shorter intro, left-menu panel tone, a right-aligned \"Forgot your password?\" link, and no default focus outline on fields; the footer theme toggle shows the Light and Dark words only."
            ]
          }
        ]
      }
    },
    {
      "version": "2.1.0",
      "version5Digit": "2.1.0.0.0",
      "date": "2026-10-16T15:24:45.418Z",
      "commit": "5bd1293fce47f95e6d5dcb0c975b89857b0249d9",
      "message": "This update adds season posters and redesigned TV season pages, text size controls, safer rating sync, simpler Docker setup, and improvements to Up Next, dashboard history, and playback recovery.",
      "websiteUrl": "https://plekt.net",
      "author": "Lasikiewicz",
      "details": [
        "Fix: Recover interrupted restore locks automatically so live playback and watch history resume.",
        "Fix: Update vulnerable dependencies (Hono, protobuf, image parsing, YAML and others).",
        "Tweak: TV show pages open the latest regular season by default while keeping the page at the top.",
        "Tweak: Season 1 links open at the page top; other season links scroll the season into view after loading.",
        "Tweak: Dashboard history cards show details beside episode artwork and larger posters.",
        "Tweak: The playlist import dialog has more room for its app list.",
        "Tweak: Adjust text size from 100% to 130% in Appearance; your choice is saved across sessions.",
        "Tweak: Up Next shows the episode or movie that is playing at the top of the rail.",
        "Tweak: Up Next merges duplicate part-watched and next-up cards for the same episode.",
        "Tweak: Up Next keeps its order on refresh while a card waits to be removed.",
        "Tweak: Appearance sits between Settings and About; the version label appears above the theme switches.",
        "Tweak: TV shows group and pick posters more reliably when a show has several matching entries.",
        "Tweak: Sync activity refreshes and retries more reliably after a failed request.",
        "Tweak: Missing cached posters download again; unavailable artwork uses the fallback image.",
        "Tweak: Choose or upload separate season posters in Edit Images using TMDB, TVDB, or fanart.tv artwork.",
        "Tweak: Season poster choices are preserved in portable and encrypted backups.",
        "Tweak: Desktop season pages show larger posters beside their episodes, with five episodes per row.",
        "Tweak: Season cards use the series poster when no season poster is available, including one-season shows.",
        "Tweak: Manual watched-status edits remain available during a running or failed watch-history restore; automated sync waits.",
        "Tweak: Settings > Backups shows restore progress or errors and provides Clear Status.",
        "Tweak: Docker Compose now pulls the published Plekt image and requires an administrator password in .env before startup.",
        "Tweak: Separate local-build and secure Compose overlays are documented, with persistent data storage.",
        "Tweak: Personal Rating Sync holds suspicious bulk rating removals for your review instead of clearing them.",
        "Tweak: Force Sync reports partially applied runs, listing titles not found on each target.",
        "Tweak: Interrupted restore errors stay until dismissed; stale restore locks recover after three minutes.",
        "Tweak: The suggested Jellyfin webhook label is now plekt; existing labels are kept.",
        "Tweak: New installs keep the backups/plembfin folder name for compatibility.",
        "Tweak: Demo links point to https://demo.plekt.net/ and community links to r/plekt."
      ],
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [
          "Recover interrupted restore locks automatically so live playback and watch history resume.",
          "Update vulnerable dependencies (Hono, protobuf, image parsing, YAML and others)."
        ],
        "tweaks": [
          "TV show pages open the latest regular season by default while keeping the page at the top.",
          "Season 1 links open at the page top; other season links scroll the season into view after loading.",
          "Dashboard history cards show details beside episode artwork and larger posters.",
          "The playlist import dialog has more room for its app list.",
          "Adjust text size from 100% to 130% in Appearance; your choice is saved across sessions.",
          "Up Next shows the episode or movie that is playing at the top of the rail.",
          "Up Next merges duplicate part-watched and next-up cards for the same episode.",
          "Up Next keeps its order on refresh while a card waits to be removed.",
          "Appearance sits between Settings and About; the version label appears above the theme switches.",
          "TV shows group and pick posters more reliably when a show has several matching entries.",
          "Sync activity refreshes and retries more reliably after a failed request.",
          "Missing cached posters download again; unavailable artwork uses the fallback image.",
          "Choose or upload separate season posters in Edit Images using TMDB, TVDB, or fanart.tv artwork.",
          "Season poster choices are preserved in portable and encrypted backups.",
          "Desktop season pages show larger posters beside their episodes, with five episodes per row.",
          "Season cards use the series poster when no season poster is available, including one-season shows.",
          "Manual watched-status edits remain available during a running or failed watch-history restore; automated sync waits.",
          "Settings > Backups shows restore progress or errors and provides Clear Status.",
          "Docker Compose now pulls the published Plekt image and requires an administrator password in .env before startup.",
          "Separate local-build and secure Compose overlays are documented, with persistent data storage.",
          "Personal Rating Sync holds suspicious bulk rating removals for your review instead of clearing them.",
          "Force Sync reports partially applied runs, listing titles not found on each target.",
          "Interrupted restore errors stay until dismissed; stale restore locks recover after three minutes.",
          "The suggested Jellyfin webhook label is now plekt; existing labels are kept.",
          "New installs keep the backups/plembfin folder name for compatibility.",
          "Demo links point to https://demo.plekt.net/ and community links to r/plekt."
        ]
      },
      "sectionGroups": {
        "newFeatures": [],
        "majorBugFixes": [
          {
            "title": "Sync & provider recovery",
            "details": [
              "Recover interrupted restore locks automatically so live playback and watch history resume.",
              "Update vulnerable dependencies (Hono, protobuf, image parsing, YAML and others)."
            ]
          }
        ],
        "tweaks": [
          {
            "title": "Up Next & watch-state",
            "details": [
              "Up Next shows the episode or movie that is playing at the top of the rail.",
              "Up Next merges duplicate part-watched and next-up cards for the same episode.",
              "Up Next keeps its order on refresh while a card waits to be removed."
            ]
          },
          {
            "title": "Manual Watch review",
            "details": [
              "Manual watched-status edits remain available during a running or failed watch-history restore; automated sync waits."
            ]
          },
          {
            "title": "Sync & connection recovery",
            "details": [
              "TV show pages open the latest regular season by default while keeping the page at the top.",
              "Season 1 links open at the page top; other season links scroll the season into view after loading.",
              "Dashboard history cards show details beside episode artwork and larger posters.",
              "The playlist import dialog has more room for its app list.",
              "Adjust text size from 100% to 130% in Appearance; your choice is saved across sessions.",
              "Appearance sits between Settings and About; the version label appears above the theme switches.",
              "TV shows group and pick posters more reliably when a show has several matching entries.",
              "Sync activity refreshes and retries more reliably after a failed request.",
              "Missing cached posters download again; unavailable artwork uses the fallback image.",
              "Choose or upload separate season posters in Edit Images using TMDB, TVDB, or fanart.tv artwork.",
              "Season poster choices are preserved in portable and encrypted backups.",
              "Desktop season pages show larger posters beside their episodes, with five episodes per row.",
              "Season cards use the series poster when no season poster is available, including one-season shows.",
              "Settings > Backups shows restore progress or errors and provides Clear Status.",
              "Docker Compose now pulls the published Plekt image and requires an administrator password in .env before startup.",
              "Separate local-build and secure Compose overlays are documented, with persistent data storage.",
              "Personal Rating Sync holds suspicious bulk rating removals for your review instead of clearing them.",
              "Force Sync reports partially applied runs, listing titles not found on each target.",
              "Interrupted restore errors stay until dismissed; stale restore locks recover after three minutes.",
              "The suggested Jellyfin webhook label is now plekt; existing labels are kept.",
              "New installs keep the backups/plembfin folder name for compatibility.",
              "Demo links point to https://demo.plekt.net/ and community links to r/plekt."
            ]
          }
        ]
      }
    },
    {
      "version": "2.0.0",
      "version5Digit": "2.0.0.0.0",
      "date": "2026-10-11T21:31:10.551Z",
      "commit": "37edb9abccb543d77dc2b6eb28e7852f628db4d4",
      "message": "This update renames Plembfin to Plekt with a new logo and icons, moves the default port to 5056, and keeps existing settings, backups and data working. Upgrade guide: https://plekt.net/docs/upgrading-from-plembfin/",
      "websiteUrl": "https://plekt.net",
      "brandMigration": "plekt",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Rename the app to Plekt",
        "Feature: New Plekt wordmark in the sidebar, sign-in, setup and About pages, in dark and light, with the old logo's heavier lettering and diagonal cut",
        "Feature: New app icon for the browser tab, home screen and Windows, with a dark background that fills the icon on phones",
        "Feature: New icon for the app's own entries in watch rows and Force Sync",
        "Feature: The app, sign-in, setup, About pages and browser tab now say Plekt throughout",
        "Feature: Settings given as PLEMBFIN_ environment variables keep working, and the same settings can use PLEKT_ names",
        "Feature: Webhooks accept the secret in an X-Plekt-Webhook-Secret header as well as the older X-Plembfin-Webhook-Secret header",
        "Feature: New backups are named plekt-backup and plekt-watch-history; backups made earlier still restore, still appear in lists and still count toward retention",
        "Feature: Remote backup retention orders files by the date in their name, so older-named files are removed first",
        "Feature: New installs store data in plekt.db; an existing plembfin.db is kept and used",
        "Feature: Docker images publish under the plekt name, and the old plembfin image name keeps receiving releases with an in-app notice about the change",
        "Feature: The Windows installer moves an existing Plembfin service and data folder to the Plekt names",
        "Feature: The default published port moves from 5055 to 5056 (set with PLEKT_PUBLISHED_PORT). Move guide: https://plekt.net/docs/moving-to-port-5056/",
        "Feature: In-app help links point to plekt.net",
        "Feature: Audit history payloads are size-limited so the database grows more slowly, and unexpected process errors are handled more safely",
        "Feature: Choose a dashboard port during Windows installation or upgrade, with the setting applied to the service, tray, shortcuts, and optional firewall rule.",
        "Fix: Refresh dashboard data and avoid Seerr port conflict",
        "Fix: Refresh watch history and Up Next when the dashboard opens, showing loading or unavailable feedback until fresh server data arrives.",
        "Fix: Use port 5056 as Plembfin's default so it can run alongside Seerr on 5055; Docker still listens internally on 5055.",
        "Fix: Use SHA-256 poster-cache IDs and re-key existing cache rows without losing stored artwork.",
        "Fix: Check SQLite integrity before a full restore and explain recovery options when the database is corrupt.",
        "Fix: Refresh Resume and Up Next after focus or connectivity returns, and sort resume cards by the latest parsed progress update.",
        "Fix: Retry an episode mutation once after refreshing stale series indexes for Plex, Emby, and Jellyfin.",
        "Fix: Show the final provider reason when a destination is skipped in Sync Activity.",
        "Fix: Start media details at the top of their scroll area.",
        "Tweak: Set separate retention periods for local and remote full backups.",
        "Tweak: Default backup retention to seven days.",
        "Tweak: Plembfin is now Plekt. Docker users: change the image to ghcr.io/lasikiewicz/plekt or plembfin/plekt, keep the same tag, volumes and settings. Both old image names receive updates for at least six months after this release."
      ],
      "sections": {
        "newFeatures": [
          "Rename the app to Plekt",
          "New Plekt wordmark in the sidebar, sign-in, setup and About pages, in dark and light, with the old logo's heavier lettering and diagonal cut",
          "New app icon for the browser tab, home screen and Windows, with a dark background that fills the icon on phones",
          "New icon for the app's own entries in watch rows and Force Sync",
          "The app, sign-in, setup, About pages and browser tab now say Plekt throughout",
          "Settings given as PLEMBFIN_ environment variables keep working, and the same settings can use PLEKT_ names",
          "Webhooks accept the secret in an X-Plekt-Webhook-Secret header as well as the older X-Plembfin-Webhook-Secret header",
          "New backups are named plekt-backup and plekt-watch-history; backups made earlier still restore, still appear in lists and still count toward retention",
          "Remote backup retention orders files by the date in their name, so older-named files are removed first",
          "New installs store data in plekt.db; an existing plembfin.db is kept and used",
          "Docker images publish under the plekt name, and the old plembfin image name keeps receiving releases with an in-app notice about the change",
          "The Windows installer moves an existing Plembfin service and data folder to the Plekt names",
          "The default published port moves from 5055 to 5056 (set with PLEKT_PUBLISHED_PORT). Move guide: https://plekt.net/docs/moving-to-port-5056/",
          "In-app help links point to plekt.net",
          "Audit history payloads are size-limited so the database grows more slowly, and unexpected process errors are handled more safely",
          "Choose a dashboard port during Windows installation or upgrade, with the setting applied to the service, tray, shortcuts, and optional firewall rule."
        ],
        "majorBugFixes": [
          "Refresh dashboard data and avoid Seerr port conflict",
          "Refresh watch history and Up Next when the dashboard opens, showing loading or unavailable feedback until fresh server data arrives.",
          "Use port 5056 as Plembfin's default so it can run alongside Seerr on 5055; Docker still listens internally on 5055.",
          "Use SHA-256 poster-cache IDs and re-key existing cache rows without losing stored artwork.",
          "Check SQLite integrity before a full restore and explain recovery options when the database is corrupt.",
          "Refresh Resume and Up Next after focus or connectivity returns, and sort resume cards by the latest parsed progress update.",
          "Retry an episode mutation once after refreshing stale series indexes for Plex, Emby, and Jellyfin.",
          "Show the final provider reason when a destination is skipped in Sync Activity.",
          "Start media details at the top of their scroll area."
        ],
        "tweaks": [
          "Set separate retention periods for local and remote full backups.",
          "Default backup retention to seven days.",
          "Plembfin is now Plekt. Docker users: change the image to ghcr.io/lasikiewicz/plekt or plembfin/plekt, keep the same tag, volumes and settings. Both old image names receive updates for at least six months after this release."
        ]
      },
      "sectionGroups": {
        "newFeatures": [
          {
            "title": "Settings",
            "details": [
              "Settings given as PLEMBFIN_ environment variables keep working, and the same settings can use PLEKT_ names"
            ]
          },
          {
            "title": "Sync & connection recovery",
            "details": [
              "Rename the app to Plekt",
              "New Plekt wordmark in the sidebar, sign-in, setup and About pages, in dark and light, with the old logo's heavier lettering and diagonal cut",
              "New app icon for the browser tab, home screen and Windows, with a dark background that fills the icon on phones",
              "New icon for the app's own entries in watch rows and Force Sync",
              "The app, sign-in, setup, About pages and browser tab now say Plekt throughout",
              "Webhooks accept the secret in an X-Plekt-Webhook-Secret header as well as the older X-Plembfin-Webhook-Secret header",
              "New backups are named plekt-backup and plekt-watch-history; backups made earlier still restore, still appear in lists and still count toward retention",
              "Remote backup retention orders files by the date in their name, so older-named files are removed first",
              "New installs store data in plekt.db; an existing plembfin.db is kept and used",
              "Docker images publish under the plekt name, and the old plembfin image name keeps receiving releases with an in-app notice about the change",
              "The Windows installer moves an existing Plembfin service and data folder to the Plekt names",
              "The default published port moves from 5055 to 5056 (set with PLEKT_PUBLISHED_PORT). Move guide: https://plekt.net/docs/moving-to-port-5056/",
              "In-app help links point to plekt.net",
              "Audit history payloads are size-limited so the database grows more slowly, and unexpected process errors are handled more safely",
              "Choose a dashboard port during Windows installation or upgrade, with the setting applied to the service, tray, shortcuts, and optional firewall rule."
            ]
          }
        ],
        "majorBugFixes": [
          {
            "title": "Up Next & watch-state",
            "details": [
              "Refresh watch history and Up Next when the dashboard opens, showing loading or unavailable feedback until fresh server data arrives.",
              "Refresh Resume and Up Next after focus or connectivity returns, and sort resume cards by the latest parsed progress update."
            ]
          },
          {
            "title": "Sync & provider recovery",
            "details": [
              "Refresh dashboard data and avoid Seerr port conflict",
              "Use port 5056 as Plembfin's default so it can run alongside Seerr on 5055; Docker still listens internally on 5055.",
              "Use SHA-256 poster-cache IDs and re-key existing cache rows without losing stored artwork.",
              "Check SQLite integrity before a full restore and explain recovery options when the database is corrupt.",
              "Retry an episode mutation once after refreshing stale series indexes for Plex, Emby, and Jellyfin.",
              "Show the final provider reason when a destination is skipped in Sync Activity.",
              "Start media details at the top of their scroll area."
            ]
          }
        ],
        "tweaks": [
          {
            "title": "Sync & connection recovery",
            "details": [
              "Set separate retention periods for local and remote full backups.",
              "Default backup retention to seven days.",
              "Plembfin is now Plekt. Docker users: change the image to ghcr.io/lasikiewicz/plekt or plembfin/plekt, keep the same tag, volumes and settings. Both old image names receive updates for at least six months after this release."
            ]
          }
        ]
      }
    },
    {
      "version": "1.3.1",
      "version5Digit": "1.3.1.0.0",
      "date": "2026-09-30T19:20:40.200Z",
      "commit": "c16c7483df8784ec318a2ec5f08d77de3fe30334",
      "message": "This update speeds up page loading and server recovery, tidies dashboard cards with a per-library Posters only setting, and makes playback, Up Next and Trakt sync more accurate.",
      "websiteUrl": "https://plembfin.com",
      "author": "Lasikiewicz",
      "details": [
        "Fix: Episode cards use their season's cached poster when available; TV show cards keep the shared series poster.",
        "Fix: Patch undici, ip-address, and morgan vulnerabilities so npm audit reports zero vulnerabilities",
        "Tweak: The dashboard reuses its history preview and keeps the saved snapshot for 14 days, and History shows its first 48 cards right away and appends the rest during idle time.",
        "Tweak: Page caches warm in the background after startup and when changes settle, and cache rebuilds yield between short batches so pages, webhooks, and sync requests stay responsive.",
        "Tweak: Detail pages skip unreachable Plex, Emby, or Jellyfin servers for a minute, then retry so Watch Now links return when servers recover.",
        "Tweak: Recently watched TV runs fold into one poster with an episode count badge only in posters-only mode, full cards show every episode, opening a poster keeps it in place, and the Movies and TV Shows libraries remember their Posters only setting separately",
        "Tweak: Episode cards use the episode's own still as their backdrop, show Season/Ep under the episode name and Last Played above the app used, drop the Available and Watched N Times lines, and show progress above the Watch now apps",
        "Tweak: Retry temporary Trakt failures and check history before resending, avoiding duplicate plays and unnecessary media server updates",
        "Tweak: Treat watch events accurately across providers: ignore ratings and tiny progress, capture completed or later-day replays, and preserve the real Jellyfin item ID",
        "Tweak: Keep an older-season rewatch beside a newly arrived Up Next episode, let viewers hide one season or the whole show, and keep provider queues following the rewatch",
        "Tweak: Review title-only and conflicting watch-state aliases, with a Dismissed list and a restore action",
        "Tweak: Set how Up Next fills Now Playing and choose one to three items; episode cards use the right artwork, show link, layout, spacing, and text colors",
        "Tweak: Refresh open pages and restore their scroll and poster state when returning or choosing the current menu page; reconnect live updates after sleep and keep Now Playing polling responsive",
        "Tweak: Make TV library cards represent the show and make Stats busiest month follow the selected period",
        "Tweak: Now Playing and featured Up Next cards now share the outline and hover lift of Recently watched cards.",
        "Tweak: The Recommended TV Shows rail on a movie page now remembers for a week when no show matches the film, so reopening a movie no longer waits on a TVDB search",
        "Tweak: Now Playing has two options, \"Allow part watched items here\" and \"Allow Up Next items here\" (both on by default). Part watched items fill the panel first, then Up Next items, and anything shown there is hidden from the Up Next rail so nothing appears twice."
      ],
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [
          "Episode cards use their season's cached poster when available; TV show cards keep the shared series poster.",
          "Patch undici, ip-address, and morgan vulnerabilities so npm audit reports zero vulnerabilities"
        ],
        "tweaks": [
          "The dashboard reuses its history preview and keeps the saved snapshot for 14 days, and History shows its first 48 cards right away and appends the rest during idle time.",
          "Page caches warm in the background after startup and when changes settle, and cache rebuilds yield between short batches so pages, webhooks, and sync requests stay responsive.",
          "Detail pages skip unreachable Plex, Emby, or Jellyfin servers for a minute, then retry so Watch Now links return when servers recover.",
          "Recently watched TV runs fold into one poster with an episode count badge only in posters-only mode, full cards show every episode, opening a poster keeps it in place, and the Movies and TV Shows libraries remember their Posters only setting separately",
          "Episode cards use the episode's own still as their backdrop, show Season/Ep under the episode name and Last Played above the app used, drop the Available and Watched N Times lines, and show progress above the Watch now apps",
          "Retry temporary Trakt failures and check history before resending, avoiding duplicate plays and unnecessary media server updates",
          "Treat watch events accurately across providers: ignore ratings and tiny progress, capture completed or later-day replays, and preserve the real Jellyfin item ID",
          "Keep an older-season rewatch beside a newly arrived Up Next episode, let viewers hide one season or the whole show, and keep provider queues following the rewatch",
          "Review title-only and conflicting watch-state aliases, with a Dismissed list and a restore action",
          "Set how Up Next fills Now Playing and choose one to three items; episode cards use the right artwork, show link, layout, spacing, and text colors",
          "Refresh open pages and restore their scroll and poster state when returning or choosing the current menu page; reconnect live updates after sleep and keep Now Playing polling responsive",
          "Make TV library cards represent the show and make Stats busiest month follow the selected period",
          "Now Playing and featured Up Next cards now share the outline and hover lift of Recently watched cards.",
          "The Recommended TV Shows rail on a movie page now remembers for a week when no show matches the film, so reopening a movie no longer waits on a TVDB search",
          "Now Playing has two options, \"Allow part watched items here\" and \"Allow Up Next items here\" (both on by default). Part watched items fill the panel first, then Up Next items, and anything shown there is hidden from the Up Next rail so nothing appears twice."
        ]
      },
      "sectionGroups": {
        "newFeatures": [],
        "majorBugFixes": [
          {
            "title": "Sync & provider recovery",
            "details": [
              "Episode cards use their season's cached poster when available; TV show cards keep the shared series poster.",
              "Patch undici, ip-address, and morgan vulnerabilities so npm audit reports zero vulnerabilities"
            ]
          }
        ],
        "tweaks": [
          {
            "title": "Up Next & watch-state",
            "details": [
              "Keep an older-season rewatch beside a newly arrived Up Next episode, let viewers hide one season or the whole show, and keep provider queues following the rewatch",
              "Review title-only and conflicting watch-state aliases, with a Dismissed list and a restore action",
              "Set how Up Next fills Now Playing and choose one to three items; episode cards use the right artwork, show link, layout, spacing, and text colors",
              "Now Playing and featured Up Next cards now share the outline and hover lift of Recently watched cards.",
              "Now Playing has two options, \"Allow part watched items here\" and \"Allow Up Next items here\" (both on by default). Part watched items fill the panel first, then Up Next items, and anything shown there is hidden from the Up Next rail so nothing appears twice."
            ]
          },
          {
            "title": "Sync & connection recovery",
            "details": [
              "The dashboard reuses its history preview and keeps the saved snapshot for 14 days, and History shows its first 48 cards right away and appends the rest during idle time.",
              "Page caches warm in the background after startup and when changes settle, and cache rebuilds yield between short batches so pages, webhooks, and sync requests stay responsive.",
              "Detail pages skip unreachable Plex, Emby, or Jellyfin servers for a minute, then retry so Watch Now links return when servers recover.",
              "Recently watched TV runs fold into one poster with an episode count badge only in posters-only mode, full cards show every episode, opening a poster keeps it in place, and the Movies and TV Shows libraries remember their Posters only setting separately",
              "Episode cards use the episode's own still as their backdrop, show Season/Ep under the episode name and Last Played above the app used, drop the Available and Watched N Times lines, and show progress above the Watch now apps",
              "Retry temporary Trakt failures and check history before resending, avoiding duplicate plays and unnecessary media server updates",
              "Treat watch events accurately across providers: ignore ratings and tiny progress, capture completed or later-day replays, and preserve the real Jellyfin item ID",
              "Refresh open pages and restore their scroll and poster state when returning or choosing the current menu page; reconnect live updates after sleep and keep Now Playing polling responsive",
              "Make TV library cards represent the show and make Stats busiest month follow the selected period",
              "The Recommended TV Shows rail on a movie page now remembers for a week when no show matches the film, so reopening a movie no longer waits on a TVDB search"
            ]
          }
        ]
      }
    },
    {
      "version": "1.3.0",
      "version5Digit": "1.3.0.0.0",
      "date": "2026-09-28T08:17:03.263Z",
      "commit": "771d23d79cf9068de8844b93ad18ac9062971427",
      "message": "This update adds the Modern style, two-way playlist sync with Plex, Emby, and Jellyfin, automatic playlists, and stacked watched runs, fixes large backups and restores, and makes loading faster throughout.",
      "websiteUrl": "https://plembfin.com",
      "author": "Lasikiewicz",
      "details": [
        "Feature: A Classic/Modern switch in the sidebar, above the Light/Dark toggle, adds a Modern style for dark and light mode: rounded gradient cards with an accent hover, provider-coloured app names, and the title's backdrop artwork behind dashboard cards and the dashboard background",
        "Feature: The Modern look extends to History, Discover, Watchlist, Ratings, Playlists, Movies and TV, movie and show pages, and Settings, with backdrops that load as cards scroll into view and are retried when a lookup fails",
        "Feature: In the Modern style, the featured Up Next card spans the top panel while nothing is playing, playing sessions share the backdrop layout side by side, and phones get a compact Up Next card with the poster beside the details",
        "Feature: Episodes of a show watched in a row fold into one stacked run card showing the episode range and count on the dashboard and in History, and a button beside each Recently watched row folds its cards into posters, remembered per row",
        "Feature: With Posters only on, clicking a poster opens its card in place on Library, Discover, History, Watchlist, Ratings, and Playlists",
        "Feature: Custom Lists are now Playlists, listed above Ratings and synced two ways with Plex, Emby, and Jellyfin, with the apps chosen per playlist, drag and drop reordering, a Recently deleted pop-up, and moves made in an app read back",
        "Feature: Playlists can be Movies, TV, or Mixed; TV playlists hold single episodes chosen with an episode picker, and playlists made in Plex, Emby, or Jellyfin can be imported, merged into a same-name playlist or kept separate",
        "Feature: Automatic playlists fill themselves from a rule (Top rated, Popular, Trending this week, or New releases, plus genres, language, years, watched state, and recently added) from your libraries or the TMDB catalogue, refresh hourly, and are sent one way to the apps",
        "Feature: Automatic TV playlists hold the next episode to watch of each show, and the new Remove items once watched setting drops watched movies and episodes from a playlist",
        "Feature: Full Plembfin backups of any size restore on the server from the backup list or an uploaded file, with progress, a full check of the file before anything changes, and downloads of large backups",
        "Fix: Connecting Trakt, Plex, or Jellyfin (including Jellyfin Quick Connect) no longer gets stuck on Waiting for confirmation with Same-origin request required when Plembfin is opened by a plain HTTP LAN address (#39)",
        "Fix: Watched state sent from Plex now reaches episodes on Jellyfin and Jellyfin-compatible servers whose normal episode search returns only the season, which failed with No matching item in Jellyfin library (#38)",
        "Fix: Up Next shows each show once and hides the episode playing right now until playback stops, and the Now Playing card no longer stays on screen after playback ends",
        "Fix: Nightly backups are written to disk in small pieces instead of in memory, where a 490 MB backup needed about 3 GB and got the server killed; a failed day is retried at most three times an hour apart, and Backblaze uploads are sent from disk without a 60 second cutoff",
        "Fix: Backups made by the server can be restored from the Restore page, which always said the passphrase was wrong",
        "Fix: Plex no longer ignores some playlist moves",
        "Fix: A scheduled step that outlasts its time slot, such as a large nightly backup, is logged as still running and then finished instead of as a false timed-out failure, and the Manual Watch review notice stays in the sidebar when a new item is flagged",
        "Tweak: Faster loading: a show's seasons open in milliseconds instead of about 7 seconds on a large library, Up Next rebuilds are about twice as fast, the dashboard history preview is less than half its old size, sign-in checks no longer block the server, and the TV Shows page keeps its cards on screen while loading more",
        "Tweak: Fewer wasted requests: Movies and TV posters that fail to load are looked up together in one request, the dashboard asks for Up Next once, and Settings makes no status requests before you sign in",
        "Tweak: Tablet and phone layouts are tidier: dashboard cards keep a fixed-width poster, the featured Up Next cards sit side by side, card text and Watch Now links fit the card, playlist posters open without being cut off, and long Movies titles stay inside their card",
        "Tweak: Movies and TV cards show the title's summary, Watchlist, Ratings, Playlists, and Discover show the release date without a dash, History drops the sync status and size slider, and the poster, card, and compact view icons are redesigned"
      ],
      "sections": {
        "newFeatures": [
          "A Classic/Modern switch in the sidebar, above the Light/Dark toggle, adds a Modern style for dark and light mode: rounded gradient cards with an accent hover, provider-coloured app names, and the title's backdrop artwork behind dashboard cards and the dashboard background",
          "The Modern look extends to History, Discover, Watchlist, Ratings, Playlists, Movies and TV, movie and show pages, and Settings, with backdrops that load as cards scroll into view and are retried when a lookup fails",
          "In the Modern style, the featured Up Next card spans the top panel while nothing is playing, playing sessions share the backdrop layout side by side, and phones get a compact Up Next card with the poster beside the details",
          "Episodes of a show watched in a row fold into one stacked run card showing the episode range and count on the dashboard and in History, and a button beside each Recently watched row folds its cards into posters, remembered per row",
          "With Posters only on, clicking a poster opens its card in place on Library, Discover, History, Watchlist, Ratings, and Playlists",
          "Custom Lists are now Playlists, listed above Ratings and synced two ways with Plex, Emby, and Jellyfin, with the apps chosen per playlist, drag and drop reordering, a Recently deleted pop-up, and moves made in an app read back",
          "Playlists can be Movies, TV, or Mixed; TV playlists hold single episodes chosen with an episode picker, and playlists made in Plex, Emby, or Jellyfin can be imported, merged into a same-name playlist or kept separate",
          "Automatic playlists fill themselves from a rule (Top rated, Popular, Trending this week, or New releases, plus genres, language, years, watched state, and recently added) from your libraries or the TMDB catalogue, refresh hourly, and are sent one way to the apps",
          "Automatic TV playlists hold the next episode to watch of each show, and the new Remove items once watched setting drops watched movies and episodes from a playlist",
          "Full Plembfin backups of any size restore on the server from the backup list or an uploaded file, with progress, a full check of the file before anything changes, and downloads of large backups"
        ],
        "majorBugFixes": [
          "Connecting Trakt, Plex, or Jellyfin (including Jellyfin Quick Connect) no longer gets stuck on Waiting for confirmation with Same-origin request required when Plembfin is opened by a plain HTTP LAN address (#39)",
          "Watched state sent from Plex now reaches episodes on Jellyfin and Jellyfin-compatible servers whose normal episode search returns only the season, which failed with No matching item in Jellyfin library (#38)",
          "Up Next shows each show once and hides the episode playing right now until playback stops, and the Now Playing card no longer stays on screen after playback ends",
          "Nightly backups are written to disk in small pieces instead of in memory, where a 490 MB backup needed about 3 GB and got the server killed; a failed day is retried at most three times an hour apart, and Backblaze uploads are sent from disk without a 60 second cutoff",
          "Backups made by the server can be restored from the Restore page, which always said the passphrase was wrong",
          "Plex no longer ignores some playlist moves",
          "A scheduled step that outlasts its time slot, such as a large nightly backup, is logged as still running and then finished instead of as a false timed-out failure, and the Manual Watch review notice stays in the sidebar when a new item is flagged"
        ],
        "tweaks": [
          "Faster loading: a show's seasons open in milliseconds instead of about 7 seconds on a large library, Up Next rebuilds are about twice as fast, the dashboard history preview is less than half its old size, sign-in checks no longer block the server, and the TV Shows page keeps its cards on screen while loading more",
          "Fewer wasted requests: Movies and TV posters that fail to load are looked up together in one request, the dashboard asks for Up Next once, and Settings makes no status requests before you sign in",
          "Tablet and phone layouts are tidier: dashboard cards keep a fixed-width poster, the featured Up Next cards sit side by side, card text and Watch Now links fit the card, playlist posters open without being cut off, and long Movies titles stay inside their card",
          "Movies and TV cards show the title's summary, Watchlist, Ratings, Playlists, and Discover show the release date without a dash, History drops the sync status and size slider, and the poster, card, and compact view icons are redesigned"
        ]
      },
      "sectionGroups": {
        "newFeatures": [
          {
            "title": "Appearance",
            "details": [
              "A Classic/Modern switch in the sidebar, above the Light/Dark toggle, adds a Modern style for dark and light mode: rounded gradient cards with an accent hover, provider-coloured app names, and the title's backdrop artwork behind dashboard cards and the dashboard background",
              "The Modern look extends to History, Discover, Watchlist, Ratings, Playlists, Movies and TV, movie and show pages, and Settings, with backdrops that load as cards scroll into view and are retried when a lookup fails",
              "In the Modern style, the featured Up Next card spans the top panel while nothing is playing, playing sessions share the backdrop layout side by side, and phones get a compact Up Next card with the poster beside the details",
              "Episodes of a show watched in a row fold into one stacked run card showing the episode range and count on the dashboard and in History, and a button beside each Recently watched row folds its cards into posters, remembered per row",
              "With Posters only on, clicking a poster opens its card in place on Library, Discover, History, Watchlist, Ratings, and Playlists"
            ]
          },
          {
            "title": "Playlists",
            "details": [
              "Custom Lists are now Playlists, listed above Ratings and synced two ways with Plex, Emby, and Jellyfin, with the apps chosen per playlist, drag and drop reordering, a Recently deleted pop-up, and moves made in an app read back",
              "Playlists can be Movies, TV, or Mixed; TV playlists hold single episodes chosen with an episode picker, and playlists made in Plex, Emby, or Jellyfin can be imported, merged into a same-name playlist or kept separate",
              "Automatic playlists fill themselves from a rule (Top rated, Popular, Trending this week, or New releases, plus genres, language, years, watched state, and recently added) from your libraries or the TMDB catalogue, refresh hourly, and are sent one way to the apps",
              "Automatic TV playlists hold the next episode to watch of each show, and the new Remove items once watched setting drops watched movies and episodes from a playlist"
            ]
          },
          {
            "title": "Backups",
            "details": [
              "Full Plembfin backups of any size restore on the server from the backup list or an uploaded file, with progress, a full check of the file before anything changes, and downloads of large backups"
            ]
          }
        ],
        "majorBugFixes": [
          {
            "title": "Reported issues",
            "details": [
              "Connecting Trakt, Plex, or Jellyfin (including Jellyfin Quick Connect) no longer gets stuck on Waiting for confirmation with Same-origin request required when Plembfin is opened by a plain HTTP LAN address (#39)",
              "Watched state sent from Plex now reaches episodes on Jellyfin and Jellyfin-compatible servers whose normal episode search returns only the season, which failed with No matching item in Jellyfin library (#38)"
            ]
          },
          {
            "title": "Up Next & playback",
            "details": [
              "Up Next shows each show once and hides the episode playing right now until playback stops, and the Now Playing card no longer stays on screen after playback ends"
            ]
          },
          {
            "title": "Backups",
            "details": [
              "Nightly backups are written to disk in small pieces instead of in memory, where a 490 MB backup needed about 3 GB and got the server killed; a failed day is retried at most three times an hour apart, and Backblaze uploads are sent from disk without a 60 second cutoff",
              "Backups made by the server can be restored from the Restore page, which always said the passphrase was wrong"
            ]
          },
          {
            "title": "Sync & scheduling",
            "details": [
              "Plex no longer ignores some playlist moves",
              "A scheduled step that outlasts its time slot, such as a large nightly backup, is logged as still running and then finished instead of as a false timed-out failure, and the Manual Watch review notice stays in the sidebar when a new item is flagged"
            ]
          }
        ],
        "tweaks": [
          {
            "title": "Speed",
            "details": [
              "Faster loading: a show's seasons open in milliseconds instead of about 7 seconds on a large library, Up Next rebuilds are about twice as fast, the dashboard history preview is less than half its old size, sign-in checks no longer block the server, and the TV Shows page keeps its cards on screen while loading more",
              "Fewer wasted requests: Movies and TV posters that fail to load are looked up together in one request, the dashboard asks for Up Next once, and Settings makes no status requests before you sign in"
            ]
          },
          {
            "title": "Layout",
            "details": [
              "Tablet and phone layouts are tidier: dashboard cards keep a fixed-width poster, the featured Up Next cards sit side by side, card text and Watch Now links fit the card, playlist posters open without being cut off, and long Movies titles stay inside their card",
              "Movies and TV cards show the title's summary, Watchlist, Ratings, Playlists, and Discover show the release date without a dash, History drops the sync status and size slider, and the poster, card, and compact view icons are redesigned"
            ]
          }
        ]
      }
    },
    {
      "version": "1.2.2",
      "version5Digit": "1.2.2.0.0",
      "date": "2026-09-24T11:11:43.999Z",
      "commit": "7b7a931d414af7634703386462c9d1d99a8c98fe",
      "message": "This update keeps shows that share a title apart, makes Up Next sync with Plex, Emby and Jellyfin more reliable, syncs rating changes made on any service, and adds a Watch-State Aliases repair card.",
      "websiteUrl": "https://plembfin.com",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Rating changes made directly on Plex, Emby, Jellyfin or Trakt now sync out to every other service unless a local edit is genuinely newer; an unchanged rating is no longer re-imported on every scan, a stale pending local write no longer wins a conflict, and clearing a rating on Jellyfin takes effect",
        "Feature: Settings > Tools > Database Repairs has a Watch-State Aliases card listing episode watch states the automatic repair could not tie to their show, with the reason for each; Belongs to this show moves them into the show, keeping the newest watch state, and Different show stops them being listed or moved again. Only Plembfin's own watch state changes",
        "Feature: The media detail header has a new layout: a facts table for status, genres, network, language and runtime, TV status reading Released - date - status, external ratings as logo badges with scores, and ratings beside the progress bar; its rating pill and watchlist and list buttons reflect your data on a fresh direct page load",
        "Fix: Shows that share a title but have different TMDB or TVDB ids, such as Scrubs and its 2026 reboot, are kept apart everywhere: they no longer merge into one Up Next card, appear twice, overwrite each other's identity, progress or poster, merge in Recently Watched, or skip a first watch because the other show has one at that season and episode",
        "Fix: Watching, unwatching, clearing progress on, removing or restoring one same-title show no longer changes, hides, fades or brings back the other show's episodes, cards, history entries or pending reviews, including during Jellyfin scheduled sync and from a show's page",
        "Fix: When two Plex shows share a title, Up Next, Watch now and watch sync use the show whose ids match, and a Plex title with a country tag such as The Assembly (UK) gets its Watch now link; on Emby or Jellyfin an ambiguous title is skipped instead of written to both, a title with a year such as Scrubs (2026) finds only that show, and a card for a show no library holds is no longer linked to a same-name show",
        "Fix: Up Next syncing no longer removes items from Plex or Emby Continue Watching just because Plembfin's queue does not list them; items leave only when you clear progress or remove them in Plembfin, the sync message reports how many app-only items were left in place, and a refresh with nothing new no longer triggers a needless sync",
        "Fix: Clearing progress no longer comes back as a resume card when a server still reports the old position and now reaches Trakt; a part-watched movie stays at the front of Up Next, and stopping part-way, clearing progress, or marking watched or unwatched on the dashboard updates the Up Next rail straight away",
        "Fix: Up Next offers the right episode: marking an episode watched brings in the correct next one, a Continue Watching episode with no position shows as next rather than 0%, episodes removed from every library are no longer offered, refreshing Emby or Jellyfin's native rail no longer unmarks or re-dates the previous episode, and a later watch no longer makes an earlier unwatched episode read as watched",
        "Fix: Emby part-watches reach Up Next even when the episode was once marked unwatched, and Up Next syncing no longer adds a play to Emby's count; starting an episode in Jellyfin no longer counts as an unwatch, and part-watching one version of a multi-version Jellyfin episode is picked up by the resume check",
        "Fix: Up Next cards keep their Plex, Emby and Jellyfin Watch now links in more cases, including cards only Emby or Jellyfin lists, shows resumed after being fully unwatched, and part-watches Jellyfin leaves out of Next Up; resume progress keeps the reported IMDb and TMDB ids and no longer adds an empty Part Watched card",
        "Fix: An offline media server is stood down briefly, skipped by the Up Next push and queued for a push as soon as it answers; restarting Plembfin keeps the cards only that server can confirm, the dashboard shows its connection-unavailable line within about a minute, and the Up Next response is no longer cached by the browser",
        "Fix: Marking an episode unwatched while Up Next is syncing no longer puts it back to watched on Jellyfin, Emby or Plex, and new episodes or movies added to Plex no longer create unwatched history entries or send unwatches to Emby, Jellyfin and Trakt",
        "Fix: Watches reported only through a watched-library scan are stored under the show with show and episode ids, and duplicate episode watch states are matched to their show through TVDB, TMDB and the show's own IMDb or TVDB id, so more are cleaned up automatically",
        "Fix: Manual Watch review: the sidebar count matches the page, the page no longer reloads repeatedly, each review names the show its ids prove, season and show actions are one watched and one unwatched button with the media page's date popup and confirmation, reviews without ids stay pending when two shows share a title, and items already watched are no longer queued or left lingering",
        "Fix: A Tautulli import skips a play older than the item's newest unwatch, and no longer skips a real episode play as a duplicate of a different episode of the same show",
        "Fix: Plex watchlist sync resolves a common or duplicate title by year and then by the item's real provider ids, so it no longer gets stuck as not available, including two separate Arrival (2016) entries",
        "Tweak: Interface fixes: the Upcoming control bar matches the media action pills, the poster size slider leads the Movies and TV Shows control bars, the Dismissed Up Next pop-up shows up to six cards per row, the Mark watched date dialog buttons work from a dashboard card menu, browser tabs show the Plembfin logo again, a restore log shows its final lines, and Sync Activity lists cross-platform match issues with Fix match and Remove again"
      ],
      "sections": {
        "newFeatures": [
          "Rating changes made directly on Plex, Emby, Jellyfin or Trakt now sync out to every other service unless a local edit is genuinely newer; an unchanged rating is no longer re-imported on every scan, a stale pending local write no longer wins a conflict, and clearing a rating on Jellyfin takes effect",
          "Settings > Tools > Database Repairs has a Watch-State Aliases card listing episode watch states the automatic repair could not tie to their show, with the reason for each; Belongs to this show moves them into the show, keeping the newest watch state, and Different show stops them being listed or moved again. Only Plembfin's own watch state changes",
          "The media detail header has a new layout: a facts table for status, genres, network, language and runtime, TV status reading Released - date - status, external ratings as logo badges with scores, and ratings beside the progress bar; its rating pill and watchlist and list buttons reflect your data on a fresh direct page load"
        ],
        "majorBugFixes": [
          "Shows that share a title but have different TMDB or TVDB ids, such as Scrubs and its 2026 reboot, are kept apart everywhere: they no longer merge into one Up Next card, appear twice, overwrite each other's identity, progress or poster, merge in Recently Watched, or skip a first watch because the other show has one at that season and episode",
          "Watching, unwatching, clearing progress on, removing or restoring one same-title show no longer changes, hides, fades or brings back the other show's episodes, cards, history entries or pending reviews, including during Jellyfin scheduled sync and from a show's page",
          "When two Plex shows share a title, Up Next, Watch now and watch sync use the show whose ids match, and a Plex title with a country tag such as The Assembly (UK) gets its Watch now link; on Emby or Jellyfin an ambiguous title is skipped instead of written to both, a title with a year such as Scrubs (2026) finds only that show, and a card for a show no library holds is no longer linked to a same-name show",
          "Up Next syncing no longer removes items from Plex or Emby Continue Watching just because Plembfin's queue does not list them; items leave only when you clear progress or remove them in Plembfin, the sync message reports how many app-only items were left in place, and a refresh with nothing new no longer triggers a needless sync",
          "Clearing progress no longer comes back as a resume card when a server still reports the old position and now reaches Trakt; a part-watched movie stays at the front of Up Next, and stopping part-way, clearing progress, or marking watched or unwatched on the dashboard updates the Up Next rail straight away",
          "Up Next offers the right episode: marking an episode watched brings in the correct next one, a Continue Watching episode with no position shows as next rather than 0%, episodes removed from every library are no longer offered, refreshing Emby or Jellyfin's native rail no longer unmarks or re-dates the previous episode, and a later watch no longer makes an earlier unwatched episode read as watched",
          "Emby part-watches reach Up Next even when the episode was once marked unwatched, and Up Next syncing no longer adds a play to Emby's count; starting an episode in Jellyfin no longer counts as an unwatch, and part-watching one version of a multi-version Jellyfin episode is picked up by the resume check",
          "Up Next cards keep their Plex, Emby and Jellyfin Watch now links in more cases, including cards only Emby or Jellyfin lists, shows resumed after being fully unwatched, and part-watches Jellyfin leaves out of Next Up; resume progress keeps the reported IMDb and TMDB ids and no longer adds an empty Part Watched card",
          "An offline media server is stood down briefly, skipped by the Up Next push and queued for a push as soon as it answers; restarting Plembfin keeps the cards only that server can confirm, the dashboard shows its connection-unavailable line within about a minute, and the Up Next response is no longer cached by the browser",
          "Marking an episode unwatched while Up Next is syncing no longer puts it back to watched on Jellyfin, Emby or Plex, and new episodes or movies added to Plex no longer create unwatched history entries or send unwatches to Emby, Jellyfin and Trakt",
          "Watches reported only through a watched-library scan are stored under the show with show and episode ids, and duplicate episode watch states are matched to their show through TVDB, TMDB and the show's own IMDb or TVDB id, so more are cleaned up automatically",
          "Manual Watch review: the sidebar count matches the page, the page no longer reloads repeatedly, each review names the show its ids prove, season and show actions are one watched and one unwatched button with the media page's date popup and confirmation, reviews without ids stay pending when two shows share a title, and items already watched are no longer queued or left lingering",
          "A Tautulli import skips a play older than the item's newest unwatch, and no longer skips a real episode play as a duplicate of a different episode of the same show",
          "Plex watchlist sync resolves a common or duplicate title by year and then by the item's real provider ids, so it no longer gets stuck as not available, including two separate Arrival (2016) entries"
        ],
        "tweaks": [
          "Interface fixes: the Upcoming control bar matches the media action pills, the poster size slider leads the Movies and TV Shows control bars, the Dismissed Up Next pop-up shows up to six cards per row, the Mark watched date dialog buttons work from a dashboard card menu, browser tabs show the Plembfin logo again, a restore log shows its final lines, and Sync Activity lists cross-platform match issues with Fix match and Remove again"
        ]
      },
      "sectionGroups": {
        "newFeatures": [
          {
            "title": "Settings",
            "details": [
              "Settings > Tools > Database Repairs has a Watch-State Aliases card listing episode watch states the automatic repair could not tie to their show, with the reason for each; Belongs to this show moves them into the show, keeping the newest watch state, and Different show stops them being listed or moved again. Only Plembfin's own watch state changes"
            ]
          },
          {
            "title": "Sync & connection recovery",
            "details": [
              "Rating changes made directly on Plex, Emby, Jellyfin or Trakt now sync out to every other service unless a local edit is genuinely newer; an unchanged rating is no longer re-imported on every scan, a stale pending local write no longer wins a conflict, and clearing a rating on Jellyfin takes effect",
              "The media detail header has a new layout: a facts table for status, genres, network, language and runtime, TV status reading Released - date - status, external ratings as logo badges with scores, and ratings beside the progress bar; its rating pill and watchlist and list buttons reflect your data on a fresh direct page load"
            ]
          }
        ],
        "majorBugFixes": [
          {
            "title": "Up Next & watch-state",
            "details": [
              "Shows that share a title but have different TMDB or TVDB ids, such as Scrubs and its 2026 reboot, are kept apart everywhere: they no longer merge into one Up Next card, appear twice, overwrite each other's identity, progress or poster, merge in Recently Watched, or skip a first watch because the other show has one at that season and episode",
              "When two Plex shows share a title, Up Next, Watch now and watch sync use the show whose ids match, and a Plex title with a country tag such as The Assembly (UK) gets its Watch now link; on Emby or Jellyfin an ambiguous title is skipped instead of written to both, a title with a year such as Scrubs (2026) finds only that show, and a card for a show no library holds is no longer linked to a same-name show",
              "Up Next syncing no longer removes items from Plex or Emby Continue Watching just because Plembfin's queue does not list them; items leave only when you clear progress or remove them in Plembfin, the sync message reports how many app-only items were left in place, and a refresh with nothing new no longer triggers a needless sync",
              "Clearing progress no longer comes back as a resume card when a server still reports the old position and now reaches Trakt; a part-watched movie stays at the front of Up Next, and stopping part-way, clearing progress, or marking watched or unwatched on the dashboard updates the Up Next rail straight away",
              "Up Next offers the right episode: marking an episode watched brings in the correct next one, a Continue Watching episode with no position shows as next rather than 0%, episodes removed from every library are no longer offered, refreshing Emby or Jellyfin's native rail no longer unmarks or re-dates the previous episode, and a later watch no longer makes an earlier unwatched episode read as watched",
              "Emby part-watches reach Up Next even when the episode was once marked unwatched, and Up Next syncing no longer adds a play to Emby's count; starting an episode in Jellyfin no longer counts as an unwatch, and part-watching one version of a multi-version Jellyfin episode is picked up by the resume check",
              "Up Next cards keep their Plex, Emby and Jellyfin Watch now links in more cases, including cards only Emby or Jellyfin lists, shows resumed after being fully unwatched, and part-watches Jellyfin leaves out of Next Up; resume progress keeps the reported IMDb and TMDB ids and no longer adds an empty Part Watched card",
              "An offline media server is stood down briefly, skipped by the Up Next push and queued for a push as soon as it answers; restarting Plembfin keeps the cards only that server can confirm, the dashboard shows its connection-unavailable line within about a minute, and the Up Next response is no longer cached by the browser",
              "Marking an episode unwatched while Up Next is syncing no longer puts it back to watched on Jellyfin, Emby or Plex, and new episodes or movies added to Plex no longer create unwatched history entries or send unwatches to Emby, Jellyfin and Trakt",
              "Watches reported only through a watched-library scan are stored under the show with show and episode ids, and duplicate episode watch states are matched to their show through TVDB, TMDB and the show's own IMDb or TVDB id, so more are cleaned up automatically"
            ]
          },
          {
            "title": "Tautulli imports",
            "details": [
              "A Tautulli import skips a play older than the item's newest unwatch, and no longer skips a real episode play as a duplicate of a different episode of the same show"
            ]
          },
          {
            "title": "Sync & provider recovery",
            "details": [
              "Watching, unwatching, clearing progress on, removing or restoring one same-title show no longer changes, hides, fades or brings back the other show's episodes, cards, history entries or pending reviews, including during Jellyfin scheduled sync and from a show's page",
              "Manual Watch review: the sidebar count matches the page, the page no longer reloads repeatedly, each review names the show its ids prove, season and show actions are one watched and one unwatched button with the media page's date popup and confirmation, reviews without ids stay pending when two shows share a title, and items already watched are no longer queued or left lingering",
              "Plex watchlist sync resolves a common or duplicate title by year and then by the item's real provider ids, so it no longer gets stuck as not available, including two separate Arrival (2016) entries"
            ]
          }
        ],
        "tweaks": [
          {
            "title": "Up Next & watch-state",
            "details": [
              "Interface fixes: the Upcoming control bar matches the media action pills, the poster size slider leads the Movies and TV Shows control bars, the Dismissed Up Next pop-up shows up to six cards per row, the Mark watched date dialog buttons work from a dashboard card menu, browser tabs show the Plembfin logo again, a restore log shows its final lines, and Sync Activity lists cross-platform match issues with Fix match and Remove again"
            ]
          }
        ]
      }
    },
    {
      "version": "1.2.1",
      "version5Digit": "1.2.1.0.0",
      "date": "2026-09-21T14:20:15.965Z",
      "commit": "0c134f768beaaf5fc04f7d6c1b2866c87509f7f6",
      "message": "This hotfix improves Plembfin's watch-state review, mobile media navigation, and playback refresh reliability.",
      "websiteUrl": "https://plembfin.com",
      "author": "Lasikiewicz",
      "details": [
        "Fix: Improve media review and mobile controls",
        "Fix: Keep watched items and dismissed title-only movie matches out of Manual Watch review.",
        "Fix: Improve mobile media and Upcoming layouts with inline season actions, shared controls, and clearer TV show summaries.",
        "Fix: Refresh stale Now Playing data when returning to suspended pages.",
        "Fix: Restore locked-login centering and bundled TVDB demo metadata."
      ],
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [
          "Improve media review and mobile controls",
          "Keep watched items and dismissed title-only movie matches out of Manual Watch review.",
          "Improve mobile media and Upcoming layouts with inline season actions, shared controls, and clearer TV show summaries.",
          "Refresh stale Now Playing data when returning to suspended pages.",
          "Restore locked-login centering and bundled TVDB demo metadata."
        ],
        "tweaks": []
      },
      "sectionGroups": {
        "newFeatures": [],
        "majorBugFixes": [
          {
            "title": "Sync & provider recovery",
            "details": [
              "Improve media review and mobile controls",
              "Keep watched items and dismissed title-only movie matches out of Manual Watch review.",
              "Improve mobile media and Upcoming layouts with inline season actions, shared controls, and clearer TV show summaries.",
              "Refresh stale Now Playing data when returning to suspended pages.",
              "Restore locked-login centering and bundled TVDB demo metadata."
            ]
          }
        ],
        "tweaks": []
      }
    },
    {
      "version": "1.2.0",
      "version5Digit": "1.2.0.0.0",
      "date": "2026-09-19T15:29:26.115Z",
      "commit": "86648083208a3fc32a4a57792795f0f720d9cb05",
      "message": "This release makes recommendations more personal, keeps Up Next and watch-state sync reliable across providers, improves manual review and recovery workflows, adds safe Tautulli history import, and makes the whole app noticeably faster.",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Improve Settings, Manual Watch review, and sync recovery workflows.",
        "Feature: Complete startup, media detail, Up Next, website, and release refinements.",
        "Feature: Improve application speed across the app.",
        "Feature: Add clearer progress and removal feedback for background sync actions.",
        "Feature: Add Help after two failed provider retries and publish Jellyfin connection troubleshooting guidance.",
        "Feature: Add reviewable one-time Tautulli history imports with safe merges and preserved watch dates.",
        "Feature: Personalize recommendations from recent watch history.",
        "Feature: Let users choose Don't recommend to remove unwanted movies and shows from the personalized rail.",
        "Fix: Use a generic Dismiss & mark unwatched action, send the unwatched correction to all configured media apps, and keep the dismissed row hidden while stale refreshes settle.",
        "Fix: Keep media changes visible during sync",
        "Fix: Give Tautulli backup and import a clear preview, backup, import, and syncing flow with progress feedback.",
        "Fix: Refresh open media details immediately after removing one watch date while preserving surviving watches.",
        "Fix: Show syncing state and pause only affected media controls while queued imports and dispatches finish.",
        "Fix: Keep repeated watch actions responsive and visible, including animated Up Next requests with failure-safe labels.",
        "Fix: Clarify Tautulli backup and import progress",
        "Fix: Use Plembfin's in-app confirmation for the multiline backup and import summary.",
        "Fix: Show Importing while the backup and import request runs and keep the action disabled.",
        "Fix: Confirm completion and that Plembfin is syncing imported watches to connected media servers.",
        "Fix: Keep Up Next stable while watch state syncs",
        "Fix: Keep stale watched or unwatched cards out of Up Next until an authoritative refresh confirms their removal.",
        "Fix: Animate matching Up Next cards as Saving while watch and unwatch actions sync.",
        "Fix: Match pending actions by show identity and episode coordinates so rematches do not affect the wrong title.",
        "Fix: Keep removed or unwatched TV shows out of Up Next, including stale provider and fallback entries.",
        "Fix: Preserve selected TVDB identity in watch history and repair same-coordinate title-only episodes during Fix Match.",
        "Fix: Restore Jellyfin watched, resume, and rating imports against current API field rules.",
        "Fix: Keep removed TV shows out of Up Next across all episodes and provider refreshes.",
        "Fix: Hide Clear progress unless a resume item has a positive playback position.",
        "Tweak: Keep media changes visible while sync is in progress.",
        "Tweak: Keep Up Next and watch-state changes visible immediately while provider sync continues in the background",
        "Tweak: Make Manual Watch review decisions clearer, confirmed, merged by episode, and removed from the working list without layout jumps",
        "Tweak: Align review counts with the actionable episodes shown and stop re-announcing flags already resolved by Plembfin",
        "Tweak: Improve Sync Activity issue handling and add connection recovery guidance for unavailable media servers",
        "Tweak: Keep completed shows out of Up Next while retaining manually queued never-watched shows.",
        "Tweak: Surface media-server connection retries inline and improve Sync Activity match issue handling.",
        "Tweak: Media-page Up Next changes now appear promptly by prioritizing their sync and rebuilding stale queue projections.",
        "Tweak: Existing provider requests finish safely before the priority update is sent.",
        "Tweak: Refresh Up Next immediately after dashboard unwatch actions and keep valid manual watch reviews visible when older watch history exists.",
        "Tweak: Require confirmation before applying individual or show-level watch and unwatched decisions from Manual Watch review.",
        "Tweak: Show which connected app reported a watch and where dismissing the review will mark it unwatched.",
        "Tweak: Organize Manual Watch review actions by show, season, and episode with concise provider-specific labels.",
        "Tweak: Show newest review seasons first in boxed panels beneath the poster, preview only a few latest-season episodes, merge duplicate provider records into one row with source pills, remove the redundant show-level count summary, and remove accepted decisions optimistically while sync continues.",
        "Tweak: Improve cross-platform sync and onboarding while making Up Next reliably include watched shows and select the first released unwatched episode.",
        "Tweak: Keep Up Next aligned with media-page watch state, episode release dates, and TV-show actions.",
        "Tweak: Standardize settings sections, help guides, backup controls, and onboarding access.",
        "Tweak: Surface sync outcomes, retries, and unresolved media matches in the Sync Activity hub.",
        "Tweak: Improve provider-aware watch-state synchronization and recovery safeguards.",
        "Tweak: Up Next now checks every previously watched show, so new episodes are no longer missed because of a recency cap.",
        "Tweak: Keep the Up Next rail on the first released unwatched episode instead of jumping to a later season.",
        "Tweak: Improve dismissed Up Next interactions and watch-date actions.",
        "Tweak: Keep recommendation exclusions saved across refreshes and browsers.",
        "Tweak: Hide watched titles and improve poster recovery across Discover.",
        "Tweak: Improve card metadata hierarchy, summary readability, and release-date presentation across personal lists."
      ],
      "sections": {
        "newFeatures": [
          "Improve Settings, Manual Watch review, and sync recovery workflows.",
          "Complete startup, media detail, Up Next, website, and release refinements.",
          "Improve application speed across the app.",
          "Add clearer progress and removal feedback for background sync actions.",
          "Add Help after two failed provider retries and publish Jellyfin connection troubleshooting guidance.",
          "Add reviewable one-time Tautulli history imports with safe merges and preserved watch dates.",
          "Personalize recommendations from recent watch history.",
          "Let users choose Don't recommend to remove unwanted movies and shows from the personalized rail."
        ],
        "majorBugFixes": [
          "Use a generic Dismiss & mark unwatched action, send the unwatched correction to all configured media apps, and keep the dismissed row hidden while stale refreshes settle.",
          "Keep media changes visible during sync",
          "Give Tautulli backup and import a clear preview, backup, import, and syncing flow with progress feedback.",
          "Refresh open media details immediately after removing one watch date while preserving surviving watches.",
          "Show syncing state and pause only affected media controls while queued imports and dispatches finish.",
          "Keep repeated watch actions responsive and visible, including animated Up Next requests with failure-safe labels.",
          "Clarify Tautulli backup and import progress",
          "Use Plembfin's in-app confirmation for the multiline backup and import summary.",
          "Show Importing while the backup and import request runs and keep the action disabled.",
          "Confirm completion and that Plembfin is syncing imported watches to connected media servers.",
          "Keep Up Next stable while watch state syncs",
          "Keep stale watched or unwatched cards out of Up Next until an authoritative refresh confirms their removal.",
          "Animate matching Up Next cards as Saving while watch and unwatch actions sync.",
          "Match pending actions by show identity and episode coordinates so rematches do not affect the wrong title.",
          "Keep removed or unwatched TV shows out of Up Next, including stale provider and fallback entries.",
          "Preserve selected TVDB identity in watch history and repair same-coordinate title-only episodes during Fix Match.",
          "Restore Jellyfin watched, resume, and rating imports against current API field rules.",
          "Keep removed TV shows out of Up Next across all episodes and provider refreshes.",
          "Hide Clear progress unless a resume item has a positive playback position."
        ],
        "tweaks": [
          "Keep media changes visible while sync is in progress.",
          "Keep Up Next and watch-state changes visible immediately while provider sync continues in the background",
          "Make Manual Watch review decisions clearer, confirmed, merged by episode, and removed from the working list without layout jumps",
          "Align review counts with the actionable episodes shown and stop re-announcing flags already resolved by Plembfin",
          "Improve Sync Activity issue handling and add connection recovery guidance for unavailable media servers",
          "Keep completed shows out of Up Next while retaining manually queued never-watched shows.",
          "Surface media-server connection retries inline and improve Sync Activity match issue handling.",
          "Media-page Up Next changes now appear promptly by prioritizing their sync and rebuilding stale queue projections.",
          "Existing provider requests finish safely before the priority update is sent.",
          "Refresh Up Next immediately after dashboard unwatch actions and keep valid manual watch reviews visible when older watch history exists.",
          "Require confirmation before applying individual or show-level watch and unwatched decisions from Manual Watch review.",
          "Show which connected app reported a watch and where dismissing the review will mark it unwatched.",
          "Organize Manual Watch review actions by show, season, and episode with concise provider-specific labels.",
          "Show newest review seasons first in boxed panels beneath the poster, preview only a few latest-season episodes, merge duplicate provider records into one row with source pills, remove the redundant show-level count summary, and remove accepted decisions optimistically while sync continues.",
          "Improve cross-platform sync and onboarding while making Up Next reliably include watched shows and select the first released unwatched episode.",
          "Keep Up Next aligned with media-page watch state, episode release dates, and TV-show actions.",
          "Standardize settings sections, help guides, backup controls, and onboarding access.",
          "Surface sync outcomes, retries, and unresolved media matches in the Sync Activity hub.",
          "Improve provider-aware watch-state synchronization and recovery safeguards.",
          "Up Next now checks every previously watched show, so new episodes are no longer missed because of a recency cap.",
          "Keep the Up Next rail on the first released unwatched episode instead of jumping to a later season.",
          "Improve dismissed Up Next interactions and watch-date actions.",
          "Keep recommendation exclusions saved across refreshes and browsers.",
          "Hide watched titles and improve poster recovery across Discover.",
          "Improve card metadata hierarchy, summary readability, and release-date presentation across personal lists."
        ]
      },
      "sectionGroups": {
        "newFeatures": [
          {
            "title": "Settings",
            "details": [
              "Improve Settings, Manual Watch review, and sync recovery workflows."
            ]
          },
          {
            "title": "Discover & recommendations",
            "details": [
              "Personalize recommendations from recent watch history.",
              "Let users choose Don't recommend to remove unwanted movies and shows from the personalized rail."
            ]
          },
          {
            "title": "Tautulli imports",
            "details": [
              "Add reviewable one-time Tautulli history imports with safe merges and preserved watch dates."
            ]
          },
          {
            "title": "Sync & connection recovery",
            "details": [
              "Complete startup, media detail, Up Next, website, and release refinements.",
              "Improve application speed across the app.",
              "Add clearer progress and removal feedback for background sync actions.",
              "Add Help after two failed provider retries and publish Jellyfin connection troubleshooting guidance."
            ]
          }
        ],
        "majorBugFixes": [
          {
            "title": "Up Next & watch-state",
            "details": [
              "Keep repeated watch actions responsive and visible, including animated Up Next requests with failure-safe labels.",
              "Keep Up Next stable while watch state syncs",
              "Keep stale watched or unwatched cards out of Up Next until an authoritative refresh confirms their removal.",
              "Animate matching Up Next cards as Saving while watch and unwatch actions sync.",
              "Keep removed or unwatched TV shows out of Up Next, including stale provider and fallback entries.",
              "Keep removed TV shows out of Up Next across all episodes and provider refreshes.",
              "Hide Clear progress unless a resume item has a positive playback position."
            ]
          },
          {
            "title": "Tautulli imports",
            "details": [
              "Give Tautulli backup and import a clear preview, backup, import, and syncing flow with progress feedback.",
              "Show syncing state and pause only affected media controls while queued imports and dispatches finish.",
              "Clarify Tautulli backup and import progress",
              "Use Plembfin's in-app confirmation for the multiline backup and import summary.",
              "Show Importing while the backup and import request runs and keep the action disabled.",
              "Confirm completion and that Plembfin is syncing imported watches to connected media servers."
            ]
          },
          {
            "title": "Manual Watch & watch actions",
            "details": [
              "Use a generic Dismiss & mark unwatched action, send the unwatched correction to all configured media apps, and keep the dismissed row hidden while stale refreshes settle.",
              "Refresh open media details immediately after removing one watch date while preserving surviving watches.",
              "Match pending actions by show identity and episode coordinates so rematches do not affect the wrong title.",
              "Preserve selected TVDB identity in watch history and repair same-coordinate title-only episodes during Fix Match."
            ]
          },
          {
            "title": "Sync & provider recovery",
            "details": [
              "Keep media changes visible during sync",
              "Restore Jellyfin watched, resume, and rating imports against current API field rules."
            ]
          }
        ],
        "tweaks": [
          {
            "title": "Up Next & watch-state",
            "details": [
              "Keep media changes visible while sync is in progress.",
              "Keep Up Next and watch-state changes visible immediately while provider sync continues in the background",
              "Keep completed shows out of Up Next while retaining manually queued never-watched shows.",
              "Media-page Up Next changes now appear promptly by prioritizing their sync and rebuilding stale queue projections.",
              "Improve cross-platform sync and onboarding while making Up Next reliably include watched shows and select the first released unwatched episode.",
              "Keep Up Next aligned with media-page watch state, episode release dates, and TV-show actions.",
              "Improve provider-aware watch-state synchronization and recovery safeguards.",
              "Up Next now checks every previously watched show, so new episodes are no longer missed because of a recency cap.",
              "Keep the Up Next rail on the first released unwatched episode instead of jumping to a later season.",
              "Improve dismissed Up Next interactions and watch-date actions."
            ]
          },
          {
            "title": "Manual Watch review",
            "details": [
              "Make Manual Watch review decisions clearer, confirmed, merged by episode, and removed from the working list without layout jumps",
              "Align review counts with the actionable episodes shown and stop re-announcing flags already resolved by Plembfin",
              "Refresh Up Next immediately after dashboard unwatch actions and keep valid manual watch reviews visible when older watch history exists.",
              "Require confirmation before applying individual or show-level watch and unwatched decisions from Manual Watch review.",
              "Show which connected app reported a watch and where dismissing the review will mark it unwatched.",
              "Organize Manual Watch review actions by show, season, and episode with concise provider-specific labels.",
              "Show newest review seasons first in boxed panels beneath the poster, preview only a few latest-season episodes, merge duplicate provider records into one row with source pills, remove the redundant show-level count summary, and remove accepted decisions optimistically while sync continues."
            ]
          },
          {
            "title": "Discover & recommendations",
            "details": [
              "Keep recommendation exclusions saved across refreshes and browsers.",
              "Hide watched titles and improve poster recovery across Discover.",
              "Improve card metadata hierarchy, summary readability, and release-date presentation across personal lists."
            ]
          },
          {
            "title": "Sync & connection recovery",
            "details": [
              "Improve Sync Activity issue handling and add connection recovery guidance for unavailable media servers",
              "Surface media-server connection retries inline and improve Sync Activity match issue handling.",
              "Existing provider requests finish safely before the priority update is sent.",
              "Standardize settings sections, help guides, backup controls, and onboarding access.",
              "Surface sync outcomes, retries, and unresolved media matches in the Sync Activity hub."
            ]
          }
        ]
      }
    },
    {
      "version": "1.1.1",
      "version5Digit": "1.1.1.0.0",
      "date": "2026-09-14T09:16:13.782Z",
      "commit": "78d6cdfc480470fb745caa2465027e34d20b36e2",
      "message": "Up Next now keeps Plex, Emby, and Jellyfin aligned with reliable resume progress, released episodes, dismissals, and background queue updates with direct Watch now links.",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Automatically sync Up Next additions, removals, reorderings, and resume-progress changes in the background, including when the Dashboard is closed.",
        "Feature: Keep Plembfin's Up Next aligned with Plex Continue Watching, Emby Continue Watching, and Jellyfin Next Up.",
        "Feature: Bring the correct released or unwatched next episode into Up Next without inventing resume progress or resetting genuine play counts.",
        "Fix: Dashboard Up Next cards now include Jellyfin in their Watch now links.",
        "Fix: Show genuine part-watched progress on Up Next cards and keep it consistent with the media detail page across connected servers.",
        "Fix: Keep provider writes matched to the intended title and avoid treating Plembfin-created rail positions as real resume progress or Now Playing sessions.",
        "Tweak: Share Up Next dismissals across devices, with a review-and-restore flow for items hidden by mistake.",
        "Tweak: Make Up Next provider sync optional, leaving provider lists unchanged when disabled."
      ],
      "sections": {
        "newFeatures": [
          "Automatically sync Up Next additions, removals, reorderings, and resume-progress changes in the background, including when the Dashboard is closed.",
          "Keep Plembfin's Up Next aligned with Plex Continue Watching, Emby Continue Watching, and Jellyfin Next Up.",
          "Bring the correct released or unwatched next episode into Up Next without inventing resume progress or resetting genuine play counts."
        ],
        "majorBugFixes": [
          "Dashboard Up Next cards now include Jellyfin in their Watch now links.",
          "Show genuine part-watched progress on Up Next cards and keep it consistent with the media detail page across connected servers.",
          "Keep provider writes matched to the intended title and avoid treating Plembfin-created rail positions as real resume progress or Now Playing sessions."
        ],
        "tweaks": [
          "Share Up Next dismissals across devices, with a review-and-restore flow for items hidden by mistake.",
          "Make Up Next provider sync optional, leaving provider lists unchanged when disabled."
        ]
      }
    },
    {
      "version": "1.1.0",
      "version5Digit": "1.1.0.0.0",
      "date": "2026-09-12T14:49:22.789Z",
      "commit": "2ffc8f65cada43ed20c5b193b194463398b8c9e0",
      "message": "This release makes whole-series watch sync reliable with release-date choices, live per-episode progress, resilient Trakt delivery, and a cleaner onboarding and login experience.",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Make full-series watch sync reliable",
        "Feature: Mark complete shows watched across seasons with the selected watch date and visible per-episode progress",
        "Feature: Update open detail, dashboard, and Up Next views from live watch-state events without full-page rerenders",
        "Feature: Finish local media-server writes before draining a paced, retrying Trakt queue, keep remove/add pairs atomic, and stop queued items on cancellation",
        "Feature: Improve sync issue matching, retry coverage, and status feedback for failed episode destinations",
        "Feature: Polish onboarding and login presentation, theme-aware branding, version metadata, and public release documentation",
        "Tweak: Align website with current release",
        "Tweak: Update public documentation to v1.0.2 and document whole-series watch dates, live save progress, resilient Trakt retries, and local password recovery."
      ],
      "sections": {
        "newFeatures": [
          "Make full-series watch sync reliable",
          "Mark complete shows watched across seasons with the selected watch date and visible per-episode progress",
          "Update open detail, dashboard, and Up Next views from live watch-state events without full-page rerenders",
          "Finish local media-server writes before draining a paced, retrying Trakt queue, keep remove/add pairs atomic, and stop queued items on cancellation",
          "Improve sync issue matching, retry coverage, and status feedback for failed episode destinations",
          "Polish onboarding and login presentation, theme-aware branding, version metadata, and public release documentation"
        ],
        "majorBugFixes": [],
        "tweaks": [
          "Align website with current release",
          "Update public documentation to v1.0.2 and document whole-series watch dates, live save progress, resilient Trakt retries, and local password recovery."
        ]
      }
    },
    {
      "version": "1.0.2",
      "version5Digit": "1.0.2.0.0",
      "date": "2026-09-11T16:02:35.110Z",
      "commit": "9f04d77a99186fad40fa6b812a8ef403e940c0f3",
      "message": "This update fixes changelog navigation, keeps completed onboarding hidden, preserves Manual Watch review counts while navigating, and hardens concurrent startup.",
      "author": "Lasikiewicz",
      "details": [
        "Fix: Serialize live change trigger setup",
        "Fix: Prevent concurrent startup races when installing live-change notifications.",
        "Fix: Preserve changelog and completed setup state",
        "Fix: Open the Changelog directly from the bottom-left version link",
        "Fix: Keep completed onboarding controls hidden after startup and refresh",
        "Fix: Preserve Manual Watch review counts while navigating between pages",
        "Tweak: Align website with current release",
        "Tweak: Align the website verification markers and release data with the v1.0.1 stable application baseline",
        "Tweak: Clarify that the bottom-left version link opens Settings → Changelog while About identifies the installed app"
      ],
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [
          "Serialize live change trigger setup",
          "Prevent concurrent startup races when installing live-change notifications.",
          "Preserve changelog and completed setup state",
          "Open the Changelog directly from the bottom-left version link",
          "Keep completed onboarding controls hidden after startup and refresh",
          "Preserve Manual Watch review counts while navigating between pages"
        ],
        "tweaks": [
          "Align website with current release",
          "Align the website verification markers and release data with the v1.0.1 stable application baseline",
          "Clarify that the bottom-left version link opens Settings → Changelog while About identifies the installed app"
        ]
      }
    },
    {
      "version": "1.0.1",
      "version5Digit": "1.0.1.0.0",
      "date": "2026-09-11T13:40:25.053Z",
      "commit": "b5fa0258838f781d0b3f05a9a24c08b36db0f590",
      "message": "Complete first-run setup and Windows distribution with a self-contained installer, optional tray controls, safer service cleanup, separate runtime data, and clearer onboarding and release documentation.",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Publish formatted notes with every release",
        "Feature: Generate readable release notes from the committed changelog for alpha and stable builds",
        "Feature: Publish Docker and Windows outputs together on the matching GitHub Release",
        "Feature: Include setup guidance, limitations, download links, and screenshots in each release",
        "Feature: Complete first-run setup and Windows distribution",
        "Feature: Guide new instances through account claiming and show the claimed account details and local address",
        "Feature: Add a self-contained Windows installer with service cleanup, optional tray startup, and post-install launch choices",
        "Feature: Keep installed runtime data separate from the source checkout so reinstalls do not reuse repository data",
        "Feature: Improve live media and watch-state updates across dashboard, history, and sync surfaces",
        "Feature: Add a packaged demo catalog and refresh the public documentation experience",
        "Tweak: Update website for Windows distribution",
        "Tweak: Document the Windows installer, runtime data location, and first-launch choices",
        "Tweak: Mark Getting started as verified against the v1.0.0 application baseline",
        "Tweak: Align website coverage checks with the current Settings navigation"
      ],
      "sections": {
        "newFeatures": [
          "Publish formatted notes with every release",
          "Generate readable release notes from the committed changelog for alpha and stable builds",
          "Publish Docker and Windows outputs together on the matching GitHub Release",
          "Include setup guidance, limitations, download links, and screenshots in each release",
          "Complete first-run setup and Windows distribution",
          "Guide new instances through account claiming and show the claimed account details and local address",
          "Add a self-contained Windows installer with service cleanup, optional tray startup, and post-install launch choices",
          "Keep installed runtime data separate from the source checkout so reinstalls do not reuse repository data",
          "Improve live media and watch-state updates across dashboard, history, and sync surfaces",
          "Add a packaged demo catalog and refresh the public documentation experience"
        ],
        "majorBugFixes": [],
        "tweaks": [
          "Update website for Windows distribution",
          "Document the Windows installer, runtime data location, and first-launch choices",
          "Mark Getting started as verified against the v1.0.0 application baseline",
          "Align website coverage checks with the current Settings navigation"
        ]
      }
    },
    {
      "version": "1.0.0",
      "version5Digit": "1.0.0.0.0",
      "date": "2026-09-09T19:00:27.980Z",
      "commit": "a0d74299192ef406b71279ecb4543893622dd77f",
      "message": "Release the feature-complete Plembfin app with its refreshed documentation website, covering current dashboard, Up Next, sync activity, spoiler guidance, and stabilized live media cards.",
      "author": "Lasikiewicz",
      "details": [
        "Fix: Scope live media updates to affected cards",
        "Fix: Keep SSE watch and sync changes scoped to the affected tiles while preserving unchanged artwork nodes.",
        "Fix: Reconcile dashboard, Up Next, and Now Playing cards in place instead of rebuilding their rails.",
        "Fix: Refresh History, Explorer, and Stats only when their live data changes.",
        "Fix: Keep cleared Up Next items dismissed",
        "Fix: Keep cleared resume cards hidden while provider feeds catch up.",
        "Fix: Restore provider artwork on dashboard cards",
        "Fix: Keep authenticated provider poster proxies visible in cache-only dashboard surfaces.",
        "Fix: Start Now Playing with eager media-key artwork and merge unambiguous cross-provider movie resumes.",
        "Fix: Stabilize dashboard media state",
        "Fix: Repair missing Part Watched artwork during scheduled metadata refreshes.",
        "Fix: Canonicalize provider episode identities so duplicate resume cards collapse safely.",
        "Fix: Keep the dashboard Clear action aligned with the watch percentage.",
        "Fix: Document and enforce the network-enabled launch path.",
        "Tweak: This update includes track website coverage index, track website content module, and gate website deployments on main.",
        "Tweak: Include the static site's app-surface coverage index in fresh clones",
        "Tweak: Keep runtime data directories ignored while allowing this documented website input",
        "Tweak: Include the shared static-site content module used by every page and navigation rail",
        "Tweak: Keep the website self-contained when Cloudflare clones only the tracked repository",
        "Tweak: The public documentation site now publishes only from the Force-to-main release on main.",
        "Tweak: This update includes hide sync activity error details and resolve media pages and clear stale now playing.",
        "Tweak: Retry and dismiss failures now return generic public messages instead of internal error details.",
        "Tweak: Resolve ambiguous TV metadata from episode-level identifiers.",
        "Tweak: Remove completed playback and stale Now Playing state from the dashboard."
      ],
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [
          "Scope live media updates to affected cards",
          "Keep SSE watch and sync changes scoped to the affected tiles while preserving unchanged artwork nodes.",
          "Reconcile dashboard, Up Next, and Now Playing cards in place instead of rebuilding their rails.",
          "Refresh History, Explorer, and Stats only when their live data changes.",
          "Keep cleared Up Next items dismissed",
          "Keep cleared resume cards hidden while provider feeds catch up.",
          "Restore provider artwork on dashboard cards",
          "Keep authenticated provider poster proxies visible in cache-only dashboard surfaces.",
          "Start Now Playing with eager media-key artwork and merge unambiguous cross-provider movie resumes.",
          "Stabilize dashboard media state",
          "Repair missing Part Watched artwork during scheduled metadata refreshes.",
          "Canonicalize provider episode identities so duplicate resume cards collapse safely.",
          "Keep the dashboard Clear action aligned with the watch percentage.",
          "Document and enforce the network-enabled launch path."
        ],
        "tweaks": [
          "This update includes track website coverage index, track website content module, and gate website deployments on main.",
          "Include the static site's app-surface coverage index in fresh clones",
          "Keep runtime data directories ignored while allowing this documented website input",
          "Include the shared static-site content module used by every page and navigation rail",
          "Keep the website self-contained when Cloudflare clones only the tracked repository",
          "The public documentation site now publishes only from the Force-to-main release on main.",
          "This update includes hide sync activity error details and resolve media pages and clear stale now playing.",
          "Retry and dismiss failures now return generic public messages instead of internal error details.",
          "Resolve ambiguous TV metadata from episode-level identifiers.",
          "Remove completed playback and stale Now Playing state from the dashboard."
        ]
      }
    },
    {
      "version": "0.16.3",
      "version5Digit": "0.16.3.0.0",
      "date": "2026-09-08T21:16:20.805Z",
      "commit": "80d7a494884b2fa04385af3ebef0ce5bf84e6797",
      "message": "This hotfix adds show-wide Trakt match repair and retry controls, lets unavailable Trakt shows be dismissed, and refreshes corrected TV metadata and posters immediately.",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Add dismiss controls for Trakt errors when a show is unavailable",
        "Fix: Repair Trakt show matches and refresh metadata immediately",
        "Fix: Rematch every episode in a show and retry all current failed entries",
        "Fix: Warm corrected TV metadata and posters before returning to the dashboard",
        "Fix: Document the new Sync Activity and artwork behavior"
      ],
      "sections": {
        "newFeatures": [
          "Add dismiss controls for Trakt errors when a show is unavailable"
        ],
        "majorBugFixes": [
          "Repair Trakt show matches and refresh metadata immediately",
          "Rematch every episode in a show and retry all current failed entries",
          "Warm corrected TV metadata and posters before returning to the dashboard",
          "Document the new Sync Activity and artwork behavior"
        ],
        "tweaks": []
      }
    },
    {
      "version": "0.16.2",
      "version5Digit": "0.16.2.0.0",
      "date": "2026-09-08T20:00:29.316Z",
      "commit": "d3e8d192e27a7eb0b8cdaf8246c232bf0e340895",
      "message": "Support Jellyfin 12 authentication with safer watch-state handling and clearer Sync Activity",
      "author": "Lasikiewicz",
      "details": [
        "Fix: Support Jellyfin 12 with safer watch-state and Sync Activity",
        "Fix: Keep Jellyfin 12 authentication on its modern MediaBrowser header while preserving manual API-key and Quick Connect credentials.",
        "Fix: Keep explicit Plembfin watched and unwatched decisions authoritative across rematched provider identities, clear stale aliases and resume progress, and block delayed provider flags from resurrecting unwatched items.",
        "Fix: Retire pending manual-watch reviews after an explicit unwatch while allowing a deliberate provider Mark played event to start a new review.",
        "Fix: Keep season and show watch dates chronological around edited episodes without rewriting existing dates.",
        "Fix: Update mounted show details in place after watch changes, preserving scroll position and artwork while preventing stale history from repainting an unwatched episode.",
        "Fix: Make Sync Activity show current results per movie or episode, separate expected missing-library skips from real failures, and preserve the full audit history.",
        "Fix: Retry only the newest unresolved targets across all pages, stream retry progress, and offer Trakt show-match repair for episode not_found failures."
      ],
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [
          "Support Jellyfin 12 with safer watch-state and Sync Activity",
          "Keep Jellyfin 12 authentication on its modern MediaBrowser header while preserving manual API-key and Quick Connect credentials.",
          "Keep explicit Plembfin watched and unwatched decisions authoritative across rematched provider identities, clear stale aliases and resume progress, and block delayed provider flags from resurrecting unwatched items.",
          "Retire pending manual-watch reviews after an explicit unwatch while allowing a deliberate provider Mark played event to start a new review.",
          "Keep season and show watch dates chronological around edited episodes without rewriting existing dates.",
          "Update mounted show details in place after watch changes, preserving scroll position and artwork while preventing stale history from repainting an unwatched episode.",
          "Make Sync Activity show current results per movie or episode, separate expected missing-library skips from real failures, and preserve the full audit history.",
          "Retry only the newest unresolved targets across all pages, stream retry progress, and offer Trakt show-match repair for episode not_found failures."
        ],
        "tweaks": []
      }
    },
    {
      "version": "0.16.1",
      "version5Digit": "0.16.1.0.0",
      "date": "2026-09-07T17:53:59.277Z",
      "commit": "b922823df30b891271cdfd4d10f9e308e4cc755e",
      "message": "hotfix",
      "author": "Lasikiewicz",
      "details": [
        "Tweak: This update includes only update unwatched episodes when marking a season watched.",
        "Tweak: Partially watched seasons update only the episodes that are still unwatched",
        "Tweak: Existing watched episodes remain unchanged when completing a season",
        "Tweak: Fully watched seasons retain the explicit Resync season action"
      ],
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [],
        "tweaks": [
          "This update includes only update unwatched episodes when marking a season watched.",
          "Partially watched seasons update only the episodes that are still unwatched",
          "Existing watched episodes remain unchanged when completing a season",
          "Fully watched seasons retain the explicit Resync season action"
        ]
      }
    },
    {
      "version": "0.16.0",
      "version5Digit": "0.16.0.0.0",
      "date": "2026-09-07T15:45:46.501Z",
      "commit": "391c4b8c345d75552dec5821574a0a81167744db",
      "message": "This update delivers broad performance improvements across media, library, history, metadata, caching, sync, and large-library workflows, with faster artwork loading and a new manual watch feature.",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Add a manual watch review queue with show grouping, bulk decisions, and custom watch dates",
        "Feature: Redesign season and episode details with clearer layouts, season navigation, artwork, and incremental loading",
        "Feature: Add onboarding and Settings controls for sync tuning, watch thresholds, and fast local-network sync",
        "Fix: Smooth media artwork loading and metadata prefetch",
        "Fix: Show a shimmer placeholder while media-page artwork loads.",
        "Fix: Preserve reserved image space across posters, episodes, cast, trailers, and galleries while respecting reduced-motion preferences.",
        "Fix: Bound background TMDB metadata prefetch batches to reduce cold-load timeouts.",
        "Fix: Make the remote backup passphrase field form-compatible and remove unused icon preloads.",
        "Fix: Repair watched state and localized TV matching",
        "Fix: Repair watched reports across Plex, Emby, and Jellyfin when Plembfin already has the canonical watched state",
        "Fix: Preserve canonical watch dates and explicit unwatched decisions across provider identities",
        "Fix: Match TVDB series by English translations and slugs when the primary title is localized",
        "Fix: Hide stale manual-review rows after the canonical watched state is confirmed",
        "Fix: Keep Plex, Emby, Jellyfin, and Plembfin watched/unwatched state synchronized with reliable now-playing and Up Next refreshes",
        "Fix: Restore complete TV show metadata and canonical show navigation from dashboard and history",
        "Fix: Harden large-library history, caching, sync retries, and provider identity matching",
        "Fix: Dismissing a manual watch review marks the item unwatched on the reporting media app before closing the review",
        "Fix: A failed provider correction leaves the review pending for retry",
        "Fix: Invalidate structural-only TV metadata caches so cast, images, trailers, reviews, and related shows load again",
        "Fix: Resolve title-only TV show pages through the full metadata pipeline and canonical provider route",
        "Fix: Preserve the selected season when canonicalizing a title-only TV show route",
        "Fix: Clicking a TV show poster or title from Up Next or watch history opens the show page instead of an episode-specific route",
        "Fix: Preserve the relevant season when opening a TV show from dashboard history surfaces",
        "Fix: Speed up media pages by deferring off-screen artwork",
        "Fix: Opening a movie or show page no longer downloads its whole cast row, poster rails and trailer thumbnails before you have scrolled to them",
        "Fix: Those images load as they come into view, so the details, watch state and app links on screen settle sooner on a first visit",
        "Fix: Revisiting a title is unchanged, since its artwork was already served from the browser cache",
        "Fix: Repair Up Next cards built from raw media-server data",
        "Fix: An Up Next card whose provider data carried the episode's own ID in place of the show's now links to the correct show page instead of one that cannot load",
        "Fix: Those cards show their poster again rather than a blank placeholder, where the media server had supplied an image address only it could resolve",
        "Fix: A card left with no usable show identity links by title instead of to a page that resolves to nothing",
        "Fix: Speed up non-library show pages and repair Up Next links",
        "Fix: Up Next now links an episode to the same show page as your watch history does; it previously built that link from the episode's own ID, opening a page that could not resolve and was slow to load",
        "Fix: Opening a show that is not in your library is far quicker: the page's slowest request drops from about 8.9 seconds to under 0.7",
        "Fix: Such a show is no longer looked up over and over during one page load, so its details settle sooner",
        "Fix: The open-in-Plex/Emby/Jellyfin lookup runs once per page instead of three times, and a title found in no connected server is remembered briefly rather than re-searching every server each time",
        "Fix: A show sharing its name with another in your library keeps linking by title rather than risking the wrong show's page",
        "Fix: Speed up history and remove large-library limits",
        "Fix: History page now loads in milliseconds instead of around seven tenths of a second on large libraries, with same-day rewatch collapsing unchanged",
        "Fix: Stats reports your entire watch history instead of silently describing only the newest 25,000 watches",
        "Fix: TV Shows and the dashboard list every show in the library rather than stopping at the same 25,000-watch ceiling",
        "Fix: Media pages no longer re-check for app updates or refetch diagnostic logs on every load",
        "Fix: Platform icons are fetched once per page instead of three times under three different addresses",
        "Fix: The background scheduler holds its once-a-minute cadence instead of drifting further behind with every slow tick",
        "Fix: Restore progress logs and login errors no longer display garbled characters",
        "Fix: Watch history caches rebuild faster after a watch is recorded",
        "Fix: Stop resume updates rebuilding library caches",
        "Fix: Saving a resume position no longer throws away the cached history, movies, shows and stats data, none of which depends on it; with a dashboard open during playback that was spending 22% of the time rebuilding on a normal library and 47% on a very large one, and is now zero",
        "Fix: Open pages still see resume progress move, because the change signal the browser watches now covers both watch history and resume positions",
        "Fix: Marking something watched still refreshes every derived view exactly as before",
        "Fix: Each build now serves its own asset URLs, so pulling a new build no longer leaves the browser running the previous build's JavaScript from cache",
        "Fix: Make the media and library pages substantially faster",
        "Fix: TV shows whose episodes all fall outside the most recent 25,000 watches no longer disappear from the TV Shows library; on a 90,000 watch test library that restored 408 missing shows",
        "Fix: Opening a TV show or episode page no longer makes an external metadata request just to look up an id the app already stored, and no longer re-asks Plex, Emby and Jellyfin whether the title is available on every single load",
        "Fix: An episode page asked the server for the same show record four times and now asks once, cutting about 1.1 seconds and 84KB from the load",
        "Fix: Movie and show pages no longer carry streaming availability for every country in the world when only two are shown, taking a movie page's metadata from 100KB to 76KB and the stored metadata here from 105MB to 63MB",
        "Fix: Movies pages answer from a cached projection instead of re-deriving the whole library each time: pages 1, 5 and 10 went from about 60ms to under 1ms on a 90,000 row library",
        "Fix: Library pages load all of a screen's posters in one request rather than one per card, and adding another page of results now appends the new cards instead of rebuilding every card already on screen",
        "Fix: The Stats page no longer downloads every period's report to display one, and the restore screen no longer re-downloads the whole restore report on every poll",
        "Fix: Library reads are backed by new database indexes, taking season lookups from 798ms to 28ms and recent-order reads from 767ms to 48ms",
        "Fix: Resolve code scanning alerts (#27) and close the remaining stack trace exposure (#28)",
        "Fix: Normalize caught provider, credential, outbound, and watchlist errors before they can reach API responses",
        "Fix: Movies pages now answer from a cached projection instead of re-deriving the whole library on every request: pages 1, 5 and 10 went from about 60ms to under 1ms on a 90,000-row library, and the page number no longer changes the cost",
        "Fix: The Stats page no longer downloads every period's report just to display one; it receives the totals, a short list of the available years and months, and only the report being viewed, fetching a different period when you pick one",
        "Fix: A completed restore's full result and log are stored separately from the live status row, so the restore screen stops re-downloading the entire report on every poll while still showing the whole log",
        "Fix: Library reads are backed by new database indexes covering season and title lookups, provider ids and recent ordering, with planner statistics refreshed once after they are created",
        "Fix: Poster and backdrop paths are stored as their own columns on the metadata cache, so artwork no longer requires parsing the full details blob",
        "Fix: Keep media details visible during reload",
        "Fix: Keep cached artwork, summaries, watched rows, and watch dates visible on direct detail reloads",
        "Fix: Revalidate local history and provider metadata in the background without blanking the page",
        "Fix: Keep episode-level provider identities from being promoted into the wrong series route",
        "Fix: Keep Up Next and watched state aligned across Plex, Emby, and Jellyfin, repair newly available provider episodes, preserve accurate progress, and restore episode titles",
        "Fix: Prevent stale media detail responses from repainting the dashboard after rapid navigation",
        "Fix: Keep show and movie detail hydration, watch actions, and provider-derived state consistent during asynchronous loads",
        "Fix: Improve scheduler, live-session, and incremental provider-sync behavior for reliable updates",
        "Tweak: Make the dismiss action label explain that it also marks the item unwatched",
        "Tweak: Display Mark watched now actions with the same neutral treatment as the other review choices",
        "Tweak: Show prominent loading motion on the poster, episode tiles, and pending watch-date areas",
        "Tweak: Polish refresh and menu controls",
        "Tweak: Harden response caching, compression, and asset-version handling for safer browser loads."
      ],
      "sections": {
        "newFeatures": [
          "Add a manual watch review queue with show grouping, bulk decisions, and custom watch dates",
          "Redesign season and episode details with clearer layouts, season navigation, artwork, and incremental loading",
          "Add onboarding and Settings controls for sync tuning, watch thresholds, and fast local-network sync"
        ],
        "majorBugFixes": [
          "Smooth media artwork loading and metadata prefetch",
          "Show a shimmer placeholder while media-page artwork loads.",
          "Preserve reserved image space across posters, episodes, cast, trailers, and galleries while respecting reduced-motion preferences.",
          "Bound background TMDB metadata prefetch batches to reduce cold-load timeouts.",
          "Make the remote backup passphrase field form-compatible and remove unused icon preloads.",
          "Repair watched state and localized TV matching",
          "Repair watched reports across Plex, Emby, and Jellyfin when Plembfin already has the canonical watched state",
          "Preserve canonical watch dates and explicit unwatched decisions across provider identities",
          "Match TVDB series by English translations and slugs when the primary title is localized",
          "Hide stale manual-review rows after the canonical watched state is confirmed",
          "Keep Plex, Emby, Jellyfin, and Plembfin watched/unwatched state synchronized with reliable now-playing and Up Next refreshes",
          "Restore complete TV show metadata and canonical show navigation from dashboard and history",
          "Harden large-library history, caching, sync retries, and provider identity matching",
          "Dismissing a manual watch review marks the item unwatched on the reporting media app before closing the review",
          "A failed provider correction leaves the review pending for retry",
          "Invalidate structural-only TV metadata caches so cast, images, trailers, reviews, and related shows load again",
          "Resolve title-only TV show pages through the full metadata pipeline and canonical provider route",
          "Preserve the selected season when canonicalizing a title-only TV show route",
          "Clicking a TV show poster or title from Up Next or watch history opens the show page instead of an episode-specific route",
          "Preserve the relevant season when opening a TV show from dashboard history surfaces",
          "Speed up media pages by deferring off-screen artwork",
          "Opening a movie or show page no longer downloads its whole cast row, poster rails and trailer thumbnails before you have scrolled to them",
          "Those images load as they come into view, so the details, watch state and app links on screen settle sooner on a first visit",
          "Revisiting a title is unchanged, since its artwork was already served from the browser cache",
          "Repair Up Next cards built from raw media-server data",
          "An Up Next card whose provider data carried the episode's own ID in place of the show's now links to the correct show page instead of one that cannot load",
          "Those cards show their poster again rather than a blank placeholder, where the media server had supplied an image address only it could resolve",
          "A card left with no usable show identity links by title instead of to a page that resolves to nothing",
          "Speed up non-library show pages and repair Up Next links",
          "Up Next now links an episode to the same show page as your watch history does; it previously built that link from the episode's own ID, opening a page that could not resolve and was slow to load",
          "Opening a show that is not in your library is far quicker: the page's slowest request drops from about 8.9 seconds to under 0.7",
          "Such a show is no longer looked up over and over during one page load, so its details settle sooner",
          "The open-in-Plex/Emby/Jellyfin lookup runs once per page instead of three times, and a title found in no connected server is remembered briefly rather than re-searching every server each time",
          "A show sharing its name with another in your library keeps linking by title rather than risking the wrong show's page",
          "Speed up history and remove large-library limits",
          "History page now loads in milliseconds instead of around seven tenths of a second on large libraries, with same-day rewatch collapsing unchanged",
          "Stats reports your entire watch history instead of silently describing only the newest 25,000 watches",
          "TV Shows and the dashboard list every show in the library rather than stopping at the same 25,000-watch ceiling",
          "Media pages no longer re-check for app updates or refetch diagnostic logs on every load",
          "Platform icons are fetched once per page instead of three times under three different addresses",
          "The background scheduler holds its once-a-minute cadence instead of drifting further behind with every slow tick",
          "Restore progress logs and login errors no longer display garbled characters",
          "Watch history caches rebuild faster after a watch is recorded",
          "Stop resume updates rebuilding library caches",
          "Saving a resume position no longer throws away the cached history, movies, shows and stats data, none of which depends on it; with a dashboard open during playback that was spending 22% of the time rebuilding on a normal library and 47% on a very large one, and is now zero",
          "Open pages still see resume progress move, because the change signal the browser watches now covers both watch history and resume positions",
          "Marking something watched still refreshes every derived view exactly as before",
          "Each build now serves its own asset URLs, so pulling a new build no longer leaves the browser running the previous build's JavaScript from cache",
          "Make the media and library pages substantially faster",
          "TV shows whose episodes all fall outside the most recent 25,000 watches no longer disappear from the TV Shows library; on a 90,000 watch test library that restored 408 missing shows",
          "Opening a TV show or episode page no longer makes an external metadata request just to look up an id the app already stored, and no longer re-asks Plex, Emby and Jellyfin whether the title is available on every single load",
          "An episode page asked the server for the same show record four times and now asks once, cutting about 1.1 seconds and 84KB from the load",
          "Movie and show pages no longer carry streaming availability for every country in the world when only two are shown, taking a movie page's metadata from 100KB to 76KB and the stored metadata here from 105MB to 63MB",
          "Movies pages answer from a cached projection instead of re-deriving the whole library each time: pages 1, 5 and 10 went from about 60ms to under 1ms on a 90,000 row library",
          "Library pages load all of a screen's posters in one request rather than one per card, and adding another page of results now appends the new cards instead of rebuilding every card already on screen",
          "The Stats page no longer downloads every period's report to display one, and the restore screen no longer re-downloads the whole restore report on every poll",
          "Library reads are backed by new database indexes, taking season lookups from 798ms to 28ms and recent-order reads from 767ms to 48ms",
          "Resolve code scanning alerts (#27) and close the remaining stack trace exposure (#28)",
          "Normalize caught provider, credential, outbound, and watchlist errors before they can reach API responses",
          "Movies pages now answer from a cached projection instead of re-deriving the whole library on every request: pages 1, 5 and 10 went from about 60ms to under 1ms on a 90,000-row library, and the page number no longer changes the cost",
          "The Stats page no longer downloads every period's report just to display one; it receives the totals, a short list of the available years and months, and only the report being viewed, fetching a different period when you pick one",
          "A completed restore's full result and log are stored separately from the live status row, so the restore screen stops re-downloading the entire report on every poll while still showing the whole log",
          "Library reads are backed by new database indexes covering season and title lookups, provider ids and recent ordering, with planner statistics refreshed once after they are created",
          "Poster and backdrop paths are stored as their own columns on the metadata cache, so artwork no longer requires parsing the full details blob",
          "Keep media details visible during reload",
          "Keep cached artwork, summaries, watched rows, and watch dates visible on direct detail reloads",
          "Revalidate local history and provider metadata in the background without blanking the page",
          "Keep episode-level provider identities from being promoted into the wrong series route",
          "Keep Up Next and watched state aligned across Plex, Emby, and Jellyfin, repair newly available provider episodes, preserve accurate progress, and restore episode titles",
          "Prevent stale media detail responses from repainting the dashboard after rapid navigation",
          "Keep show and movie detail hydration, watch actions, and provider-derived state consistent during asynchronous loads",
          "Improve scheduler, live-session, and incremental provider-sync behavior for reliable updates"
        ],
        "tweaks": [
          "Make the dismiss action label explain that it also marks the item unwatched",
          "Display Mark watched now actions with the same neutral treatment as the other review choices",
          "Show prominent loading motion on the poster, episode tiles, and pending watch-date areas",
          "Polish refresh and menu controls",
          "Harden response caching, compression, and asset-version handling for safer browser loads."
        ]
      }
    },
    {
      "version": "0.15.0",
      "version5Digit": "0.15.0.0.0",
      "date": "2026-09-03T16:48:52.056Z",
      "commit": "b6b10b691c2de5c1316f1b619a2d840ebc1ddde8",
      "message": "v0.15.0 brings a Discover feed, a private watchlist and ratings, personal lists as their own rails, faster Now Playing, a cleaner setup flow, and episode names that always show.",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Discover - browse cached TMDB discovery rails for movies and TV with type and genre filters, plus direct actions from each result.",
        "Feature: Personal watchlist - keep your own list of movies, shows, and episodes without ever changing your canonical watch history.",
        "Feature: Personal ratings - rate titles privately; an optional Personal Rating Sync pushes and pulls ratings two-way with Plex, Emby, Jellyfin, and Trakt with Plembfin as the conflict authority.",
        "Feature: Custom lists - render every custom list you keep as its own horizontal rail with four fixed desktop rows and additional lists below.",
        "Feature: Ratings and Watchlist sync - each collapsed to a single on/off Settings toggle that syncs with every connected service.",
        "Feature: Up Next rail - a mixed queue of the movies and episodes to continue next; each card can remove itself through the provider's own endpoint.",
        "Feature: Sync Activity - every sync attempt grouped by movie or show with the full event history preserved, targeted Retry, and a Retry-all-failed background job.",
        "Feature: Now Playing - live sessions appear and disappear within seconds, opening the dashboard refreshes immediately, and resume progress no longer makes the cards flicker.",
        "Feature: Guided setup - a cleaner, centered first-run wizard that no longer requires a media server; title watching can carry you through on its own.",
        "Feature: Fix Match from restore - resume a blocked restore by re-matching an item that lost its saved provider identity.",
        "Feature: Mobile media pages - Discover, Watchlist, Ratings, Custom Lists, and History use the same poster-first rails as the dashboard on phones.",
        "Fix: Dashboard and history cards now show the real episode name stored on the watch record - a watch reported by a media server as only a coordinate gets its name resolved at ingest, and Database Repairs can backfill names onto older rows.",
        "Fix: Up Next no longer paints the same next-up episode twice and no longer merges a re-release or reboot that aired a different year; dismissing a tile animates it out before the rail refreshes.",
        "Fix: Fixed the app freezing for up to a minute, which also stalled every page and the background scheduler - building the Up Next rail now finishes in under a second.",
        "Fix: Now Playing no longer marks a still-playing session as stopped after one failed check, or after Plex switches video quality mid-playback.",
        "Fix: Sync Activity retries resolve in place instead of leaving a stale duplicate error, and unconfigured servers are reported as skipped rather than failed.",
        "Fix: Dashboard Continue Watching posters no longer reload whenever a playing item's resume progress updates.",
        "Fix: Prevented scheduled Jellyfin polling from incorrectly undoing watched state during sync.",
        "Fix: Plex state notifications are coalesced so one library action does not fan out into repeated work.",
        "Fix: Scheduled every-season episode fetches so a show with many seasons no longer holds its detail page open for 10+ seconds.",
        "Fix: Personal rating sync resolves provider identities and reads ratings with your authenticated provider account.",
        "Fix: Shared TV cache rebuilds across concurrent readers, keeping bursts of history changes from starving the live health check.",
        "Tweak: Personal Rating and Watchlist sync are each a single Settings toggle in one unified panel with status, queue, and provider recovery controls.",
        "Tweak: Since Plex is the only service that can hold an unplayed watchlist, the Emby and Jellyfin watchlist clients were removed.",
        "Tweak: Sidebar pinned to the viewport: footer stays visible below the nav, scroll stays vertical, and the scrollbar matches the theme.",
        "Tweak: Watch-history restore is authoritative and target-aware, treating expected missing-library items as non-blocking skips.",
        "Tweak: Split/combined episode numbering is canonicalized before dispatch; manual unwatches commit during restores.",
        "Tweak: Episode cards and notifications resolve through their exact parent show so deep links open the right series.",
        "Tweak: Up Next artwork prefers cached local posters and authenticated provider fallbacks.",
        "Tweak: Sync Activity lets you expand a group inline, jump to the media, and retry without leaving the page."
      ],
      "sections": {
        "newFeatures": [
          "Discover - browse cached TMDB discovery rails for movies and TV with type and genre filters, plus direct actions from each result.",
          "Personal watchlist - keep your own list of movies, shows, and episodes without ever changing your canonical watch history.",
          "Personal ratings - rate titles privately; an optional Personal Rating Sync pushes and pulls ratings two-way with Plex, Emby, Jellyfin, and Trakt with Plembfin as the conflict authority.",
          "Custom lists - render every custom list you keep as its own horizontal rail with four fixed desktop rows and additional lists below.",
          "Ratings and Watchlist sync - each collapsed to a single on/off Settings toggle that syncs with every connected service.",
          "Up Next rail - a mixed queue of the movies and episodes to continue next; each card can remove itself through the provider's own endpoint.",
          "Sync Activity - every sync attempt grouped by movie or show with the full event history preserved, targeted Retry, and a Retry-all-failed background job.",
          "Now Playing - live sessions appear and disappear within seconds, opening the dashboard refreshes immediately, and resume progress no longer makes the cards flicker.",
          "Guided setup - a cleaner, centered first-run wizard that no longer requires a media server; title watching can carry you through on its own.",
          "Fix Match from restore - resume a blocked restore by re-matching an item that lost its saved provider identity.",
          "Mobile media pages - Discover, Watchlist, Ratings, Custom Lists, and History use the same poster-first rails as the dashboard on phones."
        ],
        "majorBugFixes": [
          "Dashboard and history cards now show the real episode name stored on the watch record - a watch reported by a media server as only a coordinate gets its name resolved at ingest, and Database Repairs can backfill names onto older rows.",
          "Up Next no longer paints the same next-up episode twice and no longer merges a re-release or reboot that aired a different year; dismissing a tile animates it out before the rail refreshes.",
          "Fixed the app freezing for up to a minute, which also stalled every page and the background scheduler - building the Up Next rail now finishes in under a second.",
          "Now Playing no longer marks a still-playing session as stopped after one failed check, or after Plex switches video quality mid-playback.",
          "Sync Activity retries resolve in place instead of leaving a stale duplicate error, and unconfigured servers are reported as skipped rather than failed.",
          "Dashboard Continue Watching posters no longer reload whenever a playing item's resume progress updates.",
          "Prevented scheduled Jellyfin polling from incorrectly undoing watched state during sync.",
          "Plex state notifications are coalesced so one library action does not fan out into repeated work.",
          "Scheduled every-season episode fetches so a show with many seasons no longer holds its detail page open for 10+ seconds.",
          "Personal rating sync resolves provider identities and reads ratings with your authenticated provider account.",
          "Shared TV cache rebuilds across concurrent readers, keeping bursts of history changes from starving the live health check."
        ],
        "tweaks": [
          "Personal Rating and Watchlist sync are each a single Settings toggle in one unified panel with status, queue, and provider recovery controls.",
          "Since Plex is the only service that can hold an unplayed watchlist, the Emby and Jellyfin watchlist clients were removed.",
          "Sidebar pinned to the viewport: footer stays visible below the nav, scroll stays vertical, and the scrollbar matches the theme.",
          "Watch-history restore is authoritative and target-aware, treating expected missing-library items as non-blocking skips.",
          "Split/combined episode numbering is canonicalized before dispatch; manual unwatches commit during restores.",
          "Episode cards and notifications resolve through their exact parent show so deep links open the right series.",
          "Up Next artwork prefers cached local posters and authenticated provider fallbacks.",
          "Sync Activity lets you expand a group inline, jump to the media, and retry without leaving the page."
        ]
      }
    },
    {
      "version": "0.14.0",
      "version5Digit": "0.14.0.0.0",
      "date": "2026-08-29T11:03:29.670Z",
      "commit": "91f2e63746b8626f78d12fc7c38971efb3fc636c",
      "message": "Fix - Compute changelog content locally instead of via unreliable CI push events",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Add saving-state feedback for episode watch actions and changelog release-process filtering",
        "Feature: Episode tiles pulse with a \"Syncing...\" overlay while marking watched/unwatched is in flight, including collapsed season accordion headers during whole-show or whole-season bulk actions",
        "Feature: Marking unwatched from the show control bar now batches requests in groups of 100, fixing shows with more than 100 watched episodes silently failing with no explanation",
        "Feature: The poster three-dot overflow menu (Mark Unwatched / Edit watch date / Fix match) now appears on TV show library cards and stays legible in light mode instead of rendering as dark-on-dark dots",
        "Fix: Compute changelog content locally instead of via unreliable CI push events",
        "Fix: Changelog content for develop, alpha, and main is now generated locally as part of running Push to git / Force to alpha / Force to main, using real git history, instead of a CI job reading GitHub's push-event commit list afterward - that list is empty or incomplete for alpha and main, which are always reached by a force-push, and was producing changelog entries with no real content",
        "Fix: Alpha and develop each keep a single current changelog entry that stays up to date automatically, instead of accumulating one entry per push that needed manual editing before release - Settings -> About now shows one current entry instead of a stack of build entries",
        "Fix: Alpha and main changelog generation now refuses to publish an entry whose only available content is a noise commit message (a bot bump or a plain merge commit), so a broken changelog entry can no longer reach Settings -> Changelog or the Discord release notification",
        "Fix: Removed the unused scripts/notify-reddit-release.js - Reddit release announcements are actually posted by a separate scheduled Devvit app (reddit-app/), which was already the real mechanism",
        "Fix: Batch watch-state dispatch by media identity",
        "Fix: Marking an entire show as watched now excludes Season 0 specials by default",
        "Fix: The watched-date dialog shows an Include specials (Season 0) checkbox, unchecked by default, to opt them back in",
        "Fix: Batch related watch-state updates by shared media identity to make large syncs safer and avoid duplicate provider work."
      ],
      "sections": {
        "newFeatures": [
          "Add saving-state feedback for episode watch actions and changelog release-process filtering",
          "Episode tiles pulse with a \"Syncing...\" overlay while marking watched/unwatched is in flight, including collapsed season accordion headers during whole-show or whole-season bulk actions",
          "Marking unwatched from the show control bar now batches requests in groups of 100, fixing shows with more than 100 watched episodes silently failing with no explanation",
          "The poster three-dot overflow menu (Mark Unwatched / Edit watch date / Fix match) now appears on TV show library cards and stays legible in light mode instead of rendering as dark-on-dark dots"
        ],
        "majorBugFixes": [
          "Compute changelog content locally instead of via unreliable CI push events",
          "Changelog content for develop, alpha, and main is now generated locally as part of running Push to git / Force to alpha / Force to main, using real git history, instead of a CI job reading GitHub's push-event commit list afterward - that list is empty or incomplete for alpha and main, which are always reached by a force-push, and was producing changelog entries with no real content",
          "Alpha and develop each keep a single current changelog entry that stays up to date automatically, instead of accumulating one entry per push that needed manual editing before release - Settings -> About now shows one current entry instead of a stack of build entries",
          "Alpha and main changelog generation now refuses to publish an entry whose only available content is a noise commit message (a bot bump or a plain merge commit), so a broken changelog entry can no longer reach Settings -> Changelog or the Discord release notification",
          "Removed the unused scripts/notify-reddit-release.js - Reddit release announcements are actually posted by a separate scheduled Devvit app (reddit-app/), which was already the real mechanism",
          "Batch watch-state dispatch by media identity",
          "Marking an entire show as watched now excludes Season 0 specials by default",
          "The watched-date dialog shows an Include specials (Season 0) checkbox, unchecked by default, to opt them back in",
          "Batch related watch-state updates by shared media identity to make large syncs safer and avoid duplicate provider work."
        ],
        "tweaks": []
      }
    },
    {
      "version": "0.12.12",
      "date": "2026-08-28T19:52:20+01:00",
      "commit": "0535357efa1dcd3c68d035aa17e2d4d464df6e2a",
      "message": "Docs - Consolidate v0.12.11 changelog entry into higher-level bullets",
      "author": "Lasikiewicz",
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [],
        "tweaks": [
          "Consolidate v0.12.11 changelog entry into higher-level bullets",
          "Dropped a redundant Major Bug Fixes bullet that just restated the release's commit subject"
        ]
      },
      "details": [
        "Dropped a redundant Major Bug Fixes bullet that just restated the release's commit subject"
      ]
    },
    {
      "version": "0.12.11",
      "date": "2026-08-28T18:46:22Z",
      "commit": "a42fa9febfdc0ef4613d1799eef58a7dc84de976",
      "message": "Fix - TV show detail and grid bulk-watch fixes",
      "author": "github-actions[bot]",
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [
          "Restore the missing three-dot overflow menu on TV Shows grid cards",
          "Season list rows now show Saving while a bulk watch action is in progress instead of a stale watched count",
          "Marking a season or whole show as watched no longer marks episodes that haven't aired yet"
        ],
        "tweaks": [
          "Consolidate changelog entries at every promotion stage",
          "Push to git now squashes any pending local commits into one clean commit before pushing, so bloat never enters changelog.develop.json in the first place",
          "Force to alpha now reviews the CI-merged alpha changelog entry and tightens it if redundant, since it does not deduplicate bullets on its own",
          "Force to main now reviews the freshly generated release changelog entry the same way before syncing back to develop, formalizing the correction v0.12.9 needed by hand"
        ]
      },
      "details": [
        "Push to git now squashes any pending local commits into one clean commit before pushing, so bloat never enters changelog.develop.json in the first place",
        "Force to alpha now reviews the CI-merged alpha changelog entry and tightens it if redundant, since it does not deduplicate bullets on its own",
        "Force to main now reviews the freshly generated release changelog entry the same way before syncing back to develop, formalizing the correction v0.12.9 needed by hand",
        "Restore the missing three-dot overflow menu on TV Shows grid cards",
        "Season list rows now show Saving while a bulk watch action is in progress instead of a stale watched count",
        "Marking a season or whole show as watched no longer marks episodes that haven't aired yet"
      ]
    },
    {
      "version": "0.12.10",
      "date": "2026-08-28T18:57:42+01:00",
      "commit": "10d4713d7bc693593e17199eb8bb5393e61c2521",
      "message": "Docs - Consolidate v0.12.9 changelog entry into higher-level bullets",
      "author": "Lasikiewicz",
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [],
        "tweaks": [
          "Consolidate v0.12.9 changelog entry into higher-level bullets",
          "The auto-generated New Features section had 38 near-duplicate bullets (each commit's subject line plus its own detail bullets, all flattened together)",
          "Consolidated to 6 bullets covering the actual distinct efforts: Settings redesign, Media Servers panels, Webhooks split, Backup/Restore redesign, section URL renames, and Wipe Data",
          "Trimmed Major Bug Fixes and Tweaks the same way",
          "Regenerated CHANGELOG.md from the corrected changelog.json"
        ]
      },
      "details": [
        "The auto-generated New Features section had 38 near-duplicate bullets (each commit's subject line plus its own detail bullets, all flattened together)",
        "Consolidated to 6 bullets covering the actual distinct efforts: Settings redesign, Media Servers panels, Webhooks split, Backup/Restore redesign, section URL renames, and Wipe Data",
        "Trimmed Major Bug Fixes and Tweaks the same way",
        "Regenerated CHANGELOG.md from the corrected changelog.json"
      ]
    },
    {
      "version": "0.12.9",
      "date": "2026-08-28T17:31:32Z",
      "commit": "73cf1c20b0dd25e3f16cb512a864ececd2599afb",
      "message": "Feature - Add Wipe Data tools section and simplify settings help text",
      "author": "github-actions[bot]",
      "sections": {
        "newFeatures": [
          "Redesigned the Settings pages: single-column landing groups, consistent card backgrounds, and unified text sizing, with Guided Setup moved under Tools",
          "Media Servers now shows Plex, Emby, and Jellyfin as separate always-visible connection panels instead of a shared modal, and Seerr moved into the Connections group",
          "Webhooks split into its own group with a Setup Guides section and a separate Webhook Secret section",
          "Backup and Restore were redesigned and split into two top-level groups, each with Local and Remote sections, clearer restore-mode names (Merge/Replace into existing state), and a new Remote Plembfin Restore option",
          "Every settings section's URL now matches its sidebar label, with redirects kept for old bookmarks",
          "Added a Wipe Data section under Settings - Tools with four scopes (Watch History, Sync History & Logs, Everything Tracked, Wipe All / Fresh Start), and simplified the help text across every Settings page"
        ],
        "majorBugFixes": [
          "Settings child section URLs now correctly match their sidebar labels, fixing stale internal ids like #import and #health leaking into the address bar",
          "Fixed the Restore page's Local/Remote cards falling back to generic padding instead of matching the Backup page's cards"
        ],
        "tweaks": [
          "Added backlog items for alternative tracker sync (Letterboxd/Simkl) and an mdblist metadata source, both requested via Reddit"
        ]
      },
      "details": [
        "Redesigned the Settings pages: single-column landing groups, consistent card backgrounds, and unified text sizing, with Guided Setup moved under Tools",
        "Media Servers now shows Plex, Emby, and Jellyfin as separate always-visible connection panels instead of a shared modal, and Seerr moved into the Connections group",
        "Webhooks split into its own group with a Setup Guides section and a separate Webhook Secret section",
        "Backup and Restore were redesigned and split into two top-level groups, each with Local and Remote sections, clearer restore-mode names (Merge/Replace into existing state), and a new Remote Plembfin Restore option",
        "Every settings section's URL now matches its sidebar label, with redirects kept for old bookmarks",
        "Added a Wipe Data section under Settings - Tools with four scopes (Watch History, Sync History & Logs, Everything Tracked, Wipe All / Fresh Start), and simplified the help text across every Settings page",
        "Settings child section URLs now correctly match their sidebar labels, fixing stale internal ids like #import and #health leaking into the address bar",
        "Fixed the Restore page's Local/Remote cards falling back to generic padding instead of matching the Backup page's cards",
        "Added backlog items for alternative tracker sync (Letterboxd/Simkl) and an mdblist metadata source, both requested via Reddit"
      ]
    },
    {
      "version": "0.12.8",
      "date": "2026-08-27T15:52:07Z",
      "commit": "1879fbc7202ca1c67943f1052902b069c6acc749",
      "message": "Feature - Background metadata refresh jobs, onboarding sidebar reminder, and Reddit release bot",
      "author": "github-actions[bot]",
      "sections": {
        "newFeatures": [
          "Background metadata refresh jobs, onboarding sidebar reminder, and Reddit release bot",
          "TMDB and TVDB Refresh Metadata now run as cancellable background jobs that survive closing Settings, navigating away, or reloading the page, instead of a client-driven paginated loop",
          "Replaced onboarding's forced redirect to /setup with a persistent, dismissible \"Complete onboarding\" sidebar reminder shown until a media server is connected and tested",
          "Added a \"Restore from backup\" shortcut to the setup wizard's overview step, reusing the same local-upload and Backblaze B2 restore tools already in Settings -> Backups",
          "Fixed Fix Match on an episode's poster menu prefilling the episode's own title instead of the show's title in the rematch search box",
          "Fixed the Settings -> Backups -> Restore tab appearing empty after leaving the onboarding wizard's restore flow partway through",
          "Added a Devvit app (reddit-app/) that posts and pins a release announcement to r/plembfin on a schedule, since Reddit declined script-app Data API access for this use case and recommended Devvit instead"
        ],
        "majorBugFixes": [],
        "tweaks": []
      },
      "details": [
        "TMDB and TVDB Refresh Metadata now run as cancellable background jobs that survive closing Settings, navigating away, or reloading the page, instead of a client-driven paginated loop",
        "Replaced onboarding's forced redirect to /setup with a persistent, dismissible \"Complete onboarding\" sidebar reminder shown until a media server is connected and tested",
        "Added a \"Restore from backup\" shortcut to the setup wizard's overview step, reusing the same local-upload and Backblaze B2 restore tools already in Settings -> Backups",
        "Fixed Fix Match on an episode's poster menu prefilling the episode's own title instead of the show's title in the rematch search box",
        "Fixed the Settings -> Backups -> Restore tab appearing empty after leaving the onboarding wizard's restore flow partway through",
        "Added a Devvit app (reddit-app/) that posts and pins a release announcement to r/plembfin on a schedule, since Reddit declined script-app Data API access for this use case and recommended Devvit instead"
      ]
    },
    {
      "version": "0.12.7",
      "date": "2026-08-27T15:39:02+01:00",
      "commit": "1cafdc408cbad1c91941d5d0b0049502d0f41072",
      "message": "Merge pull request #23 from Lasikiewicz/dependabot/github_actions/github/codeql-action-4.37.8",
      "author": "Lasikiewicz",
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [],
        "tweaks": [
          "Merge pull request #23 from Lasikiewicz/dependabot/github_actions/github/codeql-action-4.37.8"
        ]
      },
      "details": [
        "Merge pull request #23 from Lasikiewicz/dependabot/github_actions/github/codeql-action-4.37.8"
      ]
    },
    {
      "version": "0.12.6",
      "date": "2026-08-27T14:29:03Z",
      "commit": "4ff9bb0011f8ef4d36ba3a1a7b9cb6a5f46f1fee",
      "message": "Docs - Check GHCR Cleanup isn't running before any push",
      "author": "github-actions[bot]",
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [
          "Stop updateWatchRecord's playstate rollback timing from racing",
          "The known-flaky test (updateWatchRecord rolls the old media_key's playstate back to a survivor) was exposing a real bug, not just test noise: getPlaystateForMediaSync's title-based fallback can surface either an old or a migrated media_key's playstate row for a shared title, and updateWatchRecord picked between them with fresh Date.now() calls a few statements apart",
          "When enough intervening work crossed a millisecond boundary, the newer write's timestamp would non-deterministically outrank the correct rolled-back row, so a Fix Match correction on a title-duplicate item could report the wrong watched state for the leftover, uncorrected identity",
          "Reused the single updatedAt timestamp already captured for the row update across every playstate write in the same updateWatchRecord call (both the watched_at date-edit path and the identity-change rollback path), removing the timing dependency entirely",
          "Verified with 40 back-to-back isolated runs of the previously-flaky test (0 failures, versus roughly 1-in-10 before) plus a full clean test suite run"
        ],
        "tweaks": [
          "Check GHCR Cleanup isn't running before any push",
          "Added a precondition to Push to git, Force to alpha, and Force to main: verify ghcr-cleanup.yml isn't mid-run first, since it deletes images from the same GHCR package every push publishes new tags to and its own docs warn against running it in parallel against the same package"
        ]
      },
      "details": [
        "The known-flaky test (updateWatchRecord rolls the old media_key's playstate back to a survivor) was exposing a real bug, not just test noise: getPlaystateForMediaSync's title-based fallback can surface either an old or a migrated media_key's playstate row for a shared title, and updateWatchRecord picked between them with fresh Date.now() calls a few statements apart",
        "When enough intervening work crossed a millisecond boundary, the newer write's timestamp would non-deterministically outrank the correct rolled-back row, so a Fix Match correction on a title-duplicate item could report the wrong watched state for the leftover, uncorrected identity",
        "Reused the single updatedAt timestamp already captured for the row update across every playstate write in the same updateWatchRecord call (both the watched_at date-edit path and the identity-change rollback path), removing the timing dependency entirely",
        "Verified with 40 back-to-back isolated runs of the previously-flaky test (0 failures, versus roughly 1-in-10 before) plus a full clean test suite run",
        "Added a precondition to Push to git, Force to alpha, and Force to main: verify ghcr-cleanup.yml isn't mid-run first, since it deletes images from the same GHCR package every push publishes new tags to and its own docs warn against running it in parallel against the same package"
      ]
    },
    {
      "version": "0.12.5",
      "date": "2026-08-27T13:42:25Z",
      "commit": "84b83978d784519e6043b40002d01ada8f4eea98",
      "message": "Chore - Bump alpha build for f3f3d9b",
      "author": "github-actions[bot]",
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [],
        "tweaks": [
          "Bump alpha build for f3f3d9b"
        ]
      },
      "details": [
        "Chore - Bump alpha build for f3f3d9b"
      ]
    },
    {
      "version": "0.12.4",
      "date": "2026-08-27T13:27:03Z",
      "commit": "a1bf56443092053b8c1d59d396d9c03fcf46e2d3",
      "message": "Fix - Publish the release image in the same job that commits the changelog",
      "author": "github-actions[bot]",
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [
          "Publish the release image in the same job that commits the changelog",
          "The prior split (a separate publish-current job gated on the changelog-bump commit re-arriving as a trigger) never actually ran: a commit pushed with the default GITHUB_TOKEN doesn't trigger another workflow run, so this release's 0.12.3 image was never built or pushed to GHCR at all",
          "Moved the Docker build/push and Discord notification back into the same job that writes and commits the changelog, so every push to main reliably publishes exactly one image",
          "Manually published 0.12.3 as a one-off stopgap via the existing workflow_dispatch build so the current release isn't left without an image",
          "Corrected docs/development.md to describe the single-job flow"
        ],
        "tweaks": []
      },
      "details": [
        "The prior split (a separate publish-current job gated on the changelog-bump commit re-arriving as a trigger) never actually ran: a commit pushed with the default GITHUB_TOKEN doesn't trigger another workflow run, so this release's 0.12.3 image was never built or pushed to GHCR at all",
        "Moved the Docker build/push and Discord notification back into the same job that writes and commits the changelog, so every push to main reliably publishes exactly one image",
        "Manually published 0.12.3 as a one-off stopgap via the existing workflow_dispatch build so the current release isn't left without an image",
        "Corrected docs/development.md to describe the single-job flow"
      ]
    },
    {
      "version": "0.12.3",
      "date": "2026-08-27T13:07:48Z",
      "commit": "6db8658b650ea85a0583b0b6907c5ba414d07cc8",
      "message": "Docs - Refresh dashboard, media, and stats screenshots; add Sync Activity",
      "author": "github-actions[bot]",
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [
          "Stop duplicate release image builds and add GHCR tag cleanup",
          "Fixed the release pipeline building and pushing the Docker image to GHCR twice per push to main; only the final job (which runs against the already-committed changelog/version bump) now builds and publishes it",
          "Added a weekly scheduled workflow that prunes old numbered develop-* and alpha-* image tags (keeping the newest 15 of each) and deletes dangling untagged images left behind when the latest/develop/alpha tags move",
          "The cleanup workflow starts in dry-run mode so nothing is deleted until a run has been reviewed",
          "Documented both changes in docs/development.md",
          "Restore the test suite to git tracking",
          "Removed test/ from .gitignore; it was added in commit 3d5b85b4 at the same time all 89 test files were deleted from git tracking, so the suite has existed only on local machines since - a fresh clone or CI checkout had zero test files, and npm run build's node --test step was silently running against nothing while still reporting success",
          "Re-added all 93 files currently under test/ (91 test files plus shared helpers) so the suite ships with the repo again and CI actually exercises it"
        ],
        "tweaks": [
          "Refresh dashboard, media, and stats screenshots; add Sync Activity",
          "Replaced the now-playing, media, and stats screenshots with current captures of the app",
          "Added a new Sync Activity screenshot and README entry, matching the existing Sync Activity hub feature",
          "Move settings layout conventions into docs/frontend.md",
          "Moved the orphaned root-level 'layout defaults.md' into docs/frontend.md as a new Settings Card Shell section, since it wasn't linked from any doc index",
          "Corrected docs/frontend.md's settings-card padding claim while merging: the base .settings-card padding: 1.5rem rule only applies to help-column cards, since a more specific selector overrides it to 0 for any card inside the main column (which is what layout defaults.md was actually describing)"
        ]
      },
      "details": [
        "Fixed the release pipeline building and pushing the Docker image to GHCR twice per push to main; only the final job (which runs against the already-committed changelog/version bump) now builds and publishes it",
        "Added a weekly scheduled workflow that prunes old numbered develop-* and alpha-* image tags (keeping the newest 15 of each) and deletes dangling untagged images left behind when the latest/develop/alpha tags move",
        "The cleanup workflow starts in dry-run mode so nothing is deleted until a run has been reviewed",
        "Documented both changes in docs/development.md",
        "Removed test/ from .gitignore; it was added in commit 3d5b85b4 at the same time all 89 test files were deleted from git tracking, so the suite has existed only on local machines since - a fresh clone or CI checkout had zero test files, and npm run build's node --test step was silently running against nothing while still reporting success",
        "Re-added all 93 files currently under test/ (91 test files plus shared helpers) so the suite ships with the repo again and CI actually exercises it",
        "Moved the orphaned root-level 'layout defaults.md' into docs/frontend.md as a new Settings Card Shell section, since it wasn't linked from any doc index",
        "Corrected docs/frontend.md's settings-card padding claim while merging: the base .settings-card padding: 1.5rem rule only applies to help-column cards, since a more specific selector overrides it to 0 for any card inside the main column (which is what layout defaults.md was actually describing)",
        "Replaced the now-playing, media, and stats screenshots with current captures of the app",
        "Added a new Sync Activity screenshot and README entry, matching the existing Sync Activity hub feature"
      ]
    },
    {
      "version": "0.12.2",
      "date": "2026-08-27T12:12:12Z",
      "commit": "031364d8824184e4899c16c9caab832c8db5c7eb",
      "message": "Docs - Link Discord and Reddit communities in README",
      "author": "github-actions[bot]",
      "sections": {
        "newFeatures": [
          "Post release and alpha-build changelogs to a Discord channel",
          "New scripts/notify-discord-release.js posts a Discord embed built from the newest changelog.json (main releases) or changelog.alpha.json (alpha builds) entry",
          "Update-changelog.yml and docker-publish-alpha.yml each call the script as their final step, using a DISCORD_RELEASES_WEBHOOK repo secret",
          "No-ops quietly with no failing build when the secret isn't set, so forks and clones without it configured are unaffected",
          "Supports a --dry-run flag that prints the embed instead of posting, for checking formatting without a webhook",
          "Documented the new step and the required secret in docs/development.md"
        ],
        "majorBugFixes": [],
        "tweaks": [
          "Link Discord and Reddit communities in README",
          "Added Discord and Reddit links to the top navigation row",
          "Added a Community section linking to the Discord server and r/plembfin subreddit"
        ]
      },
      "details": [
        "New scripts/notify-discord-release.js posts a Discord embed built from the newest changelog.json (main releases) or changelog.alpha.json (alpha builds) entry",
        "update-changelog.yml and docker-publish-alpha.yml each call the script as their final step, using a DISCORD_RELEASES_WEBHOOK repo secret",
        "No-ops quietly with no failing build when the secret isn't set, so forks and clones without it configured are unaffected",
        "Supports a --dry-run flag that prints the embed instead of posting, for checking formatting without a webhook",
        "Documented the new step and the required secret in docs/development.md",
        "Added Discord and Reddit links to the top navigation row",
        "Added a Community section linking to the Discord server and r/plembfin subreddit"
      ]
    },
    {
      "version": "0.12.1",
      "date": "2026-08-27T08:19:42Z",
      "commit": "6c5fc75f8a9d4a358f882e09c7071d69d3688bfa",
      "message": "Fix - Correct rewatch and Plex echo sync bugs, clarify webhook setup",
      "author": "github-actions[bot]",
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [
          "Correct rewatch and Plex echo sync bugs, clarify webhook setup",
          "Fixed a bug where rewatching a show on a new day could be silently discarded and left showing a stale watch date instead of recording the new watch",
          "Fixed a bug where marking an item unwatched in Plembfin could be immediately overwritten by a delayed \"still watched\" signal echoed back from Plex",
          "Settings and onboarding now correctly show Plex needs no manual webhook setup, and add a warning to disable Plex's \"Refresh library metadata periodically\" scheduled task, which can otherwise reset watched state during its own maintenance window",
          "Fixed the Emby webhook setup instructions, which pointed to the wrong menu path",
          "Onboarding now shows the Emby and Jellyfin webhook setup guides even before those servers are connected, and shows the same Trakt \"sole bridge\" warning already shown in Settings",
          "Added a \"Required\" badge to the TMDB metadata card during onboarding",
          "Removed the raw webhook URL and background scheduler endpoint displays from Settings; the webhook URL is now shown inline within each platform's own setup guide"
        ],
        "tweaks": []
      },
      "details": [
        "Fixed a bug where rewatching a show on a new day could be silently discarded and left showing a stale watch date instead of recording the new watch",
        "Fixed a bug where marking an item unwatched in Plembfin could be immediately overwritten by a delayed \"still watched\" signal echoed back from Plex",
        "Settings and onboarding now correctly show Plex needs no manual webhook setup, and add a warning to disable Plex's \"Refresh library metadata periodically\" scheduled task, which can otherwise reset watched state during its own maintenance window",
        "Fixed the Emby webhook setup instructions, which pointed to the wrong menu path",
        "Onboarding now shows the Emby and Jellyfin webhook setup guides even before those servers are connected, and shows the same Trakt \"sole bridge\" warning already shown in Settings",
        "Added a \"Required\" badge to the TMDB metadata card during onboarding",
        "Removed the raw webhook URL and background scheduler endpoint displays from Settings; the webhook URL is now shown inline within each platform's own setup guide"
      ]
    },
    {
      "version": "0.12.0",
      "date": "2026-08-26T18:44:05Z",
      "commit": "6c6b5e0baf7400a34ac1adb94f732f870f73a805",
      "message": "Feature - Filter Sync Activity to failed items and fix dispatch telemetry accuracy",
      "author": "github-actions[bot]",
      "sections": {
        "newFeatures": [
          "Filter Sync Activity to failed items and fix dispatch telemetry accuracy",
          "Add a click-to-filter toggle on the Sync Activity failed-count pill so it shows only failed rows on the current page, click again to restore the full page",
          "Show the real dispatch outcome in a background-queue retry's telemetry instead of a generic \"sync completed\" message regardless of what actually happened",
          "Correct the published v0.11.2 changelog entry to describe the guided onboarding release and use the New Features / Major Bug Fixes / Tweaks grouped layout instead of a flat, mistitled bullet list"
        ],
        "majorBugFixes": [
          "Fix target-status telemetry lines prefixed with \"Target \" (written by the scheduled background queue) that the Sync Activity parser was silently failing to match, leaving target results blank"
        ],
        "tweaks": []
      },
      "details": [
        "Add a click-to-filter toggle on the Sync Activity failed-count pill so it shows only failed rows on the current page, click again to restore the full page",
        "Fix target-status telemetry lines prefixed with \"Target \" (written by the scheduled background queue) that the Sync Activity parser was silently failing to match, leaving target results blank",
        "Show the real dispatch outcome in a background-queue retry's telemetry instead of a generic \"sync completed\" message regardless of what actually happened",
        "Correct the published v0.11.2 changelog entry to describe the guided onboarding release and use the New Features / Major Bug Fixes / Tweaks grouped layout instead of a flat, mistitled bullet list"
      ]
    },
    {
      "version": "0.11.3",
      "date": "2026-08-26T19:23:03+01:00",
      "commit": "bb0326b8a955c1659dd090f1e4e4b2966dabc4e4",
      "message": "Chore - Retrigger release CI after GitHub Actions incident",
      "author": "Lasikiewicz",
      "sections": {
        "newFeatures": [],
        "majorBugFixes": [
          "Group main release changelog entries by impact",
          "Settings -> Changelog and the generated CHANGELOG.md now sort a new main release's bullet points into New Features, Major Bug Fixes, and Tweaks sections instead of one flat list",
          "Documented the section-grouping behavior in the release pipeline and architecture docs"
        ],
        "tweaks": [
          "Retrigger release CI after GitHub Actions incident"
        ]
      },
      "details": [
        "Settings -> Changelog and the generated CHANGELOG.md now sort a new main release's bullet points into New Features, Major Bug Fixes, and Tweaks sections instead of one flat list",
        "Documented the section-grouping behavior in the release pipeline and architecture docs",
        "Chore - Retrigger release CI after GitHub Actions incident"
      ]
    },
    {
      "version": "0.11.2",
      "date": "2026-08-26T15:27:54+01:00",
      "commit": "73f1ddf9d32be8ab8d48542a4e424734d25890a9",
      "message": "Feature - Guided onboarding and faster in-place media management",
      "author": "Lasikiewicz",
      "details": [
        "Feature: Add guided setup and harden media sync",
        "Feature: Add one-time administrator claim and a resumable guided setup flow for pristine installs",
        "Feature: Add safe background library imports, setup status UI, and managed connection recovery",
        "Feature: Keep movie pages responsive across large multi-tab batches and preserve legacy unwatched links",
        "Feature: Support browser-native middle-click navigation from the sidebar",
        "Feature: Refresh watched dates and unwatch actions immediately after successful changes",
        "Feature: Clarify Trakt import progress and settle terminal partial or skipped dispatches",
        "Feature: Stop tracking the local test directory and add it to gitignore",
        "Feature: Add poster three-dot overflow menu and fix live-update scroll resets",
        "Feature: Added a three-dot overflow button on hover for every poster card outside the media detail pages, offering Edit watch date, Fix match, and Mark unwatched",
        "Feature: Marking an item unwatched from the grid now dims the card with a Removing animation and removes it in place instead of reloading the whole page and jumping back to the top",
        "Feature: Fixing a match from the grid menu now updates the card in place instead of opening the media detail page",
        "Feature: Live updates from Trakt, other devices, or background syncs now refresh the Movies and History grids in place instead of resetting them to the top",
        "Feature: Fixed posters that could get stuck on their loading placeholder if their card scrolled into view after the page's data had already loaded",
        "Feature: Movies page data now always bypasses the browser cache so a mutation is reflected immediately instead of for up to five minutes",
        "Feature: Failed or skipped sync destinations in the Sync Activity list can now be retried individually",
        "Feature: Unwatch detection during scheduled sync now tracks when Plembfin last learned about a watch record instead of relying on the media's reported watched date, so newly received watches are not missed by the safety net",
        "Feature: Group release notes by impact",
        "Feature: Show New Features, Major Bug Fixes, and Tweaks as distinct sections in the app and generated changelog.",
        "Feature: Preserve maintenance and documentation notes during branch promotion instead of dropping them when features or fixes are present.",
        "Fix: Merge cross-app episode history cards",
        "Fix: Merge same-episode history records across apps into one dashboard card and show every contributing source.",
        "Fix: Dedupe platform source badges",
        "Fix: Collapse Plex aliases to one app badge and refresh cached dashboard assets.",
        "Fix: Correct plembfin badges and app icons",
        "Fix: Keep Plembfin-marked watches distinct from Plex in dashboard badges.",
        "Fix: Use transparent trimmed Plembfin app icons with a white-P dark variant.",
        "Fix: Use white logo in PWA icons",
        "Fix: Use the white Plembfin mark in the 512px and maskable app icons, with cache-busted manifest URLs.",
        "Fix: Use white plembfin badge icon",
        "Fix: Replace the legacy dark badge artwork with the trimmed white Plembfin mark and refresh its browser cache key.",
        "Fix: Size theme-aware plembfin badges",
        "Fix: Use cropped dark-P and white-P badge assets for light and dark themes.",
        "Fix: Show all watch source badges on episode details",
        "Fix: Match episode watch badges to the dashboard's aggregated app sources.",
        "Fix: Hide manual badge beside app sources",
        "Fix: Keep Plembfin visible only for standalone manual watch records.",
        "Fix: Align backup setup fields with guide",
        "Fix: Group Backblaze bucket and application-key inputs beside their matching setup instructions, with responsive stacking on narrow screens.",
        "Fix: Remove broken bio media layout",
        "Fix: Remove the Bio Layout appearance option and always use the stable standard media detail layout.",
        "Fix: Expand media backdrops to cover the full viewport without fading completely away at the edges.",
        "Tweak: Update onboarding plan with architectural and security recommendations",
        "Tweak: Refine onboarding plan with pristine account claiming, concurrent background import coordination, and push sync guardrails.",
        "Tweak: Documentation updated for the new poster overflow menu, in-place grid refresh behavior, sync activity retry, and the Plex WebSocket metadata merge behind unwatch detection",
        "Tweak: Update full setup guide",
        "Tweak: Document the eight-stage onboarding flow, including Trakt-first imports, webhook setup, encrypted backups, and inline Backblaze fields."
      ],
      "sections": {
        "newFeatures": [
          "Add guided setup and harden media sync",
          "Add one-time administrator claim and a resumable guided setup flow for pristine installs",
          "Add safe background library imports, setup status UI, and managed connection recovery",
          "Keep movie pages responsive across large multi-tab batches and preserve legacy unwatched links",
          "Support browser-native middle-click navigation from the sidebar",
          "Refresh watched dates and unwatch actions immediately after successful changes",
          "Clarify Trakt import progress and settle terminal partial or skipped dispatches",
          "Stop tracking the local test directory and add it to gitignore",
          "Add poster three-dot overflow menu and fix live-update scroll resets",
          "Added a three-dot overflow button on hover for every poster card outside the media detail pages, offering Edit watch date, Fix match, and Mark unwatched",
          "Marking an item unwatched from the grid now dims the card with a Removing animation and removes it in place instead of reloading the whole page and jumping back to the top",
          "Fixing a match from the grid menu now updates the card in place instead of opening the media detail page",
          "Live updates from Trakt, other devices, or background syncs now refresh the Movies and History grids in place instead of resetting them to the top",
          "Fixed posters that could get stuck on their loading placeholder if their card scrolled into view after the page's data had already loaded",
          "Movies page data now always bypasses the browser cache so a mutation is reflected immediately instead of for up to five minutes",
          "Failed or skipped sync destinations in the Sync Activity list can now be retried individually",
          "Unwatch detection during scheduled sync now tracks when Plembfin last learned about a watch record instead of relying on the media's reported watched date, so newly received watches are not missed by the safety net",
          "Group release notes by impact",
          "Show New Features, Major Bug Fixes, and Tweaks as distinct sections in the app and generated changelog.",
          "Preserve maintenance and documentation notes during branch promotion instead of dropping them when features or fixes are present."
        ],
        "majorBugFixes": [
          "Merge cross-app episode history cards",
          "Merge same-episode history records across apps into one dashboard card and show every contributing source.",
          "Dedupe platform source badges",
          "Collapse Plex aliases to one app badge and refresh cached dashboard assets.",
          "Correct plembfin badges and app icons",
          "Keep Plembfin-marked watches distinct from Plex in dashboard badges.",
          "Use transparent trimmed Plembfin app icons with a white-P dark variant.",
          "Use white logo in PWA icons",
          "Use the white Plembfin mark in the 512px and maskable app icons, with cache-busted manifest URLs.",
          "Use white plembfin badge icon",
          "Replace the legacy dark badge artwork with the trimmed white Plembfin mark and refresh its browser cache key.",
          "Size theme-aware plembfin badges",
          "Use cropped dark-P and white-P badge assets for light and dark themes.",
          "Show all watch source badges on episode details",
          "Match episode watch badges to the dashboard's aggregated app sources.",
          "Hide manual badge beside app sources",
          "Keep Plembfin visible only for standalone manual watch records.",
          "Align backup setup fields with guide",
          "Group Backblaze bucket and application-key inputs beside their matching setup instructions, with responsive stacking on narrow screens.",
          "Remove broken bio media layout",
          "Remove the Bio Layout appearance option and always use the stable standard media detail layout.",
          "Expand media backdrops to cover the full viewport without fading completely away at the edges."
        ],
        "tweaks": [
          "Update onboarding plan with architectural and security recommendations",
          "Refine onboarding plan with pristine account claiming, concurrent background import coordination, and push sync guardrails.",
          "Documentation updated for the new poster overflow menu, in-place grid refresh behavior, sync activity retry, and the Plex WebSocket metadata merge behind unwatch detection",
          "Update full setup guide",
          "Document the eight-stage onboarding flow, including Trakt-first imports, webhook setup, encrypted backups, and inline Backblaze fields."
        ]
      }
    },
    {
      "version": "0.11.1",
      "date": "2026-08-24T14:46:42Z",
      "commit": "47f96eaad881612e35d7c4aac816eaa84d271f5b",
      "message": "Docs - Make technical references current-state",
      "author": "github-actions[bot]",
      "details": [
        "Align media info panels with the detail-page layout and harden local watch-history handling.",
        "Preserve separate histories and routes for TV series that share a title",
        "Keep provider IDs and watched state when duplicate watch dates are merged or removed",
        "Keep metadata and watch-action UI behavior consistent across provider-backed records",
        "Enforce safe Docker setup and README/runtime documentation consistency",
        "Turn the documentation index and architecture map into direct scope and subsystem references",
        "Document current Now Playing, sync safeguards, security controls, and backup behavior",
        "Keep deployment and promotion commands in the development guide without internal-only links"
      ]
    },
    {
      "version": "0.11.0",
      "date": "2026-08-24T10:58:44Z",
      "commit": "9a1c10a71d34e046cf5fb051ed95d09352bce729",
      "message": "Fix - Suppress deleted Plex notification watches",
      "author": "github-actions[bot]",
      "details": [
        "Keep Part Watched entries when Jellyfin acknowledges an outbound resume update with Played=false.",
        "Block and repair malformed automatic episode imports, including uncertain titles that still carry series provider IDs.",
        "Let a newer partial-play position supersede an older unwatched marker when a live session stops.",
        "Preserve explicit newer unwatched and watched decisions, with regression coverage for timestamp precedence.",
        "Keep shared Part Watched progress when Emby or Jellyfin reports the same propagated position without a timestamp.",
        "Continue honoring newer explicit unwatched decisions and reject mismatched timestamp-less positions.",
        "Keep Plex-sourced resume items visible and correctly ordered in Emby Continue Watching without making old progress look newly played",
        "Recover interrupted sync counters, aggregate overlapping process activity safely, and clear orphaned progress after restart",
        "Preserve each episode's real watched or unwatched Plembfin state during show-level source-of-truth sync",
        "Prevent metadata or telemetry updates from reviving an older watched state over a newer unwatch",
        "Keep destination-specific Force Sync operations from changing unselected Trakt history",
        "Keep fresh partial playback in Plembfin when Emby or Jellyfin return Played false or stale dates, while preserving newer explicit unwatches",
        "Complete Plex, Emby, and Jellyfin detail Force Sync writes before a separate two-worker Trakt phase so cloud history cannot hold the local worker pool",
        "Keep explicit destination pushes Trakt-free and persist one truthful combined result after both phases",
        "Stop queued Trakt items on cancellation while allowing active canonical remove/add replays to finish safely",
        "Cover stale acknowledgements, delayed echoes, local-first ordering, partial outcomes, and cancellation with regressions",
        "Publish hydrated Trakt intents before local Force Sync work and retry wrong provider IDs with cached title-derived identities",
        "Keep tracker snapshots and outbound aliases ordered without treating failed writes as observed remote baselines",
        "Apply watched and unwatched local mutations atomically, with rollback-safe synchronous repository primitives",
        "Serialize cross-process media-server state writes by canonical title identity and fence expired lease owners",
        "Hold stale Trakt changes for re-check while allowing genuine changes after the protection window expires",
        "Cover remove-add gaps, split processes, wrong-ID aliases, sparse metadata, lease theft, rollback, and safety holds",
        "Record a fresh watched transition when an older watched alias coexists with a newer unwatched canonical pointer",
        "Prevent Trakt reconciliation cache rebuilds from reverting manually restored episodes",
        "Add the Silo S03E03 provider-id rematch regression",
        "Resolve canonical playstate from the newest related provider-id alias instead of trusting an older exact key",
        "Record a fresh manual watched transition when a release-day watch supersedes a newer canonical unwatch",
        "Cover the Silo S03E03 rematch and manual-watch regression paths",
        "Manual release-day watch marks now remain watched after reloads when an older build left playstate and history out of sync.",
        "Manual episode watches now survive reloads while resync-only records remain idempotent.",
        "Refresh the watched-action browser module and stabilize identity test setup.",
        "Manual watched changes now persist across rematched episode aliases and fresh show reloads.",
        "Part Watched reloads now cancel stale requests and recover cleanly from timeouts or failures.",
        "Part Watched episode labels and progress now follow the active theme accent.",
        "Recent positive-offset Plex watch rollbacks are repaired without hiding later deliberate unwatches.",
        "Hide zero-watched TV groups from the watched-history library while preserving their canonical detail state.",
        "Make Now Playing episode and progress accents follow the selected appearance theme.",
        "Restore Part Watched cards when an unchanged refresh replaces the loading placeholder.",
        "Add regression coverage and document the dashboard, TV library, and planned first-run onboarding flow.",
        "Keep Plembfin manual watched actions authoritative after remote sync replacement echoes.",
        "Keep explicit Plembfin watched actions canonical after remote callbacks complete.",
        "Prevent delayed provider callbacks from reversing a watched or unwatched choice made in Plembfin.",
        "Manual episode watches now inherit the provider IDs established by Fix Match, preventing watched episodes from being hidden in a parallel show cluster.",
        "Show detail pages now read committed episode rows directly after manual watch actions.",
        "The Merge menu lists recorded merges and can restore a wrongly merged show.",
        "Same-date watch cleanup now preserves the newest Plembfin provider IDs so correctly watched episodes remain in their show.",
        "Prevent Plex, Emby, and Jellyfin library snapshots from recreating a watch date the user removed while an older Plembfin watch remains canonical.",
        "Keep removed Plex watch dates from returning when Plex acknowledges Plembfin's own canonical watched-state write.",
        "Treat Plex, Emby, and Jellyfin played-flag notifications as acknowledgements when Plembfin already has watched history for the item.",
        "Use the removed watch row's native Plex, Emby, or Jellyfin item ID to suppress synchronous played acknowledgements while retaining the user's oldest Plembfin date.",
        "Persist explicit Plembfin watch-date deletions by provider item identity so played-flag callbacks cannot recreate them.",
        "Compare provider release-date flags and stored ISO watch timestamps using the same canonical UTC value.",
        "Read the provider item ID from normalized callback provenance when suppressing an explicitly deleted watch date.",
        "Apply Plembfin deletion tombstones in the direct Plex library notification scheduler before history insertion."
      ]
    },
    {
      "version": "0.10.3",
      "date": "2026-08-23T15:23:08+01:00",
      "commit": "8583e2f20eed6331cf4444fe6f6e9db449740be7",
      "message": "Fix - Align episode history identities",
      "author": "Lasikiewicz",
      "details": [
        "Hide unwatched episode artwork and synopses by default, and add live Sync Activity search, numbered pagination, clearer disabled-state reporting, and neutral activity borders.",
        "Episode history now prefers series-level provider IDs, reuses canonical show artwork, and resolves missing titles without requiring Fix Match."
      ]
    },
    {
      "version": "0.10.2",
      "date": "2026-08-22T21:13:26Z",
      "commit": "821e261105ec31d00d045489301d59182e2ed8f9",
      "message": "Fix - Recognize BUILD_CHANNEL=latest and stable as release channel",
      "author": "github-actions[bot]",
      "details": [
        "Update channel detection to treat BUILD_CHANNEL=latest, stable, and main as release channel",
        "Prevent presence of changelog.develop.json from overriding release builds that contain changelog.json",
        "Add test coverage verifying channel resolution for latest, stable, and release tags"
      ]
    },
    {
      "version": "0.10.1",
      "date": "2026-08-22T20:58:29Z",
      "commit": "b18becfd4d41f14b662e6c08efbe5536140625a2",
      "message": "Docs - Modernize hub architecture diagram and refine feature documentation",
      "author": "github-actions[bot]",
      "details": [
        "Redesign architecture hub diagram with transparent background and clean vector styling",
        "Embed official high-resolution Plembfin logo badge in central hub",
        "Tune palette to crisp cyan, emerald, amber, and blue accents",
        "Correct clip-path local coordinate alignment for central Plembfin logo badge",
        "Support both href and xlink:href in embedded image tag for full SVG renderer compatibility",
        "Genericize internal 500 error responses and debug diagnostics to prevent stack trace and exception leakage",
        "Remove all auxiliary category headers, feature badges, and subtext",
        "Redesign nodes into sleek, compact horizontal pill badges with icons and app names",
        "Convert central Plembfin logo badge to pure SVG vector paths",
        "Eliminate raster data URIs so the center hub logo reliably renders across all browsers and GitHub markdown",
        "Redesign architecture hub diagram with native vector graphics and official logos",
        "Add official Fanart.tv faceted vector emblem and full TMDB vector mark",
        "Embed official Plembfin dark header logo in central hub card",
        "Reframe Key Features section in README with positive, capability-focused copy",
        "Streamline README flow by removing standalone sync safety section"
      ]
    },
    {
      "version": "0.10.0",
      "date": "2026-08-22T20:31:54Z",
      "commit": "036b2cea05b108e8480ac990921a0d392ebf37c0",
      "message": "Fix - Resolve CodeQL alerts and update undici and CodeQL action dependencies",
      "author": "github-actions[bot]",
      "details": [
        "Edit Watch Date dialog now shows each watch's platform badge (Plex/Emby/Jellyfin)",
        "TV show control bar: Info moved to the end, the redundant Resync Watched button removed once a show is fully watched, and the top-bar Edit Date button removed",
        "Expand All/Collapse All moved inline next to the Seasons heading, right-aligned",
        "Availability pills (e.g. 15/40 Available, 7/40 Available in 4K) moved next to the season count in the Seasons heading",
        "Plex/Emby/Jellyfin app-link pills moved inline into the ratings row, right-aligned, instead of inside the Media facts panel",
        "Clicking the poster on a movie or show page now opens it in the photo lightbox",
        "Cast photo thumbnails now use the same rounded corners as posters",
        "Media facts panel redesigned: transparent card, real TMDB/TheTVDB/IMDb brand icons in a Ratings row, Plex/Emby/Jellyfin moved into a Watch Now row, Network and Available on show provider icons and link out to TMDB's where-to-watch page for the title",
        "Network icons now match even when TMDB's network name differs from its watch-provider name (e.g. Prime Video vs Amazon Prime Video); shows resolved via TheTVDB still show network name as text only since TVDB has no logo data",
        "Poster click now opens the photo lightbox, which renders with rounded corners to match posters",
        "Dark mode's accent color changed from blue to orange (matching the active TV Shows sidebar tab) across buttons, links, and highlights app-wide; light mode keeps blue",
        "Theme toggle now fades colors smoothly instead of switching instantly",
        "Fixed several legacy CSS rules that were silently overriding new sizing/color rules with stale hardcoded values",
        "Bumped cache-busting version strings for styles.css and the media detail modules so browsers pick up today's changes instead of serving stale cached copies",
        "Force Sync and Full Sync Watchstates now process independent library items with bounded concurrency instead of one at a time, dramatically speeding up large plans without exceeding the outbound pacing governor's per-server request limits",
        "Added a Fast Local-Network Sync checkbox to Settings -> Sync -> Sync Tuning (off by default) that raises those per-server limits further for setups where Plex, Emby, and Jellyfin are all self-hosted on the same trusted local network as Plembfin",
        "Cancelling a Force Sync now lets already-in-flight items finish instead of stopping after a single item",
        "Documented the new setting in Settings help, docs/settings.md, and the README configuration reference",
        "Fast Local-Network Sync (and any other pacing profile choice) now actually stays saved instead of silently reverting to standard the moment anything reloads config, which happened immediately after clicking Save",
        "The same silent-reset bug affected Sync Scope and the Authority (source-of-truth/conflict policy) settings, which are fixed by the same change",
        "Root cause: the settings loader's env-default merge step rebuilt its config object without carrying these three sections through, so they were treated as never-set and reset to their hardcoded defaults on every read",
        "Removing a duplicate watch (per-season, library-wide, or a single watch-date delete) could report an episode or movie as fully unwatched even though a real watch of it still existed, because the check only looked for survivors under the exact same media_key as the row just deleted",
        "Two watch rows for the same episode can legitimately carry different media_keys (e.g. one recorded via a TMDB id, another via an IMDb id only), so that exact-key check missed the surviving row and wrongly propagated an unwatched state to Plex, Emby, Jellyfin, and Trakt",
        "The check now reuses the same broader same-episode identity match already used to find which rows belong together, so a surviving watch under a different key is correctly detected and the corrected watched state is propagated instead",
        "Added a regression test reproducing the exact scenario",
        "Added GET /api/stale-pending-watch-audit and POST /api/stale-pending-watch-repair, generalizing the earlier Trakt play-history incident fix to any watch_history row left with no telemetry or an exhausted retry count from any source, not just the Trakt importer",
        "The repair only resets retry bookkeeping so the existing scheduler backlog sweep performs a real dispatch and records what actually happened, rather than fabricating a settled telemetry",
        "Added GET /api/split-identity-unwatch-audit (read-only) to find episodes where a genuine earlier watch is being shadowed by a later unwatched row recorded under a different identity key for the same episode - the aftermath of the deleteWatchDates media_key-split bug pushing a real unplayed mark to media servers, which Plembfin's own unwatched-fallback polls then correctly recorded back in as canonical",
        "No automatic repair for the split-identity case yet - reverting an unwatch that was genuinely intentional would itself be a phantom watch, so candidates need manual review first",
        "Documented both tools in docs/scheduled-sync.md alongside the existing Trakt-import repair",
        "Fixed a real incident: a single Jellyfin burst (a library rescan, metadata refresh, or rate-limited response) falsely unwatched 264+ episodes across dozens of unrelated shows within about seven minutes, propagating the false unwatch on to Plex and Emby before anyone noticed",
        "applyUnwatchedTransition now tracks a shared, database-backed count of automatic (non-manual) unwatches across Plex, Emby, Jellyfin, and Trakt, and holds back any single one once too many have been recorded in a short window instead of propagating it - this is the one place every automatic unwatch path already funnels through, so it protects all three media servers plus Trakt at once",
        "Manual actions (marking something unwatched in Plembfin itself, Force Sync, Set Plembfin as Source of Truth, Trakt import) are never affected - only automatic, inbound-from-a-server decisions are rate-limited, and a person can still unwatch as much as they want in one sitting",
        "Works correctly in a split web/worker deployment since the counter lives in the shared database, not in one process's memory",
        "Added POST /api/split-identity-unwatch-repair: an explicit admin action that restores episodes already affected by this failure mode (found by the read-only audit added earlier) and re-pushes the corrected watched state to every connected platform",
        "Documented both the prevention and the repair tool in docs/scheduled-sync.md",
        "Removing duplicate watches (per-season or library-wide) could wrongly delete a genuinely watched episode and leave it unwatched, if the same episode also had an older, unrelated row that had been explicitly marked unwatched at some earlier point",
        "The stale unwatched row isn't a countable duplicate watch at all, but duplicate-detection was treating it as one - and since it could sort ahead of the real watch (same or earlier timestamp), it got 'kept' as the supposed oldest copy while the actual watch was deleted as the 'duplicate', wrongly unwatching an item that was never actually duplicated",
        "Library-wide scan/cleanup and the per-season 'Remove duplicate watches' control both now only ever compare rows that currently read as watched; a later explicit unwatch still shows in the play-history list, it's just never treated as a removable duplicate",
        "Some episodes affected by the mass false-unwatch incident lost the shadowed watched row entirely rather than just having it shadowed (real cases: The 'Burbs S01E01, Silo S03E02) - every remaining row reads unwatched, so the existing split-identity audit never finds them",
        "Added GET /api/likely-false-unwatch-audit (read-only): flags an episode where no row currently reads watched but at least one unwatched row came from an automatic source (plex/emby/jellyfin, never manual) with no surviving watched sibling anywhere - the same cascade signature as the split-identity case, just missing its watched half",
        "Added POST /api/likely-false-unwatch-repair: consolidates every stale row for the episode into one fresh watched record using the oldest row's own date as the best evidence of a genuine watch, then re-pushes it to every connected platform",
        "This fingerprint is less certain than the split-identity one (an automatic source is also what a genuine unwatch performed directly on a media server looks like), so it stays audit-only until real candidates are reviewed",
        "Added regression tests for both the audit and the repair",
        "Removing duplicate watches from a season or the whole library no longer wrongly deletes a watch you meant to keep just because it shares a similar timestamp with the one being removed (e.g. marking an episode watched using the same time as another episode, then cleaning up duplicates) - the episode no longer gets left fully unwatched as a side effect",
        "Manually marking something watched inside Plembfin (not reported by Plex, Emby, or Jellyfin) now shows a Plembfin badge and logo instead of being mislabeled as a Plex watch",
        "Deleting a watch date no longer falls back to fully unwatched just because the only row left over happens to carry an old unwatched marker - leaving that row standing (instead of deleting it too) is now treated as confirmation it should count as watched, and it gets pushed out to Plex, Emby, Jellyfin, and Trakt accordingly",
        "A genuine, more recent deliberate unwatch is never overridden by this - an older row that is still genuinely marked watched always takes priority, so an intentional unwatch is never silently resurrected",
        "A watch that gets re-dispatched later instead of right when it happened (e.g. the last watch date you leave standing after removing a duplicate) now reaches Trakt with its real recorded date and time, not the current moment - the scheduler's background retry queue was building its outbound payload without that date at all",
        "Removing or correcting a watch date now records the real outcome of that sync (including which platforms it actually reached) on the affected record, instead of leaving it stuck showing a pending sync forever",
        "The sidebar sync line is now always visible, reading \"Sync - Idle\" when nothing is running and \"Sync - x of x\" while a sync is in flight",
        "Clicking the sync line opens a new Sync Activity page listing every synced media item in its own row, newest first",
        "Each row shows where the sync request came from and which apps it was dispatched to, plus each target's result and any failure detail",
        "Each row has a Download log button that saves that single item's full sync record as a plain-text log",
        "The Sync Activity page refreshes itself while a sync is running so rows appear as they are dispatched",
        "Target results are now the app's icon followed by its status instead of pills, coloured by outcome with the failure detail on hover",
        "Trakt dispatches are named and shown as Trakt with their own icon rather than being labelled Plex, alongside Plex, Emby, Jellyfin, and Plembfin's own manual actions",
        "The Download log button sits on the same line as the target results",
        "Clicking a media title opens that title's page, using your library first and the recorded TMDB/TVDB ids otherwise",
        "Clicking anywhere else on a row expands it to show that item's full log inline, and a background refresh keeps opened rows open",
        "Mark-unwatched buttons (episode, season, and show) now show \"Unwatching...\" while removal is in flight instead of the mark-watched \"Syncing...\" label, and are properly disabled during that time",
        "Removing a single watch date from the edit-date dialog now marks that specific row as unwatching, so it is not mislabeled if an unrelated sync re-renders the page underneath",
        "The full search page and the topbar search dropdown now list what is on a connected media server ahead of TMDB/TheTVDB-only matches, instead of relying on incidental result ordering",
        "Updated docs/media-detail.md and docs/history-search.md to describe the new busy-state tracking and search ordering",
        "Removed the completed \"Unwatching\" label and \"local results first\" backlog items from TODO.md",
        "Manual unwatch actions (Sync Activity Mark Unwatched, and the Continue Watching clear-progress unwatch) now log their origin as Manual instead of echoing whatever platform the original watch record happened to be sourced from",
        "Fixes a misleading Sync Activity entry where marking an item unwatched in Plembfin showed \"Request came from: Trakt\" purely because that item's original watch had legacy provenance pointing at Trakt",
        "Dispatch behavior is unchanged - this only corrects the recorded origin shown in Sync Activity and the per-record sync telemetry",
        "Manual watched marks now use the release date when no threshold-reaching playback was detected, while explicit actions can proceed through the interactive sync lane.",
        "Movies without provider IDs receive TMDB lookup before tracker dispatch.",
        "Keep queued sync items visible, enrich movie provider IDs, and improve Trakt matching.",
        "Preserves local watch history rows for TV seasons when upstream providers only index a partial episode list",
        "Formats season headers to always include the season number alongside any custom season subtitle",
        "Standardizes rating, network, and app icon dimensions to match the Plex baseline",
        "Aligns genres across full-width rows when runtime is absent so network and ratings pair cleanly",
        "Verify administrator username using constant-time comparison to prevent timing-based user enumeration",
        "Extend TruffleHog secret scanning in CI to run on develop branch pushes and pull requests",
        "Add automated unit tests for authentication verification edge cases",
        "Sanitize 500 error responses in HTTP utility to prevent potential stack trace or file path exposure",
        "Pass console error log arguments separately to prevent tainted format string warnings",
        "Bump undici to 8.10.0 for upstream stream encoding and socket DNS origin fixes",
        "Bump GitHub CodeQL action to v4.37.4"
      ]
    },
    {
      "version": "0.9.8",
      "date": "2026-08-21T17:26:39Z",
      "commit": "77d5f4fea3b8dc7202cf862dcc817062b1405505",
      "message": "Fix - Stop mark-watched syncs from blocking unrelated watch actions",
      "author": "github-actions[bot]",
      "details": [
        "groupShowRows now clusters watch_history episode rows by shared provider id (imdb/tmdb/tvdb), the same union-find approach dedupeMovies already uses for films, instead of grouping purely by title",
        "Fixes shows like a reboot/revival sharing an exact title with an unrelated original (Scrubs 2001 vs Scrubs 2026) silently blending their episode lists, seasons, and counts into one show page - Scrubs (2026) was showing Season 1 as 24 episodes (the 2001 original's count) instead of its real 9",
        "Fixed the same title-only matching in mergeShowWithLoadedHistory (client-side merge of the dashboard history preview into a show's episode list) and in queryShowDetail's title-lookup fallbacks, which previously grabbed an arbitrary result once shows correctly split apart",
        "No watch_history rows are changed; this only affects how episodes are grouped into a show for display",
        "README overhaul: fixed the Docker Compose quick-start to pull the published :latest image instead of requiring a local clone and build, added a Which version should I run? section explaining the :latest/:alpha/:develop channels, and replaced the stale alpha-to-main branch description with the real develop -> alpha -> main model",
        "Added CHANGELOG.md, generated from changelog.json by scripts/generate-changelog-md.js and regenerated automatically on every release, so release history is readable on GitHub without logging into a running instance",
        "Updated CLAUDE.md and docs/development.md's branching sections, which still only documented the old two-branch alpha -> main flow despite this session's develop-branch work; renamed the Merge alpha with main command to the two-step Force to alpha / Force to main it actually is now",
        "Fixed docker-publish-develop.yml reading a version field from changelog.develop.json that no longer exists (removed in the earlier develop build-counter change), which was silently publishing a bogus :undefined tag alongside the real develop images",
        "A show reached via /tvshow/:key now delegates into the same TMDB/TVDB fetch-and-render pipeline the /tvshow/tmdb/:id and /tvshow/tvdb/:id routes already use, instead of a separate lighter render that never fetched season-level episode metadata - all three routes now show the same seasons, cast, images, and trailers for the same show",
        "Fixed watched/unwatched/edit-date actions leaving the page stale or blank when viewing a show reached via its TVDB id: five places across watch-action.js and edit-dialogs.js only knew how to refresh a page by local key or TMDB id, never TVDB, so the post-action reload silently failed on that route",
        "tmdb/tvdb-id links (search results, recommendations, cast filmography, the upcoming calendar, dashboard cards) now include a readable slug after the id - e.g. tmdb/202555-daredevil-born-again - so they're legible in the address bar immediately, even for a title with no watch history yet; the id alone still resolves the route and old links without a slug keep working",
        "Fixed a show's displayed tmdb_id preferring a cached-but-possibly-wrong id (resolved by an earlier ambiguous title search and never written back onto any watch_history row) over the id already recorded on the show's own rows, which could permanently override correct data once a bad id got cached - affected the show list, show detail page, and the upcoming episodes calendar",
        "A show whose every episode was marked unwatched became completely unreachable: gone from the TV Shows grid and dashboard, and its own detail page returned Not Found by both title and ID",
        "Caused a stale-looking detail page after marking a show's last watched episode unwatched - the unwatch succeeded and synced correctly to Plex/Emby/Jellyfin/Trakt, but the page's live in-place refresh failed to re-fetch the now-invisible show and kept showing the old watched state until a manual reload",
        "Shows now group and display correctly regardless of watched/unwatched state, rendering as \"0 of N episodes watched\" instead of vanishing; only genuinely untrustworthy library-scan rows are still excluded",
        "Documented the corrected behavior in docs/tv-shows.md",
        "Replaced the 20-cell Key Features table (paragraph-length cells, an empty header row causing extra whitespace at the top) with a scannable one-line-per-feature bullet list, linking to docs/architecture.md for depth",
        "Condensed the densest prose sections (Sync safety, webhook setup, Trakt import/sync, setup guide) to their essential points, moving implementation detail into the existing docs/ pages instead of duplicating it in the README",
        "Removed the emoji used on every section heading and nav link throughout the file",
        "Trimmed the file from 512 to under 400 lines while keeping every setup instruction and reference table intact",
        "Fixed a regression from the earlier fully-unwatched-show visibility fix: unwatching an episode inserts a fresh row timestamped now, and that was being read as the show's most recent watch, bumping it to the top of Watched Newest and inflating its displayed watched-episode count",
        "Fixed a serious identity bug: a show's TVDB id was being read from any tracked episode row, but Plex/Emby/Jellyfin webhooks tag episodes with their own TVDB id, not the show's - using that id for TVDB series routing could load a completely unrelated show and sync watch state to it. A show's TVDB id is now only trusted once it has actually been resolved as a real series (search result, Fix Match, or a prior correct visit), never from a raw, unverified episode id",
        "Season and show progress labels now show Removing... while an unwatch is in flight, instead of a stale watched count until the page finishes re-rendering",
        "Added a regression test covering the TVDB identity fix",
        "Detail-page Force Sync -> Import Watched Status was silently dropping any episode a server flagged as played but returned no watched timestamp for - common when episodes are bulk-marked watched through a server's own library UI rather than played through",
        "Those episodes now import using the episode's own release date instead of being skipped, since this action is explicit and scoped to one title (unlike the automatic background sync, which still requires a real watched date to avoid manufacturing phantom watches across an entire library)",
        "An episode with neither a watched date nor a release date is still skipped rather than given a fabricated date",
        "Added regression tests for both the fallback and the still-skip case",
        "A title lookup with no provider id to disambiguate by (queryShowDetail without an id) picked whichever matching cluster was most recently touched, with no regard for how much real history backed it",
        "One bad Trakt import row resolving an ambiguous title to a completely unrelated show could outrank dozens of correctly identified episodes just by being newer, sending the whole show's page, Force Sync, and Fix Match to the wrong identity",
        "Title lookups now prefer the substantially larger, established cluster over a much smaller one even when the smaller one is more recent; comparably-sized clusters still resolve by recency as before",
        "Added a regression test and documented the tie-break in docs/tv-shows.md",
        "After using Fix Match to repair a show's identity, the detail page briefly rendered 0 watched episodes even though the underlying data was already correct - the client's lookup for the show's cached full episode list only matched by tmdb_id or an exact title-slug match, both of which can miss right after a rematch (tmdb_id is cleared and re-backfilled in the background; the display title can legitimately drop a trailing year the provider's own name still carries)",
        "The lookup now also matches by tvdb_id when the provider supplied one, so a repaired show renders its real watched state immediately instead of falling back to an empty placeholder",
        "Documented the matching order in docs/tv-shows.md",
        "Force Sync -> Import Watched Status decided whether to insert a watched record by checking findWatchedByAnyMediaKey (does any watched row exist anywhere in history), not the episode's actual current state",
        "A later unwatch always wins the display's dedup tie-break by recency, so an old watched row can sit dormant on file while the show still displays and counts as unwatched - the old check treated that dormant row as proof there was nothing to do and silently skipped it",
        "Now checks the actual canonical pointer (getCanonicalWatchState) instead, so a source confirming an episode is still watched inserts a fresh record and genuinely restores the correct watched state",
        "Added a regression test documenting the exact gap between the two checks",
        "Documented the fix in docs/media-detail.md",
        "getCanonicalWatchState matches by provider id/media_key, but an incoming Plex/Emby/Jellyfin item's ids are episode-scoped (its own imdb/tvdb id, not the show's) and often don't match the playstate row's identity - the lookup fell through to the same any-watched-row check the previous fix was meant to replace, still finding a dormant old watched row and wrongly reporting nothing to do",
        "A show-scoped pull now builds a season+episode -> sync_action map once from the show's own current detail and checks that first - the exact data the display itself groups from, so it can't disagree with what the page renders",
        "Verified against live production logs: outbound dispatch to Plex/Emby/Jellyfin was already succeeding for every episode, confirming the sync engine and webhook echo protection were healthy - only the local re-import decision was wrong",
        "remoteItemToMedia only fell back to the show's requested tmdb/tvdb ids when the source item provided none at all - but Plex/Emby/Jellyfin always tag an episode with its own tmdb/tvdb id (both providers assign episodes ids separate from their series), so that fallback never triggered",
        "Every episode Import Watched Status inserted was tagged with its own episode-level identity instead of the show's, fragmenting it into its own show cluster and reproducing the exact display bug the previous two fixes were meant to resolve",
        "An episode's tmdb_id/tvdb_id now always come from the show actually being pulled; imdb_id still comes from the item, since it is meaningfully episode-scoped and does not affect show grouping",
        "Verified live: confirmed via production logs and direct API checks that this is what was actually happening, then added a regression test",
        "queryShowDetail and rematchShowWatchRecords (Fix Match) both did an exact show_title_lower match first, only falling back to a broader canonical scan when that found zero rows - never when it found an incomplete subset",
        "The same real show's episode rows can carry different exact show_title text over time (a media server's own title is rarely year-suffixed even when Plembfin's preferred display title is), so an exact match silently saw only one variant and missed the rest of the show's episodes - or resolved a different variant to an unrelated show sharing that exact text",
        "This is what was actually blocking School Spirits Season 3 after every earlier fix: a Fix Match run only repaired the rows matching its anchor's exact title text, leaving Season 3's rows on their old identity untouched",
        "Both functions now always scan by the same normalized canonical key (title with any trailing year stripped) that episodes are grouped by everywhere else, so a lookup or repair can no longer see only part of a show",
        "Added a regression test with episodes split across a year-suffixed and non-year-suffixed title for the same show",
        "Fixed a stuck 6/6 Available badge on shows opened via a tmdb/tvdb detail link: the Seerr background-refresh repaint only checked the plain /tvshow/:key slug, which those routes never set, so a completed correct fetch never re-rendered the page",
        "Availability pills now show the actual resolution found on the connected server instead of a hardcoded 1080p; a TV season only claims a resolution when every available episode in it shares one, otherwise it drops the claim rather than guessing",
        "Movies now get a real resolution reading too, pulled the same way TV episodes get theirs",
        "Fixed the Edit Watch Date dialog under-reporting an episode's play count when its watch rows had differently formatted show titles (missing a trailing year on one row but not another), the same normalization bug already fixed for show lookups and Fix Match",
        "Added a regression test covering the watch-date dialog fix",
        "Live-verified the earlier show-title normalization fix on Trying S05E07 and found the dialog still under-counted: a real play whose sync_action was later flipped to unwatched (e.g. an explicit unwatch from a connected server) has a watched_at but no longer looks like a watched row, so it was silently excluded from the list even though the episode card's own N actual watches badge already counted it",
        "siblingWatchRowsFor() now trusts a sibling row the same way the show page's own history grouping does, instead of requiring its current action to be watched",
        "Added a regression test covering an episode with one watched play and one later-unwatched play",
        "Fix TV show detail page to correctly merge episode-level watch history records",
        "Scope show grouping union-find to show-level provider IDs so episode-level IDs do not partition series episodes",
        "Update documentation for show grouping and client-side history merging",
        "Prevent show modal DOM wipe on in-place re-renders and live updates",
        "Ensure all episode rows belonging to a series are merged into the main show record",
        "Use majority provider ID frequency across episode records to prevent stray row hijacking",
        "Fix Remove Duplicate TV Watches scan in Settings to accurately identify episodes with multiple recorded watch dates",
        "Normalize media type aliases like TV and show in duplicate watch scan and cleanup endpoints",
        "Keep the oldest watch date and remove subsequent duplicate plays during library-wide cleanup",
        "Marking an episode, season, show, or movie watched/unwatched no longer disables mark watched/unwatched buttons for unrelated episodes, seasons, shows, or movies while its sync to Plex/Emby/Jellyfin/Trakt is still running",
        "A large season or show sync only blocks further actions on the same episodes it's syncing, not the whole app - you can mark a different show or movie watched right away instead of waiting",
        "Show-wide controls (mark/resync the whole show, edit show date, edit images, fix match, merge) still wait for every in-flight action on that show to finish, since they would otherwise re-push episodes still mid-sync",
        "Documented the new scoped syncing behavior in docs/media-detail.md"
      ]
    },
    {
      "version": "0.9.7",
      "date": "2026-08-21T09:59:56Z",
      "commit": "f87200a8b1f629ebe95d3401c09b53a19846d53c",
      "message": "Fix - Scroll expanded seasons into view below the sticky topbar",
      "author": "github-actions[bot]",
      "details": [
        "develop's displayed version no longer derives from alpha's or main's current version (${mainVersion}.${alphaBuild}.${developBuild}) - it is now a plain incrementing build counter shown as \"Develop Build N\"",
        "Fixes the sidebar/Settings-About version looking lower than its parent branch right after a promotion to alpha or main, since the borrowed version string only self-healed on develop's own next push and had no way to update itself when a promotion happened elsewhere",
        "The build counter never resets on a promotion (only the entry list is cleared), so it can never appear to regress relative to a branch it was promoted from",
        "Updated the pending-build comparison, changelog rendering, and the (previously unwired) promotion scripts to match; added test coverage for the new comparison logic",
        "promoteDevelopToAlpha() now zeroes develop's build counter (not just its entry list) when develop is promoted to alpha, so the next develop push after a promotion starts back at build 1",
        "This reset is safe because it happens as a deliberate, explicit step of the promotion itself, not an inferred comparison against a version string that could be stale - the same safe shape as alpha's own reset-on-promotion-to-main",
        "Documented the distinction in update-develop-changelog.js and docs/architecture.md",
        "Clicking a season header to expand it now scrolls that season into view, instead of leaving the newly-revealed episode list to open off-screen below where you clicked",
        "Collapsing a season still preserves the scroll position as before, so the page doesn't jump now that the content above has shrunk",
        "The season-scroll fix from the previous commit used scrollIntoView's default alignment, which puts the season header flush with the very top of the viewport - directly underneath the sticky page topbar, hiding it",
        "Now offsets the scroll target by the topbar's real rendered height so the expanded season lands visible just below it instead of overshooting and disappearing behind it",
        "Clicking a season header to expand it, or loading a URL that names a season directly, now scrolls that season into view instead of leaving it open off-screen below the click or hidden at the very top of the page",
        "Fixed the actual scroll target: this app's shell keeps window/document fixed and scrolls .page-shell internally, so the first attempt (window.scrollTo) silently did nothing - now walks up to whichever ancestor actually has the overflow",
        "Reserves space for the sticky topbar via scroll-margin-top so the season header lands visible just below it instead of hidden underneath",
        "Replaced the browser's native (non-configurable, abrupt) smooth scroll with a hand-rolled eased animation",
        "A season named in the URL scrolls into view once on that navigation, not on every later re-render of the same modal (e.g. toggling an episode watched)"
      ]
    },
    {
      "version": "0.9.6",
      "date": "2026-08-21T09:30:21+01:00",
      "commit": "ead2ff98bf109a7bc8b547363b590edaa6f3dc38",
      "message": "Fix - Stop same-event webhook echoes inflating play counts",
      "author": "Lasikiewicz",
      "details": [
        "Suppress background dashboard and watch history reloads while any sync operation (Force Sync, Cron Sync, Full Sync, or background dispatch) is actively running",
        "Settle and refresh the dashboard cleanly once when the sync completes, stops, or fails",
        "Wire active sync progress checks into live history refresh throttling to avoid flickering and card reloading during large syncs",
        "Dashboard no longer refreshes repeatedly while a background sync is in progress after marking something watched in Plex",
        "Fixed a bug where the sync reconciliation pass treated a missing local watch record as an explicit \"unwatched\" decision, causing it to push real \"mark unplayed\" calls to Plex/Emby/Jellyfin for items that were genuinely watched but had no matching Plembfin history row (e.g. after phantom-watch repair deleted the row)",
        "The reconciliation pass now only treats an item as canonical-unwatched when Plembfin holds an explicit unwatched record; if there is no record at all, it leaves the media server's watched state alone instead of guessing",
        "Phantom-watch burst detection no longer flags a normal multi-hour, multi-show viewing session as an import-echo flood: cross-show bursts must now fit within a 10-minute span, not just have no single gap over 3 minutes",
        "Phantom-watch burst repair now skips any watch row that every other configured media server has already independently confirmed as synced, so a real, cross-verified watch is never deleted just because its timing happens to match a suspicious pattern",
        "Applied the same no-history-is-not-unwatched fix to the modern scoped Force Sync planner, which previously could still push a false mark-unplayed to Plex/Emby/Jellyfin for an item with no Plembfin history row",
        "Added updatedAfter/updatedBefore Force Sync scope filters, so a repair can be limited to items Plembfin touched in a specific time window rather than filtering by original watch date",
        "The backlog sync-retry queue now only re-sends mark-played to the specific targets still missing confirmation instead of all three every time, clearing large backlogs faster with less redundant traffic",
        "Fixed a playstate/watch_history drift: deleting a single history row (e.g. via the History page's delete button) now also cleans up the matching playstate row, so Plembfin's own watched indicator can no longer disagree with its own history after a record is removed",
        "Fixed the outbound-mark echo detector comparing raw title strings, which meant a source that formats an episode as \"Show (2025) - S01E02\" and another that reports it as \"Show - S01E02\" (only one carrying the year suffix) never shared a cache key",
        "Because of that mismatch, a media server's own echo of an outbound mark Plembfin just sent was not recognized as an echo, was treated as a brand-new watch, and created a duplicate watch_history row for an episode already recorded from another source",
        "The echo-loop cache key now uses the same canonicalized show/movie title matching already trusted elsewhere in the app for this exact year-suffix mismatch, instead of the raw, unnormalized title string",
        "Exported the existing canonicalShowTitleKey/showTitleFrom helpers from dataRepo.js for reuse in syncOrchestrator.js rather than duplicating the normalization logic",
        "Fixed replaceTrackerSnapshot failing with a UNIQUE constraint error whenever the combined Trakt snapshot list contained more than one entry for the same media_key (e.g. a rewatch Trakt reports as a separate play), which crashed the whole snapshot replace and made the Trakt watched-state poll fail on every subsequent tick",
        "The combined snapshot list is now deduplicated by media_key, keeping the most recently reported watched_at, before being written to tracker_item_state",
        "Fixed the per-minute scheduled-sync tick timing out at 50 seconds during a large outstanding backlog, even though the underlying work (unwatched-state checks, recently-watched/resumable polling across all three platforms, and manual-dispatch retries) was still succeeding in the background",
        "Promise.race does not cancel the underlying task on timeout, so the ti