// User-facing release notes. One entry per released version, newest first. The end-of-line
// `sha` is the repo commit the release was cut from (our stand-in for an issue/ticket ref);
// it's attached when the version is tagged. `chores` are internal and hidden from the public
// Release Notes dialog by default.

export interface ReleaseEntry {
  version: string;
  date: string; // ISO date (YYYY-MM-DD)
  sha?: string; // short commit the release was tagged from
  summary?: string;
  features?: string[];
  fixes?: string[];
  chores?: string[];
}

export const RELEASE_NOTES: ReleaseEntry[] = [
  {
    version: "0.59.0",
    date: "2026-07-31",
    summary:
      "The menus, dropdowns and tooltips across the app are rebuilt on one system — with fuller keyboard and screen-reader support — and the player's Add to playlist and Download now work in fullscreen.",
    features: [
      "Player: Add to playlist and Download now work while the player is in fullscreen.",
      "Channel page: for a channel you follow, your tags are now shown and editable right in the header, next to Subscribe.",
    ],
    fixes: [
      "Menus and dropdowns now support full keyboard navigation — arrow keys, Home/End and type-to-jump — and return focus to where you were when they close.",
      "Escape now closes only the menu or dialog on top, instead of also closing the player or window behind it.",
      "Tooltips and hover cards are steadier and no longer linger or get in the way; the header language switcher now opens on click.",
      "Channel tags stay on one line in the manager and reveal any that don't fit in a hover card, so the table no longer reflows as you add them.",
    ],
    chores: [
      "Rebuilt the app's popovers, menus and tooltips on a single anchored-positioning system, replacing ~11 separate hand-written implementations.",
    ],
  },
  {
    version: "0.58.0",
    date: "2026-07-29",
    summary:
      "Housekeeping: a refreshed public landing page and internal frontend cleanup — nothing changes for signed-in users.",
    chores: [
      "Landing: the signed-out welcome page has a new screenshot gallery (feed, channels, playlists, player, search, downloads and Plex) and refreshed, plainer copy describing what the app does.",
      "Frontend: finished splitting the data-fetching layer into per-domain modules behind a thin façade (no behaviour change).",
      "Docs: the README is brought up to date (feature list, Plex, search behaviour) and its landing screenshot fixed.",
    ],
  },
  {
    version: "0.57.2",
    date: "2026-07-28",
    chores: [
      "Sharing: the shared-video page now advertises playback to the OS via the Media Session API only, dropping a Web Audio workaround that interfered with the browser's own background playback on iOS (it left the audio to be suspended when the tab was backgrounded, the opposite of the goal) — so background audio is left to the browser's native handling, the way it works for youtube.com.",
    ],
  },
  {
    version: "0.57.1",
    date: "2026-07-28",
    fixes: [
      "Sharing: a YouTube video's shared-link preview now uses the original YouTube thumbnail, which Facebook Messenger reliably shows — the previously-served self-hosted image was a valid picture everywhere else but Facebook's stricter processor rejected it as “corrupted”.",
    ],
  },
  {
    version: "0.57.0",
    date: "2026-07-28",
    summary:
      "Downloads and channels polish — clearer download failures, a friendlier share flow, richer channel controls, and background audio for shared videos on iPhone/iPad.",
    features: [
      "Downloads: the page now opens on the Queue tab, the library shows when each item was downloaded, the Share dialog opens with a ready-to-copy link already created (all the other link options stay available), and you can paste a link from the clipboard with one tap.",
      "Downloads: a failed item now explains WHY in a readable message — video unavailable, sign-in required, region-blocked, no downloadable format, and so on — with the raw technical detail one click away and a Retry offered when the failure looks temporary.",
      "Channels: a channel's page now shows how many of its videos are stored versus its true total, with a “Full history” button to pull the rest. The priority arrows repeat (and speed up) while held instead of one click at a time, the value sits where the cursor can't cover it, and you can click the number to type any priority directly — negatives included.",
      "Sharing: a shared video keeps playing audio in the background on iPhone/iPad (like YouTube) when you leave the browser.",
    ],
    fixes: [
      "Downloads: thumbnails that had gone missing (when the original video was deleted or its link expired) now fall back to the saved poster instead of showing a broken image.",
      "Sharing: shared-link previews now reliably include the thumbnail when pasted into Facebook Messenger on the desktop web (dimensions are declared so its scraper shows the image on the first fetch).",
    ],
  },
  {
    version: "0.56.0",
    date: "2026-07-28",
    summary:
      "Internal frontend hardening — the whole client API layer is now type-checked end to end and the largest module was broken up for maintainability. No changes to normal use.",
    chores: [
      "Type safety: the fetch wrapper and every one of the ~150 API calls now carry real types, closed-value fields (watch status, playlist kind/source, download job kind) are strict value sets, and every loosely-typed `any` was removed and is now blocked going forward — a whole class of mistakes is caught at build time instead of in the browser.",
      "Cache correctness: all ~200 React Query cache keys now come from one typed source of truth, so a mistyped key can no longer silently fail to refresh a list after an action.",
      "Code structure: the ~1800-line API module was split — the shared request machinery and the downloads, Plex, and messaging areas each moved to their own file behind the exact same interface, with no behaviour change. Plus a validation message and browser-tab titles now read from a single source so they can't drift.",
    ],
  },
  {
    version: "0.55.0",
    date: "2026-07-26",
    summary:
      "Internal hardening — every write request is type-checked at the edge, quota accounting and Plex sync hold up cleanly when something fails partway, and a new database-backed test net guards it all. No changes to normal use.",
    chores: [
      "API contract: every mutating endpoint (~50) now validates its request body against a typed request model at the edge, replacing scattered hand-written checks. Malformed input is rejected consistently with a clear validation error instead of occasionally causing an internal error, and response status codes were made consistent across modules.",
      "Transaction correctness: YouTube quota accounting now writes in its own transaction — it stays accurate even if the surrounding job rolls back, and no longer commits a job's partial work early. Plex library sync commits each library as it finishes, so a failure partway through keeps the libraries already mirrored. Existing genre-less Plex rows were normalised.",
      "Testing: a database-backed integration test lane (an ephemeral Postgres spun up for the test run) now runs in the release gate, covering the transaction behaviour and the Plex genre-less-library fix that the pure-logic tests couldn't reach.",
    ],
  },
  {
    version: "0.54.0",
    date: "2026-07-26",
    summary:
      "A sturdier player — press F to go big, arrow-key volume that's remembered — plus downloads and subscription sync that hold up when something goes wrong.",
    features: [
      "Player: press F to maximise the video to a full-window view — now with its own control bar (previous/next, auto-advance, loop, add-to-playlist, download, mark watched) that auto-hides while you watch, plus a button for true fullscreen. Scroll-wheel and ↑/↓ volume work in every mode (the full window and fullscreen too), and your volume is remembered per account.",
      "Volume: Ctrl+scroll zooms the page as usual again instead of being captured by the player. Keyboard shortcuts keep working after you click into the video, and the mouse/browser Back button now steps out one level at a time (fullscreen → full window → the normal player → closed) instead of closing the whole player at once.",
    ],
    fixes: [
      "Downloads: fixed a class of downloads that could fail with an internal error (a produced file the downloader couldn't locate), and mp4 downloads are no longer needlessly re-encoded — they finish faster and keep their original quality.",
      "Downloads: leftover temporary playback files from an interrupted session are now cleaned up automatically on restart, and a cancelled download stops reliably instead of hanging.",
      "Subscription sync: a one-off empty response from YouTube can no longer wipe your subscription list; playlist sync now stops safely once a daily quota limit is hit instead of burning through the rest; and a permanently unavailable channel is reported instead of silently looking healthy.",
    ],
  },
  {
    version: "0.53.1",
    date: "2026-07-25",
    summary: "The Plex page no longer errors when a mirrored library has items without genres.",
    fixes: [
      "Opening the Plex module could fail with a server error when a mirrored library contained items with no genre metadata (for example a freshly added, sparsely-tagged library). The filter sidebar now handles genre-less items correctly, so the page loads normally.",
    ],
  },
  {
    version: "0.53.0",
    date: "2026-07-23",
    summary:
      "Account & sign-in dead ends fixed, a way out of a forgotten messaging passphrase, and share-link password controls — plus security hardening.",
    features: [
      "Forgot your secure-messaging passphrase? You can now reset it from the unlock screen and start fresh with a new one. Resetting permanently clears your existing message history (it can't be decrypted without the old passphrase) — you're warned clearly before it happens.",
      "Didn't get your verification email, or the link expired? You can now request a new one right from the sign-in screen.",
      "Share links: you can now change or remove the password on an existing link, not just when creating it. Changing it immediately stops the old password from working.",
    ],
    fixes: [
      "Completing a password reset now also verifies your email — so an account that never clicked the original verification link isn't left stuck.",
      "Cancelling Google sign-in now returns you to the login page with a clear message instead of a raw error page; the same for cancelling a Google connect/upgrade from inside the app.",
    ],
    chores: [
      "Security hardening: rotating a share-link password now instantly revokes links already handed out; the share recipient list and messaging key lookup no longer reveal suspended/deactivated accounts; and assorted race-condition and abuse-surface fixes.",
    ],
  },
  {
    version: "0.52.0",
    date: "2026-07-22",
    summary:
      "Honest loading and error states across the app — pages no longer look empty when a fetch is still loading or has failed.",
    fixes: [
      "When a page's data is still loading or fails to load (e.g. right after a server restart), it now shows a spinner or a clear error with a Retry button — instead of looking like it's simply empty (\"No channels\", an empty inbox…). Rolled out across the feed, channels, playlists, downloads, messages, notifications, Plex, admin and stats pages.",
      'A failed action now shows the server\'s actual reason (e.g. "Not enough quota left today") instead of a generic "failed" message.',
      "The startup screen now offers a Retry if the app can't reach the server on load.",
    ],
  },
  {
    version: "0.51.1",
    date: "2026-07-22",
    summary: "Follow-ups to the downloads update: cleaner titles and file names on re-download.",
    fixes: [
      "Re-downloading an item now also refreshes its title and saved file name — the “1.6M views · … |” social clutter that stuck to older downloads is cleared on re-download (both on the card and in the saved file name).",
      "Downloaded file and folder names now contain only safe characters — no “!”, brackets, or other shell-unpleasant punctuation.",
      "The app now cleans up after itself: stale leftover folders and images from a previous naming scheme (e.g. an old accented folder left behind by a re-download) are removed automatically.",
    ],
  },
  {
    version: "0.51.0",
    date: "2026-07-22",
    summary: "Downloads that play on every device, cleaner file names, and one-click re-download.",
    features: [
      "Downloads now default to 720p — quicker and plays everywhere. 1080p and Best are still one click away in the format list.",
      "New “Re-download” button on each item in your Library rebuilds the file under the latest rules; any share links you've already sent keep working and point to the new file.",
    ],
    fixes: [
      "Shared videos now play in every browser, including on iPhone and iPad (Safari and Brave): a file that arrived in a format Apple can't decode (such as AV1) is now automatically converted to a universally-playable one, so the “broken play button” is gone.",
      "Downloaded folder and file names are now plain, accent-free ASCII with underscores instead of spaces — portable, and no longer shown as “?” in some file tools.",
      "Titles that start with social clutter like “1.6M views · 66K reactions |” are cleaned up automatically.",
    ],
  },
  {
    version: "0.50.0",
    date: "2026-07-22",
    summary: "A sweep of small correctness, keyboard and accessibility fixes across the app.",
    fixes: [
      "Downloads: two different formats of the same video no longer overwrite each other on disk (and deleting one no longer removes the other's file). Videos with very long titles — especially accented, non-English ones — no longer fail to save.",
      "In the video player, pressing Escape now closes just the top layer — the open popover or dialog — instead of also closing the player behind it.",
      "Plex player: the audio and subtitle menus are readable in the light theme again (they were white-on-white).",
      "A repeated notification that resurfaces now stays on screen for its full time instead of vanishing early.",
      "Unsubscribing from a channel now tells you if it failed, instead of failing silently.",
      "The ✕ close button on dialogs is now translated (it was always English), and screen readers now announce toast notifications.",
    ],
    chores: [
      "Keyboard: reorder a side panel's sections with the keyboard, and Space now activates a focused button in the player instead of toggling playback.",
      "Hardening: rate-limited the access-request endpoint and closed a couple of sign-in token races; the demo account can no longer spend YouTube quota; assorted internal safety and performance fixes.",
    ],
  },
  {
    version: "0.49.0",
    date: "2026-07-21",
    summary:
      "Groundwork: a quality gate and the project's first backend tests. Nothing changes on screen.",
    chores: [
      "Every change now passes an automatic gate before it can be published: type-checking, linting (ESLint + ruff), formatting (Prettier), and the test suites. Releases can no longer go out over code that fails a check.",
      "The backend gained its first tests (title cleanup, download path safety incl. the traversal guard, and the share-link signatures), and the frontend test net grew; the end-to-end browser suite is wired into the release gate.",
      "The TypeScript compiler was tightened (notably checked indexed access), catching a class of possible-undefined mistakes across the app before they can ship. All behaviour is unchanged.",
    ],
  },
  {
    version: "0.48.0",
    date: "2026-07-21",
    summary:
      "Playlists get real column headers — and sorting one no longer rewrites it behind your back.",
    features: [
      "The playlist view has sortable, filterable column headers: sort by title, channel or length, and filter by title or channel to find something in a long list.",
      'Sorting is now only a way of LOOKING at the list. Your playlist\'s own order stays exactly as you saved it until you press "Save this order" — so trying a sort can no longer rewrite the list, or leave a YouTube-synced playlist marked as unsynced. Saving is undoable like any other reorder.',
      'The list tells you which view you are in: whether the current sort matches your saved order, differs from it and can be saved, or is filtered (where saving would drop the hidden videos, so it is not offered). The "#" column always shows each video\'s position in the SAVED order.',
      "Drag-reordering now works from the keyboard: focus a drag handle, press space, move with the arrow keys and press space again.",
    ],
    fixes: [
      "Deleting a playlist synced with YouTube asked twice, and cancelling the second question still deleted it locally. It is one question now, with each outcome on its own button — and closing the dialog deletes nothing.",
      'Confirmation dialogs put the keyboard focus on Cancel when the action is destructive. Previously the confirm button took focus, so a stray Enter on an open dialog could run "Delete user" or "Clear audit log".',
      "Removing a video from a playlist now asks first, and keeps your undo history for the videos that remain.",
      "Typing in a table's column filter re-created the input on every keystroke, which moved the cursor and broke accented and IME input mid-word. This affected the channel manager, Discover and the audit log as well.",
      'A playlist that failed to load showed "Loading…" forever; it now says so and offers to retry. Failed reorders and renames are reported instead of passing silently.',
      "Reordering a playlist no longer requires YouTube write access — it never needed it.",
    ],
    chores: [
      "The table column header is now shared between the playlist and the other tables, and the playlist's view logic is covered by unit tests.",
    ],
  },
  {
    version: "0.47.0",
    date: "2026-07-20",
    summary: "Relative timestamps tell the truth again — and now come from your language itself.",
    fixes: [
      'Every "time ago" label named the wrong unit: something four minutes old read "4s ago", an hour old "1 min ago", a day old "1 hour ago". The number was right all along, only the word was wrong. This affected every timestamp in the app — the feed, channels, messages, notifications, the player and the audit log.',
    ],
    features: [
      'Relative timestamps are now produced by your language\'s own rules rather than written by hand, so they read naturally in Hungarian and English alike. Hungarian is unchanged; in English they are a little shorter ("59m ago" rather than "59 min ago").',
    ],
    chores: [
      "First unit tests in the project, covering every relative-time range at its exact boundary so this class of mistake cannot come back unnoticed.",
    ],
  },
  {
    version: "0.46.0",
    date: "2026-07-20",
    summary:
      "The channel manager, overhauled — read it as a table or as cards, with sorting, paging and each channel's full description at hand.",
    features: [
      "The channel manager has a card view alongside the familiar table. Pick it from the switcher next to the tabs; your choice sticks, and both Subscriptions and Discover follow it.",
      "A new About column shows each channel's description, and hovering it opens the full profile — description, links, country, language, topics and keywords — without leaving the list. Links in descriptions are clickable, and social handles resolve to their profiles.",
      "Sorting is shared between the two views: sort by clicking a column header in the table or from the dropdown in cards, and your choice carries over when you switch.",
      'Both views page through your channels — "Rows per page" in the table, "Cards per page" in cards — and the table now has a pager at the bottom as well as the top. Turning a page takes you back to the top of the list.',
      "Filter the table column by column: funnels on priority, channel, sync state and tags narrow it without disturbing your top-level filters.",
      "Moving between the manager's tabs now goes into your browser history, so Back steps back through the tabs you visited instead of leaving the manager altogether.",
    ],
    fixes: [
      'The channel table stays centred with "Rows per page" set to All. A single long channel name used to stretch its column and push the whole table off to one side.',
      "The tag editor no longer opens behind the card below it.",
    ],
  },
  {
    version: "0.45.1",
    date: "2026-07-19",
    summary: "A few player and sharing fixes.",
    fixes: [
      "Plex: the video now fills the whole screen in fullscreen. It used to stay at its windowed size, small and centred with black bars around it.",
      "Copying a share link now works reliably, including on iPad and Safari.",
      "The pop-out YouTube player is back to its previous, more compact size.",
    ],
  },
  {
    version: "0.45.0",
    date: "2026-07-19",
    summary: "Read the feed the way you like it, and explore your Plex library by cast.",
    features: [
      "The feed has five view modes now — large cards, small cards, rows, compact rows, and a multi-column tile view. Pick the density that suits you from the switcher next to the sort control; your choice sticks.",
      "Explore your Plex library by the people in it: click any cast member on a film or show's page to see everything they're in. Pick several and, by default, you'll get titles featuring any of them — flip to \"All\" to require every one. The actors you've picked now show as cards above the grid, each with a photo and a title count, and a click to drop them.",
    ],
    fixes: [
      "Plex: clicking a lower-billed cast member no longer empties the grid. We now index a title's full cast (not just the top few), so filtering by anyone shown actually finds their films.",
    ],
    chores: [
      "A large under-the-hood cleanup of the app's internal structure (no behaviour change) — smaller, clearer building blocks that make future features quicker and safer to add.",
    ],
  },
  {
    version: "0.44.0",
    date: "2026-07-16",
    summary:
      "The filter panels get out of the way, and you can finally see — and pick — what's narrowing your feed.",
    features: [
      "The Filters, Plex and Playlists panels now sit as a small tab beside the sidebar and slide open over the page when you point at them, so they cost you nothing until you want them. Prefer one always open? Pin it. The feed starts a lot further left than it used to.",
      "Everything currently filtering your feed now shows as a row of chips above it — drop any one with a click, or clear the lot. No more opening the panel just to see what you'd set.",
      "Filter the feed by channel — at last. Pick channels in the panel's new Channel section (searchable), or hit \"Show in my feed\" on any channel's page. Pick several and you'll get all of them, with your other filters still applied.",
      "Your sync status moved out of the sidebar into a small chip at the top, next to the search: the video count at a glance, and the details, the missing-history link and pause a click away.",
    ],
  },
  {
    version: "0.43.1",
    date: "2026-07-15",
    summary: "A fix for the new slim sidebar.",
    fixes: [
      "The slim sidebar no longer stays stuck open after you use the language switcher or the account menu — it tucks away again as soon as you click elsewhere.",
    ],
  },
  {
    version: "0.43.0",
    date: "2026-07-14",
    summary:
      "A slimmer, smarter navigation sidebar, a couple of account tweaks, and an optional live appearance tuner.",
    features: [
      "The navigation sidebar now stays slim by default and slides open over the page when you hover it or tab into it — so it barely takes any room until you need it. Prefer it always open? Pin it with the button at the top of the rail.",
      "The top bar reclaims the empty space on the left: it now hugs your content instead of leaving a fixed gap when the sidebar is slim.",
      "A logout button now sits right next to the language and about buttons, and your role shows as a tooltip on your name (the separate badge is gone).",
      "New optional glass tuner: a floating panel for live-tweaking the frosted-glass look. It's off by default — switch it on under Settings → Appearance if you like to fiddle.",
    ],
  },
  {
    version: "0.42.0",
    date: "2026-07-13",
    summary:
      "A big visual refresh: the “glass over image” dark theme, a redesigned top bar, and one unified floating panel system for filters and playlists.",
    features: [
      "New background image: in dark theme a subtle backdrop, tuned to your colour scheme, now sits behind the app — so the frosted-glass surfaces have real depth to refract. Turn it on or off, and dial its strength, with the new controls in Settings → Appearance.",
      "Two new colour schemes: Starship (deep-space blue) and Matrix (terminal green).",
      "Redesigned top bar: the module name sits in a floating pill with back/forward arrows to step through your modules, and each module's search moved into a matching floating search bar.",
      "The Feed, Plex and Playlists side panels are now one consistent floating system — collapse any of them to a slim tab beside the navigation, reorder and hide their sections, and your arrangement is saved per panel.",
      "The navigation rail is now a floating rounded panel too, matching the rest of the app; at high browser zoom its list scrolls without a scrollbar, with a soft edge fade hinting there's more.",
    ],
    fixes: [
      "Repeated identical notifications now fold into a single entry with a count, instead of stacking up.",
    ],
    chores: [
      "Reworked the translucent “glass” surface system so the whole app shares one consistent, tunable look.",
      "Retired the German interface language; Siftlode is now available in English and Hungarian.",
    ],
  },
  {
    version: "0.41.0",
    date: "2026-07-12",
    summary: "Richer channel pages, a new admin audit log, and channel-page fixes.",
    features: [
      "Channel pages now show Country, Topics and Keywords in the About tab.",
      "From the channel Discovery tab you can open a channel's page to look it over — its About and videos — before subscribing.",
      "New admin Audit log: an append-only record of admin actions and scheduler activity (who did what, and when), with filtering and a configurable retention window.",
    ],
    fixes: [
      "Channel banners that briefly failed to load now recover on their own instead of staying broken.",
      "The channel header no longer shifts a few pixels when switching between the Videos and About tabs, and channels without a banner lay out correctly.",
      "The Source (search-results) filter is hidden on a single channel's page, where it didn't apply.",
    ],
  },
  {
    version: "0.40.0",
    date: "2026-07-12",
    summary: "A wave of polish and reliability fixes closing out the internal cleanup pass.",
    fixes: [
      "Your place in a video is now saved even if you refresh or close the tab right after skipping around.",
      "Auto-advance no longer gets stuck on a video that can't be played — it moves on to the next one.",
      "The unread badge on your messages now updates live across your other open tabs.",
      "Download storage/limit messages now appear in your language, with the right number format.",
      "Removing a demo email or denying an access request now asks for confirmation first.",
      "After syncing your subscriptions, the feed refreshes right away to reflect the change.",
    ],
    chores: [
      "Many internal correctness and efficiency fixes across search, playlists, channels, messages, and downloads; admin-panel polish. No feature changes.",
    ],
  },
  {
    version: "0.39.1",
    date: "2026-07-12",
    fixes: ["Signing out and back in no longer disconnects your YouTube access."],
  },
  {
    version: "0.39.0",
    date: "2026-07-12",
    summary: "Sign-in security hardening.",
    features: [
      "New “Log out other sessions” button in Settings → Account, to sign out everywhere else.",
    ],
  },
  {
    version: "0.38.0",
    date: "2026-07-12",
    summary: "The Plex filter sidebar can now be collapsed, plus a large internal cleanup.",
    fixes: ["The Plex library no longer stops loading more titles after you open one and go back."],
  },
  {
    version: "0.37.0",
    date: "2026-07-11",
    summary: "Movies and shows in one library, a Plex-style series view, and smarter filters.",
    features: [
      "Movies and TV shows now share one unified library — browse them together and narrow to Both, Movies, or Shows from the sidebar.",
      "A Plex-web-style series view: drill into a show's seasons and episodes, with quick watched toggles for a whole show, a whole season, or a single episode.",
      "Filters are now adaptive — picking one narrows the others, so you're only offered options that still return results. In genre “All” (match-all) mode, only genres that actually co-occur with your current pick are shown.",
      "The Collections filter is back in the sidebar as a searchable picker that spans all your libraries.",
      "Series pages got a polish pass: season/episode quick actions and a subtle full-page art backdrop.",
    ],
    fixes: [
      "The grid now refreshes reliably after playback or a collection edit.",
      "Filter counts and ranges no longer include hidden titles, so they match what you actually see.",
    ],
    chores: [
      "Faster whole-show/season “mark watched” and quicker show opening; internal cleanup of dead code and duplication.",
    ],
  },
  {
    version: "0.36.4",
    date: "2026-07-10",
    chores: ["Internal in-app player cleanup."],
  },
  {
    version: "0.36.1",
    date: "2026-07-10",
    summary: "Scroll anywhere over the player to change the volume.",
    features: [
      "Scroll to change the volume now works anywhere over the player window — not only directly on the video.",
    ],
  },
  {
    version: "0.36.0",
    date: "2026-07-10",
    summary: "Full access to YouTube's own player menu in the in-app player.",
    features: [
      "You can now open and navigate YouTube's own player menu — Quality, Speed, Captions and More options — all the way down. When you use YouTube's built-in controls, the app's click-to-play and scroll-for-volume shortcuts briefly step aside (a small badge shows this), and they return the moment you move the pointer off the video.",
    ],
  },
  {
    version: "0.35.0",
    date: "2026-07-10",
    summary: "Two-way Plex watch sync: watch in either app and both stay in step.",
    features: [
      "Two-way Plex watch sync is complete. Mark something watched — or leave it half-finished — in Siftlode and it now updates Plex too; and anything you watch (or un-mark) in the Plex app flows back to Siftlode automatically. Turn it on in Settings → Account. (Your private “hidden” marks stay in Siftlode and are never sent to Plex.)",
    ],
    fixes: [
      "Auto-advancing to the next episode now marks the episode you actually finished — not the next one. Previously, if the next episode wasn't available locally, the wrong episode could be marked watched.",
    ],
  },
  {
    version: "0.34.2",
    date: "2026-07-09",
    summary: "Polish: the Plex watch-sync switch now responds instantly.",
    fixes: [
      'The Plex watch-sync switch now flips the moment you click it and shows an "Importing…" indicator while it works, instead of appearing to do nothing until the import finished.',
    ],
  },
  {
    version: "0.34.1",
    date: "2026-07-09",
    summary: "Fix: turning on Plex watch sync could show a server error.",
    fixes: [
      'Enabling Plex watch sync could briefly show a "Server error" if the switch was toggled again while the first import was still running. The import is now safe to run more than once, and the switch is disabled while it works. (If you saw the error, your Plex history still imported correctly.)',
    ],
  },
  {
    version: "0.34.0",
    date: "2026-07-09",
    summary: "Bring your Plex watch history into Siftlode.",
    features: [
      "Plex watch sync (first step): turn it on in Settings → Account and Siftlode imports what you've already watched (and what you're mid-way through) from Plex, so your Plex history shows up here too. Two-way syncing — so watching in either app updates the other — follows in the next updates.",
    ],
  },
  {
    version: "0.33.1",
    date: "2026-07-09",
    summary: "Fix: opening a channel no longer errors when YouTube is briefly unreachable.",
    fixes: [
      'Opening a channel page could pop a blocking "Server error" when the connection to YouTube was momentarily unavailable. The page now loads regardless — its latest channel details simply fill in once the connection is back — instead of failing.',
    ],
  },
  {
    version: "0.33.0",
    date: "2026-07-09",
    summary: "Watch your Plex library right here — a full player — plus smarter Plex search.",
    features: [
      "Plex player: play any film or episode straight from Siftlode. It resumes where you left off, remembers your volume, and — when the file's format needs it — streams through an on-the-fly conversion so it just plays.",
      "Player controls: scrub the timeline by clicking or dragging it, hover for a timestamp, switch audio tracks and subtitles, and see the expected finish time in brackets next to the time remaining. A live clock sits in the top corner.",
      "Skip Intro / Skip Credits buttons appear on marked titles, with an optional auto-skip countdown (which pauses when you pause); credits can auto-advance to the next episode.",
      "Personalise the player from the gear menu — subtitle/audio sync offsets, seek step, subtitle style (size, position, colour, background, shadow) and the corner clock. The whole player is 25% larger for lean-back viewing, and Back / Esc (keyboard or mouse) step out of an open menu before leaving the player.",
    ],
    fixes: [
      "Plex search now has its own box: it no longer leaks into — or gets left behind by — the feed search, and it clears on reload instead of greeting you with a stale query.",
      'A Plex search that comes up empty while a filter is active now says so and offers a one-click "Clear filters", instead of a bare "No matches".',
    ],
  },
  {
    version: "0.32.1",
    date: "2026-07-07",
    summary: "Fix: shared links now actually unfurl in chat apps.",
    fixes: [
      "Shared links now show a rich preview in Messenger and other chat apps. The site's robots.txt was telling every crawler — including link-preview bots — to skip /watch/ pages, so Facebook got a blocked response and showed just a bare link. Link-preview crawlers are now allowed to fetch share pages (they still stay out of search indexes).",
    ],
  },
  {
    version: "0.32.0",
    date: "2026-07-07",
    summary: "Clickable channels, poster images for any source, and a dialog-dismiss fix.",
    features: [
      "Downloads: the auto-detected channel under a download is now a clickable link to the real channel for YouTube and Facebook sources. Your existing downloads were backfilled, so they're clickable too.",
      "Downloads: a video from a source with no thumbnail (e.g. a direct Reddit video link) now gets a poster image generated from the video itself — shown on the card, on the shared watch page, and in rich link previews. Shared-link previews now use this self-hosted image, so they render reliably in chat apps and don't break over time. Existing downloads were backfilled.",
    ],
    fixes: [
      "Dialogs no longer close by accident when you press the mouse inside (e.g. selecting text in a field), drag outside, and release — a popup now only closes when the click both starts and ends on the backdrop.",
    ],
  },
  {
    version: "0.31.1",
    date: "2026-07-07",
    summary: "Fix: a download could fail when the video's title was very long.",
    fixes: [
      "Downloads: fixed a download failing right at the end when the source's title was very long (e.g. a whole recipe in the title) — the auto-filled display name overflowed its limit. Long titles are now trimmed for the name; the full title still shows everywhere else.",
    ],
  },
  {
    version: "0.31.0",
    date: "2026-07-07",
    summary:
      "Richer downloads — edit details, clickable channels & links, and prettier share-link previews.",
    features: [
      "Downloads: the edit (pencil) button now edits the full details — title, channel name and a channel link, plus any number of extra reference links. The channel and links appear on the download card as clickable links, and a source that carries a channel (like YouTube or Facebook) fills the channel link in automatically.",
      "Downloads: shared watch pages now show the correct title, channel and links — including your own edits — with every link clickable. (Renaming a download is now reflected on its share link too.)",
      "Shared links now unfurl richly in chat apps like Messenger, with the video's title, channel and thumbnail instead of a blank card. Videos without a thumbnail still show a clean text card.",
    ],
    chores: ["Shorter, clearer site description for search engines and link previews."],
  },
  {
    version: "0.30.0",
    date: "2026-07-06",
    summary: "Plex playlists — your own ordered watch-lists.",
    features: [
      'Plex playlists: create your own ordered lists of films (each user has their own — no Plex account needed). Add a film to a playlist from its info page ("Add to playlist"), then find your playlists in the Plex sidebar.',
      'Plex playlists: open a playlist to reorder (up/down), remove items, rename or delete it, and hit "Play all" to watch straight through — the player steps through the whole list in order, auto-advancing to the next.',
    ],
  },
  {
    version: "0.29.0",
    date: "2026-07-06",
    summary: "Plex collections — admins can now create and curate them.",
    features: [
      "Plex collections (admin): a movie's info page has a “Collections” button to create a new collection (seeded with that movie), add or remove the movie from your collections, and delete a collection. Changes are written back to Plex, so they show up on every client and for everyone.",
      "Plex collections (admin): existing plain Plex collections can be “taken over” (marked as yours to manage) from the same dialog. Smart collections and external auto-lists (IMDb Top 250, TMDb Trending, …) stay read-only — they're regenerated outside Plex. Editing is admin-only, since collections are shared library-wide.",
    ],
  },
  {
    version: "0.28.3",
    date: "2026-07-06",
    summary: "Fix: Plex subtitles that wouldn't play — now instant, no restart.",
    features: [
      "Plex subtitles: fixed playback failing (\"Playback couldn't start\") when picking a subtitle on films whose subtitles are external sidecar files (very common) — those aren't inside the video, so the old approach couldn't mux them. Subtitles are now served as standalone tracks the browser overlays, so turning one on (or switching) is instant and no longer restarts the video. Image-based subtitles (Blu-ray/DVD) are hidden for now (they can't be shown as text yet).",
    ],
  },
  {
    version: "0.28.2",
    date: "2026-07-06",
    summary: "Much faster, smoother Plex browsing — right-sized poster images.",
    features: [
      "Plex images: posters and art are now resized by Plex to the size actually shown (instead of shipping the full-resolution originals — some were several MB each), so the movie grid scrolls smoothly and images pop in almost instantly. Also shrinks the image cache dramatically.",
    ],
  },
  {
    version: "0.28.1",
    date: "2026-07-06",
    summary: "Fix: slow / broken Plex poster images on collection-heavy pages.",
    features: [
      "Plex images: fixed the poster/art proxy exhausting the database connection pool when a page fired many poster requests at once (the culprit behind slow, partially-loaded collection grids) — image requests no longer hold a database connection while fetching from Plex, and repeat views are served straight from the disk cache.",
    ],
  },
  {
    version: "0.28.0",
    date: "2026-07-06",
    summary:
      "Plex collections — browse them, filter by them, and see a title's collection right on its info page.",
    features: [
      "Plex collections: every Plex collection (franchises like Avatar, curated sets, and community lists like IMDb Top 250) is now mirrored locally by the background sync, so browsing is instant — no more waiting on Plex's slow collection queries.",
      "Plex library: a searchable Collection filter in the sidebar — pick a collection to see just its titles, combinable with every other filter.",
      "Plex info page: a title's collection(s) now appear as strips of the sibling films, playable straight from there (most-specific collection first).",
      "Plex info page: show or hide each collection-strip type independently — keep genuine franchises (Avatar, James Bond) while hiding the big auto-lists (IMDb Top 250, TMDb Trending), remembered per account.",
      "Plex info page: a refreshed, wider layout — content floats as frosted-glass panels over a faint, fixed backdrop of the title's own art (toggleable), matching the app's glassy look.",
    ],
  },
  {
    version: "0.27.0",
    date: "2026-07-06",
    summary:
      "Search Plex by cast & crew — find every film an actor or director is in, with clickable person cards.",
    features: [
      "Plex search: the top search box now matches cast and crew names, not just titles — search “drew” and Drew Barrymore's films come up first (ranked above films that merely mention the word).",
      "Plex search: matching actors and directors appear as person cards (photo + how many titles) above the results — click one to filter the library to their films and add them to the sidebar filter.",
    ],
  },
  {
    version: "0.26.0",
    date: "2026-07-05",
    summary:
      "Powerful Plex filters — by genre, IMDb rating, year, length, added date and age rating — and click any detail on the info page to filter by it. Plus much faster poster loading.",
    features: [
      "Plex library: a greatly expanded filter panel for movies — genre, IMDb rating, year range, length, when it was added to Plex, and age rating — plus new sort orders (release date, year, IMDb rating, length) with an ascending/descending toggle.",
      "Plex filters: pick several genres and choose Any (match one) or All (match every one); stack multiple actors, directors and studios at once (from the info page).",
      "Plex info page: the year, genres, director, cast and studio are now clickable — tap one to filter the whole library by it (e.g. every film with an actor, or everything rated 7+). Browser Back returns to the info page.",
      "Plex: posters and cast photos are cached on disk after first view, so scrolling the library is much smoother on repeat visits.",
    ],
    fixes: [
      "Plex player: leaving a video with Back now fully stops it — no more audio playing in the background until a refresh.",
    ],
  },
  {
    version: "0.25.0",
    date: "2026-07-05",
    summary:
      "Rich Plex media info — an info page from any title, an info overlay while watching, IMDb scores and cast photos.",
    features: [
      "Plex: every movie/episode now has a media info page (the “i” button on a card) with the poster, IMDb score + a link to IMDb, content rating, genres, director, a full cast list with photos, and the synopsis — plus Play/Resume and watch controls.",
      "Plex player: press “I” (or the info button) for the same rich info as an overlay, without stopping playback.",
      "Plex info: two view preferences you can toggle and that stick — a faint art backdrop and the cast & crew row.",
      "Plex: you can now mark a title unwatched or clear its resume position from the info page.",
    ],
  },
  {
    version: "0.24.0",
    date: "2026-07-05",
    summary:
      "Plex player polish: a Stop button, a keyboard help overlay, time-remaining and a clock, and Back returns you to your place in the library.",
    features: [
      "Plex player: added an explicit Stop button, a time-remaining readout next to the seek bar, and a live clock in the top corner (both fade with the controls).",
      "Plex player: press “H” (or the keyboard button) for an on-screen cheat sheet of all shortcuts.",
      "Plex player: Backspace now stops playback and returns to the library — the same as the mouse Back button — matching a typical HTPC remote.",
    ],
    fixes: [
      "Plex library: pressing Back from the player now returns you to the exact spot you were scrolled to, instead of jumping to the top of the library.",
    ],
  },
  {
    version: "0.23.2",
    date: "2026-07-05",
    summary:
      "The player now steps through the exact list it was opened with, so watching along no longer breaks Loop and Next/Previous.",
    fixes: [
      "Player: it now plays through a frozen snapshot of the filtered, sorted list it was launched with. Previously, as each video was auto-marked watched it dropped out of a filtered feed, silently shrinking the queue mid-playback — which jumped playback to an unrelated video, and stopped Loop “All” from ever wrapping back to the first video once earlier ones were watched. Next/Previous and both Loop modes now work against the original list for the whole session.",
    ],
  },
  {
    version: "0.23.1",
    date: "2026-07-05",
    summary: "Clearer Plex playback errors, and an admin media-mount check.",
    fixes: [
      "Plex player: when a video can't start, it now explains why — the media file isn't reachable on the server, or its format needs transcoding — instead of showing “Loading…” forever.",
    ],
    features: [
      "Admins: the Plex “Test connection” now also checks that a real media file is readable through the configured mount, so a missing media mount or a wrong path map is caught immediately.",
    ],
  },
  {
    version: "0.23.0",
    date: "2026-07-05",
    summary: "New optional Plex module: browse, search and play your Plex movies & TV shows.",
    features: [
      "Plex integration (optional): when your admin turns it on, a new “Plex” section appears in the sidebar. Browse and search your Plex movies and TV shows as cards, just like the feed, and drill into a show's seasons and episodes.",
      "Rich Plex player: play a movie or episode right in the app. Play/pause, resume where you left off (or restart), seek, skip intro/credits, step to the previous/next episode with auto-advance, pick the audio track and turn on subtitles, adjust volume, go fullscreen — all keyboard-controllable (Space, F, arrows).",
      "Your watched and in-progress state is saved per account and shown on the cards. Hover a card for a quick Play/Resume and a mark-watched toggle.",
      "Download the original media file straight from the player.",
      "Admins: enable and set up Plex under Settings → Configuration (server URL, token, media path map, which libraries to expose), with a “Test connection” + library picker.",
    ],
  },
  {
    version: "0.22.3",
    date: "2026-07-04",
    summary:
      "Step through the feed in the player, vertical videos fit, and downloads show their source.",
    features: [
      "In-app player: step to the previous/next video in the feed's order — click the arrows beside the player or press Shift+←/→ (plain ←/→ still seek within the video).",
      "Player auto-advance and loop, saved to your account: when a video ends, play the next, previous or a random one — and loop just that video or the whole list. Works for players opened from the feed and from playlists.",
      "Every download now shows a “downloaded from” link on the Downloads page — open the original page in a new tab, or copy the link. Works for YouTube and external links (e.g. Facebook reels).",
    ],
    fixes: [
      "The in-app player no longer blocks YouTube's own controls — volume, captions, settings and fullscreen are all clickable again.",
      "The player's title description now waits a moment before popping up, so it doesn't flash as you move the mouse past.",
      "Saved views now stick: reloading keeps the view you're on instead of snapping back to your default. (Your default view still loads on a brand-new account.)",
      "A shared vertical/short video now plays in a player that fits its shape, instead of a wide box with black bars on the sides.",
    ],
  },
  {
    version: "0.22.2",
    date: "2026-07-04",
    summary: "Faster loading everywhere and better accessibility across the app.",
    fixes: [
      "The landing page loads much faster — its preview screenshots are now served in a modern, far smaller image format, and static assets are cached so repeat visits are near-instant.",
      "The app now loads in smaller pieces: each section is fetched only when you open it, so the first screen appears sooner and a shared watch link no longer downloads the whole app.",
      "Accessibility: toggles, colour swatches, sort menus and settings inputs now carry proper labels for screen readers and voice control, across every section of the app.",
    ],
    chores: [
      "Search-engine metadata (page description, robots.txt) and a cleaner console on the public page.",
    ],
  },
  {
    version: "0.22.1",
    date: "2026-07-04",
    summary:
      "Downloaded and shared videos now play in every browser, including on iPhone and iPad.",
    fixes: [
      "Downloads now use widely-compatible video (H.264) and audio (AAC) so a saved file — and a public watch link — plays everywhere, including iOS/Safari, where the previous format left a broken player. Existing downloads keep their old format; re-download to get the compatible version.",
    ],
  },
  {
    version: "0.22.0",
    date: "2026-07-04",
    summary:
      "The Download Center — save videos to the server, edit them into clips, and share them.",
    features: [
      "Download Center: save any video (or a search result) to the server with yt-dlp, laid out Plex-style with a poster + info file. Choose a built-in format preset or make your own, keep an eye on your per-user storage quota, and save the finished file to your device.",
      "Built-in video editor: trim, crop, and cut a download into segments — keep the parts you want as separate clips or join them into one file. Pick a precise (frame-accurate) or fast cut, with a scrub timeline and a hover preview.",
      "Sharing: share a download with another user (it appears in their “Shared with me”, where they can edit their own copy or remove it), or hand out a public watch link that plays on a clean, login-free page — with an optional password, an expiry, and a stream-only vs downloadable toggle.",
      "Tidier video titles across the feed, search and downloads — clickbait ALL-CAPS and trailing hashtag clutter are cleaned up for display (the original title is kept underneath).",
    ],
    fixes: [
      "The browser tab now carries an app icon and shows the section you're on; clicking the Siftlode logo returns you to the feed.",
    ],
  },
  {
    version: "0.21.0",
    date: "2026-07-02",
    summary:
      "Run a different account in each browser tab, a roomier collapsible layout, and nav polish.",
    features: [
      "Multi-account, per tab: open two tabs and sign into a different account in each — each tab stays on its own account. Switching or adding an account in one tab no longer changes what the others show. Every tab keeps its own filters, theme and settings.",
      "Roomier layout: the filter sidebar is now a full-height column you can collapse like the left nav (a thin rail keeps the active-filter count). Your video counts and sync status moved to the top of the left rail, and the Mine/Library switch sits with the filters. Both panels remember whether you left them open or collapsed.",
      "Nav touches: a role badge (admin / user / demo) next to your name, the current language (HU/EN/DE) shown on the language button, and a clearer “Admin” divider above the admin tools.",
      "The sign-in page now highlights that Siftlode is open source, with a link to the code.",
    ],
    fixes: [
      "Your filters, selected playlist, theme and other per-browser settings no longer carry over between different accounts signed into the same browser.",
      "Opening one pop-up from inside another (e.g. Release notes from the About box) no longer makes it flash and vanish.",
    ],
  },
  {
    version: "0.20.2",
    date: "2026-07-01",
    summary: "A pop-up flash fix, and an open-source link on the sign-in page.",
    features: ["Siftlode is open source — the sign-in page now links to its public source code."],
    fixes: [
      "Opening one pop-up from inside another — for example Release Notes from the About box — no longer makes it flash and vanish instantly. It opens and stays put, and Back closes it as expected.",
    ],
  },
  {
    version: "0.20.1",
    date: "2026-07-01",
    summary: "A refreshed sign-in / landing page.",
    chores: [
      "Rewrote the landing-page copy and replaced its preview screenshots with richer, real examples. No change to the app itself.",
    ],
  },
  {
    version: "0.20.0",
    date: "2026-07-01",
    summary: "Saved views: keep several filter setups and switch between them in one click.",
    features: [
      "Saved views: save your current feed filters (and sort) under a name, then apply them again with a single click. Rename them, drag to reorder, share a view by link, and star one as your default — the default loads automatically when you open the app. They live in a new “Saved views” box at the top of the filter sidebar.",
    ],
    fixes: [
      "The “Filters active” count and Clear all now also cover the Source filter and the Mine/Library switch, so clearing gives a truly clean slate — back to Mine with search results hidden. The default view (Mine, unwatched, no search results) is unchanged.",
      "The search box now has a clear (✕) button. Clearing your filters keeps the search text — the search has its own ✕ — and clearing the search returns the feed to its normal order.",
    ],
  },
  {
    version: "0.19.0",
    date: "2026-07-01",
    summary: "Channel pages, much smarter search, and self-tidying YouTube search results.",
    features: [
      "Channel pages: open any channel's own page inside Siftlode — banner, stats (subscribers, videos, views, joined) and its uploads, with Videos and About tabs. Click a channel name anywhere to open it.",
      "Explore channels you don't follow: opening an un-subscribed channel loads its recent uploads just for you — private until you subscribe. Channels you explore but don't keep tidy themselves away automatically after a while.",
      "Smarter search: results are now relevance-ranked and match far more than the title — a video's tags, its description, and even the searches that first surfaced it all count, so you can find things by meaning instead of exact words. In your own feed (Mine), a Source filter separates your subscriptions from your search finds.",
      "Temporary search results: live YouTube search results are clearly marked temporary — they clear themselves unless you watch or save one, with a “Clear now” button to do it at once. Pick how many to fetch (20/40/60/100), and videos you already have are sorted below fresh discoveries.",
      "Block channels: hide a channel everywhere — from search, your feed and channel pages — and manage your blocked channels from the Channel manager.",
      "The Channel manager gets a search box and clickable tag chips, and a floating “back to top” button appears on long pages.",
    ],
    fixes: [
      "The Back button no longer does nothing the first time: after you closed the video player (or a dialog) with its ✕/Escape and opened another, the next Back press now closes it right away — everywhere in the app.",
      "Reloading the page now keeps your YouTube search results on screen (they re-fetch for free) instead of dropping you back to the feed.",
    ],
  },
  {
    version: "0.18.0",
    date: "2026-06-29",
    summary:
      "Search all of YouTube from your feed, and new keyboard/scroll controls in the video player.",
    features: [
      "Live YouTube search: type a search and press Enter (or the YouTube button) to search all of YouTube right from the feed — results show up as normal cards you can play, save and add to playlists. They're kept out of your regular Library by default; a Source filter lets you show or hide search-found videos. Shorts and currently-live/upcoming results are left out automatically.",
      "Live search uses no YouTube API quota by default, so it's no longer limited to a handful of searches per day. (Admins can switch back to the official API under Configuration → Quota if the quota-free source ever stops working.)",
      "Video player shortcuts: press F for fullscreen, Space to play/pause, and scroll the mouse wheel over the video to change the volume (with an on-screen volume bar). YouTube's own controls — the seek bar, captions and settings — still work as before.",
      "Feed search now ignores accents, so searching “tiesto” also finds “Tiësto”.",
    ],
    fixes: [
      "After a live YouTube search, the Back button now closes the open video player first and keeps you on the search results, instead of jumping straight back to your feed.",
      "The search box no longer flickers or briefly blanks the feed while you type.",
    ],
  },
  {
    version: "0.17.0",
    date: "2026-06-29",
    summary: "Messaging and notification fixes, plus a large under-the-hood cleanup.",
    fixes: [
      "Switching between signed-in accounts no longer drops you on a blank chat: after you switch, a message you just received shows up in the right conversation instead of an empty screen.",
      "You're now reliably notified when a video you'd saved or added to a playlist is removed because it's no longer available on YouTube — this notice could previously be missed.",
      "“Time remaining” estimates (e.g. on sync progress) and a few small labels are now translated in Hungarian and German like the rest of the app.",
    ],
    chores: [
      "A large internal code cleanup: removed duplicated logic across the backend and frontend and factored out shared building blocks (form controls, the save/discard bar, popovers, browser-storage helpers, time/date formatters). No change to how the app behaves — groundwork that keeps future features consistent and quicker to build.",
    ],
  },
  {
    version: "0.16.2",
    date: "2026-06-26",
    summary: "Smoother navigation and tidier access-request handling.",
    fixes: [
      "The browser/mouse Back button now steps back the way you'd expect: from an open message conversation it returns to your conversation list (not the previous module), and it closes the video player or an open dialog instead of jumping off the page.",
      "Access requests: the “Review” link opens straight to the Access requests tab, the notice clears itself the moment you approve (no refresh needed), and a leftover sign-in link no longer lingers in the address bar.",
    ],
  },
  {
    version: "0.16.1",
    date: "2026-06-26",
    summary: "Clearer action messages, and a fix for background syncing on self-hosted setups.",
    fixes: [
      "Action confirmations now name what they acted on — which channel was unsubscribed or reset, which address was added to a list, which tag was deleted, and which playlist was reloaded or synced.",
      "Background syncing keeps working when the server's public IP changes: an instance can now be pointed at a fixed-IP egress proxy, so an IP-restricted YouTube API key no longer breaks after a network change.",
    ],
  },
  {
    version: "0.16.0",
    date: "2026-06-26",
    summary: "Private messaging: chat with other members in real time, end-to-end encrypted.",
    features: [
      "A new Messages module: send direct messages to other members of your instance. Messages are end-to-end encrypted — only you and the person you're chatting with can read them, not even an admin. The first time you open it, you set a message passphrase that protects your key; it never leaves your device.",
      "Real-time delivery: messages arrive instantly, with an unread badge on the Messages icon. A new message pops up (or flashes) a small Messenger-style chat window in the bottom-right corner that you can keep using while you browse — minimise, close, or open several at once.",
      "A friendly Siftlode welcome message greets you in your inbox on first arrival.",
    ],
  },
  {
    version: "0.15.0",
    date: "2026-06-25",
    summary: "A faster, smoother feed that stays light no matter how far you scroll.",
    features: [
      "The feed now draws only the videos currently on screen, so scrolling stays fluid and the page stays light even after you've loaded thousands of videos.",
      "Paging through the feed is quicker and steadier: scrolling deep into a large catalogue no longer slows down, and videos arriving in the background while you scroll can no longer cause an item to show up twice or be skipped.",
    ],
  },
  {
    version: "0.14.1",
    date: "2026-06-21",
    summary:
      "Internal cleanup: the project's original working name was fully retired in favour of Siftlode.",
    chores: [
      "Renamed the last remaining references to the project's original codename throughout the codebase, deployment config and database identity. No behavioural change. One side effect: locally remembered view preferences (theme, feed filters, dismissed hints) reset to their defaults once, because the browser-storage keys were renamed too.",
    ],
  },
  {
    version: "0.14.0",
    date: "2026-06-21",
    summary: "Run your own Siftlode: a guided first-run setup and a one-command self-host package.",
    features: [
      "A first-run setup wizard: the very first time a fresh instance is opened, a guided wizard walks you through creating the first admin account and (optionally) entering your Google and email credentials — no editing config files by hand. Once finished, the instance is marked configured and the wizard steps aside.",
      "Google sign-in is now optional: if an instance hasn't been given Google credentials, the Google buttons and YouTube-account features are simply hidden, so a self-hoster can run the app with email-and-password accounts only.",
    ],
    chores: [
      "A one-command self-host package: a ready-made compose file with a bundled database plus install scripts for Linux/macOS and Windows that generate the needed secrets, start everything and print the setup URL. The app now ships as a prebuilt image, so hosts pull the exact released artifact instead of building it.",
    ],
  },
  {
    version: "0.13.0",
    date: "2026-06-19",
    summary:
      "Sign in with email & password (not just Google), a redesigned welcome page, account management for admins, and self-service account deletion.",
    features: [
      "Sign in with an email and password, alongside Google. Register with email+password (with email verification and admin approval), set or change a password under Settings → Account, and link a Google account to your existing account — or set a password on a Google-only account — so either method gets you in.",
      "A redesigned welcome page: a short product tour with screenshots you can click to enlarge, and a one-click way to try the shared demo.",
      "Admin account management: a Users page with tabs for roles, access requests and the demo whitelist. Promote or demote users, suspend or unsuspend an account (a suspended user can't sign in by any method and is signed out at once), and delete an account. The affected person is emailed on approval, role change, suspension, reinstatement and deletion.",
      "Delete your account yourself: Settings → Account now has a permanent “delete my account and all data” option that erases your subscriptions, tags, watch history and playlists, revokes the app's access to your Google account, and emails you a confirmation.",
    ],
    fixes: [
      "Landing-page screenshots now appear in the real app, not only the dev preview; a suspended or deleted account is taken to the login page right away with a clear explanation; and the login page no longer occasionally flickers.",
      "Signing in with Google now correctly counts your email as verified, and an admin-assigned role is kept across logins instead of being reset.",
    ],
    chores: [
      "Tab-ified the admin Configuration and Users pages, and added a reusable tab and image-lightbox component.",
      "Self-hosting without email configured still works: registrations are auto-verified and gated by admin approval. The demo account now shows sample channels in its Channel manager.",
    ],
  },
  {
    version: "0.12.0",
    date: "2026-06-19",
    summary:
      "A dedicated Usage & stats page, a live Configuration page for admins, and polish on the channel-discovery list.",
    features: [
      "Usage & stats is now its own page (moved out of Settings): see your sync status and your personal API usage at a glance, with a clear, translated breakdown by action. Admins get an extra System tab with the instance-wide quota dashboard and the background-sync pause control.",
      "“Discover from playlists” now shows each channel's total video count, so you can size it up before following — and subscribing asks for confirmation first, since it changes your real YouTube account and uses a little quota.",
    ],
    chores: [
      "Admins can edit operational settings live from a new Configuration page — email/SMTP, the YouTube API key, the daily quota budget, and backfill/Shorts-probe limits — stored in the database and applied without a redeploy. Secrets (SMTP password, API key) are encrypted and write-only.",
      "Standardized the names of API-usage actions with full English/Hungarian/German labels, and unified the version/demo banners into one reusable component.",
    ],
  },
  {
    version: "0.11.2",
    date: "2026-06-19",
    summary: "Clearer messages when a YouTube action can't be completed.",
    fixes: [
      "When a YouTube action can't go through — syncing or pushing a playlist, removing a playlist on YouTube, or looking up a video — you now get a clear explanation of why, instead of a misleading “connection lost” notice.",
    ],
  },
  {
    version: "0.11.1",
    date: "2026-06-19",
    summary: "A fix for subscribing from the discovery list.",
    fixes: [
      "Subscribing to a channel you already follow on YouTube now simply records it here instead of showing a misleading “connection lost” error — which also clears the case where such a channel kept reappearing under “Discover from playlists”.",
    ],
    chores: [
      "YouTube-side action failures now surface as a clear message instead of being mistaken for a transient connection drop.",
    ],
  },
  {
    version: "0.11.0",
    date: "2026-06-19",
    summary:
      "Discover channels from your playlists, notifications that link to where they point, and a clearer, faster background sync.",
    features: [
      "Discover channels from your playlists: the Channel manager has a new “Discover from playlists” tab listing channels that appear in your playlists but that you don't follow yet. Each shows its subscriber count and avatar so you can size it up first, then follow it in one click — your own channel is left out.",
      "Notifications now link to where they point, and the links keep working after a reload: subscribing names the channel with shortcuts to open it in the Channel manager or on YouTube; a “Marked watched” notice gains a “Find in feed” action (matching “Hidden”); and a finished background job links back to the Scheduler.",
    ],
    fixes: [
      "The header's sync indicator now spins only while a sync is actually running — instead of perpetually whenever some full-history backfill was still pending — and it refreshes more promptly while work is in progress.",
      "“N without full history” in the header now reliably opens the Channel manager on the right tab and shows exactly those channels, even if you'd previously left a channel filter applied.",
      "New uploads are picked up faster: the background feed check now reads many channels' feeds at once instead of one by one, cutting a full pass from minutes to seconds.",
    ],
    chores: [
      "Shared a single channel-link component and YouTube-URL helper across the app, and the admin Scheduler now shows live progress for every job type.",
    ],
  },
  {
    version: "0.10.0",
    date: "2026-06-19",
    summary: "Settings you save explicitly, plus a calmer, more honest playback experience.",
    features: [
      "Settings now save explicitly: your changes preview instantly, but only apply to your account when you press Save — with a clear “Settings saved” confirmation. A Discard button reverts everything, and switching to another section with unsaved changes asks before discarding them.",
    ],
    fixes: [
      "The in-app player no longer throws a spurious “Server error (502)” when a video finishes or while the server is briefly busy: passing hiccups are retried automatically, and if the server is momentarily unreachable you get a single “connection lost” notice that clears itself the moment it's back — instead of an error you had to dismiss.",
      "Confirmations like “Marked watched” or “Hidden” now appear only after the server has actually applied the change, so you'll never see a success message for something that didn't go through.",
      "Tidied the Settings page height — no more unnecessary empty space and scrolling.",
    ],
  },
  {
    version: "0.9.0",
    date: "2026-06-18",
    summary:
      "A notifications inbox, and automatic clean-up of videos that can no longer be played.",
    features: [
      "New Notifications center in the left sidebar, with an unread badge: one place for both durable system updates (about your library and background jobs) and your recent activity (with quick Unhide / Unwatch / Find-in-feed actions). Mark items read, dismiss them individually, or clear everything. Pop-up toasts still appear as before.",
      "Automatic library maintenance: a background job spots videos that can no longer be played anywhere — deleted, made private, or premieres that never went live — hides them from your feed right away, and removes them after a grace period. Genuine 24/7 livestreams are left alone.",
      "If a video you'd saved or added to a playlist gets removed this way, you get a single summary notification listing them — never one message per video.",
      "Admin Scheduler: run any background job on demand with a “Run now” button (or “Start all now”), watch a live progress bar while long jobs run, and get an inbox notification with the result when a job you started finishes.",
    ],
  },
  {
    version: "0.8.0",
    date: "2026-06-18",
    summary: "Richer channel columns, a proper tag workflow, video reset, and clearer errors.",
    features: [
      "Channel manager: new sortable columns — last upload, total length, and a Normal/Shorts/Live breakdown — with subscriber counts shown compactly (e.g. 919K). Columns size to their content.",
      "Tags, reworked: each channel row now shows only the tags you've attached, with a “+” to add or remove them per channel. A tag manager (open it from the Channel manager or the feed sidebar) lets you add, rename and delete tags — deleting only asks to confirm when a tag is actually in use.",
      "Filter the feed by a tag: click a tag on a channel, and a new “Your tags” widget in the feed sidebar shows that filter so you can see and clear it. In the tag manager, hovering a tag's channel count lists those channels, each a link that jumps to it in the Channel manager.",
      "Video cards get a reset action that returns a video to pristine — clearing watch progress and status, as if you'd never opened it.",
    ],
    fixes: [
      "When the server can't complete an action (for example a duplicate tag name), you now get a clear pop-up explaining why, instead of a cryptic failure.",
      "Pressing Esc with a dialog stacked over another now closes only the top one, leaving your work underneath open.",
    ],
  },
  {
    version: "0.7.0",
    date: "2026-06-17",
    summary:
      "A redesigned, sortable Channel manager — plus a reorganized sidebar and several fixes.",
    features: [
      "Channel manager is now a sortable, filterable table: sort by any column, filter channels by name or tag straight from the headers, choose how many rows per page (or show them all), and jump to any page. Your sorting, filters and page are remembered across reloads.",
      "Channel rows: open a channel on YouTube (middle-click the name or the ↗ icon), a single “fully synced” badge once a channel is fully caught up, and instant tag toggling. Admins can reset a channel to re-fetch it from scratch.",
      "Reorganized left sidebar: your content (Feed, Channels, Playlists) and the admin tools (Stats, Scheduler) are now grouped, and the language, About and notifications controls moved into the sidebar. Pop-up notifications now appear bottom-left, by the bell.",
      "Playlists: the “new playlist” box moved to the top of the list.",
    ],
    fixes: [
      "Marking a video watched at the end of playback now sticks — it leaves the Unwatched feed and stays gone after a refresh.",
      "Settings now remembers which tab you were on after a reload.",
      "The usage chart's daily bars are always visible now, not just on hover.",
    ],
  },
  {
    version: "0.6.0",
    date: "2026-06-16",
    summary: "Admins get a live Background Scheduler dashboard.",
    features: [
      "New admin Scheduler page: a live, self-refreshing view of the background jobs — what's running, each job's last result and a countdown to its next run — plus the work still queued and the shared API quota. Each job has a tooltip explaining what it does, and its run frequency is editable inline.",
    ],
  },
  {
    version: "0.5.1",
    date: "2026-06-16",
    summary: "A clearer message when a video can't play in the in-app player.",
    fixes: [
      "When a video can't be played here — some music tracks and other videos have embedding disabled by their owner — the player now shows a clear note and an “Open on YouTube” button instead of a blank error screen.",
    ],
  },
  {
    version: "0.5.0",
    date: "2026-06-16",
    summary: "Clearer live videos — and they now settle into normal videos once they end.",
    features: [
      "Live and premiere videos now show a LIVE / upcoming badge where the duration usually sits, so a missing runtime is obviously by design, not a gap.",
    ],
    fixes: [
      "When a live stream ends, it now updates by itself into a normal video with its real length, instead of staying stuck as “live” with no duration.",
    ],
    chores: [
      "Shared demo-account mode: a curated whitelist can preview the app (shared library, playlists, hiding) without signing in; admin whitelist + state reset in Settings.",
    ],
  },
  {
    version: "0.4.1",
    date: "2026-06-16",
    summary: "Feed controls above the videos, and clearer view counts and dates.",
    features: [
      "The view filter (Unwatched / In progress / All / …) and the content type (Normal / Shorts / Live) are now quick chips right above the videos.",
      "Cleaner ordering: pick what to sort by, then flip ascending/descending with one arrow (and 'Most viewed' is now 'Popular').",
      "Video cards and the player show the exact upload date next to '… ago', and the full view count on hover.",
    ],
  },
  {
    version: "0.4.0",
    date: "2026-06-16",
    summary: "A clearer left-hand navigation, a glassier look, and account switching.",
    features: [
      "New left navigation sidebar: Feed, Channels, Playlists and Stats are now always visible (no longer tucked under your avatar), and the rail collapses to icons when you want more room.",
      "Switch accounts without signing in again: the account menu lists everyone signed in on this browser — pick one to switch instantly, or “Add another account”. Signing out drops you to the next account if you have one.",
      "Settings is now its own page that opens right where you are, instead of a panel sliding in from the far side.",
      "The browser/back button now steps back through the app (Feed, Channels, …) instead of leaving the app.",
      "A frosted-glass refresh across the navigation, header and dialogs.",
    ],
  },
  {
    version: "0.3.0",
    date: "2026-06-16",
    summary:
      "Playlists — build your own, mirror your YouTube ones, and sync edits back to YouTube.",
    features: [
      "Local playlists: create named, ordered playlists, reorder by drag, and add videos straight from the feed or the player. Play a whole playlist with auto-advance and prev/next.",
      "Watch later is now a built-in playlist — the bookmark button adds to it, and you can play and manage it like any other list.",
      "Your YouTube playlists are mirrored in automatically and kept fresh, shown with a YouTube badge and an “open on YouTube” link.",
      "Two-way YouTube sync: export a local playlist to YouTube, or push your edits (add, remove, reorder, rename) back to a linked playlist. Every push shows an estimate and a confirm first, because YouTube playlist writes are quota-heavy.",
      "Edit mirrored playlists freely — your unsynced changes are protected from the automatic refresh, an “Unsynced” marker shows when you have pending edits, and “Reset to YouTube” discards them to reload the original.",
      "Sort a playlist by title, duration or channel (ascending/descending) and optionally group by channel — with full undo/redo (buttons and Ctrl/Cmd+Z / Ctrl+Y).",
      "The playlist list can be ordered by name, item count or total length (and float your unsynced lists to the top); it shows each list’s total length and remembers your selection.",
    ],
  },
  {
    version: "0.2.0",
    date: "2026-06-15",
    summary: "Browse beyond your own subscriptions, and a much smarter filter sidebar.",
    features: [
      "Shared library: a new Mine / Library switch in the header lets you browse every channel the community has added — not just your own subscriptions — and even works without granting YouTube access. Your watch, save and hide state always stays private to you.",
      "Smarter filter chips: topic and language chips now show live counts for your current view and hide the ones that no longer match anything, so narrowing down is quicker. Chips are ordered by size, and topics have a clear Any / All match toggle (All = channels that have all the selected topics).",
      "“Surprise me” ordering now has a reshuffle button to reroll the order, and the topic/language chips show how many channels fall under each.",
      "Share a view: copy a link that reproduces your current filters. Filters are otherwise no longer kept in the address bar.",
    ],
    fixes: [
      "The channel manager now tells apart a full-history backfill you requested from one another member already queued, and the header shows “fetching history” while the back-catalogue is still downloading instead of claiming everything is synced.",
    ],
  },
  {
    version: "0.1.0",
    date: "2026-06-15",
    // sha filled in when v0.1.0 is tagged at release time.
    summary:
      "First release: a self-hosted, multi-user reader for your own YouTube subscriptions — " +
      "fast local-first feed with rich filtering, in-app playback with resume, and channel management.",
    features: [
      "Multi-user feed of your own YouTube subscriptions: invite-only Google sign-in, per-user watch/save/hide state, encrypted token storage.",
      "Ingest: subscription import, free RSS new-video detection, recent-first and full-history backfill, metadata enrichment (duration, views, category, Shorts & livestream classification), a shared daily API-quota guard, and a background scheduler.",
      "Automatic tagging: system tags for channel language and topic (your own tags are never overwritten).",
      "Reader UI: grid/list feed scoped to your subscriptions; faceted tag filters, content-type toggles (Normal / Shorts / Live), date range, search and sort; four colour schemes (dark/light) with adjustable text size.",
      "In-app player: a modal YouTube player that resumes where you left off, auto-marks watched near the end, and turns description timestamps and links into clickable seeks.",
      "Watch progress: a resume progress bar on video cards, Continue / Restart buttons, and an “In progress” feed filter — your position is saved server-side, so it follows you across devices.",
      "Channel manager: per-channel priority, hide, personal tags, sync badges, and per-channel full-history opt-in.",
      "Header status: your video count vs. the whole catalogue, sync progress, and (for admins) a pause control; onboarding wizard; notification centre; admin usage & quota stats.",
      "Multilingual interface — switch between English, Hungarian and German; your choice is saved to your account and the default is guessed from your Google locale.",
      "About dialog and this Release Notes view, with a heads-up banner when a new version ships.",
    ],
    fixes: [
      "Backfill no longer skips the band of videos sitting on the 365-day boundary page.",
      "A channel whose full catalogue is already stored is no longer stuck showing “needs full history”.",
    ],
    chores: [
      "Public-readiness repo hygiene: internal planning/infra details removed, build stamped with version/commit.",
    ],
  },
];
