style(frontend): Prettier config + one-time repo-wide format pass
Prettier 3 (pinned), printWidth 100, double quotes — chosen to match the existing hand-formatting and minimise reflow. This commit is ONLY the mechanical format pass (`prettier --write`) plus the config/ignore/scripts, isolated so it never pollutes a feature diff. Verified behaviour-neutral: typecheck, eslint (0 errors), and vitest all green before and after. See .git-blame-ignore-revs — `git blame` skips this sha.
This commit is contained in:
@@ -21,16 +21,16 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
"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.",
|
||||
'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\".",
|
||||
'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.",
|
||||
'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: [
|
||||
@@ -60,12 +60,12 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
"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.",
|
||||
'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 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.",
|
||||
],
|
||||
},
|
||||
@@ -82,8 +82,7 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
version: "0.45.0",
|
||||
date: "2026-07-19",
|
||||
summary:
|
||||
"Read the feed the way you like it, and explore your Plex library by cast.",
|
||||
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.",
|
||||
@@ -181,9 +180,7 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
version: "0.39.1",
|
||||
date: "2026-07-12",
|
||||
fixes: [
|
||||
"Signing out and back in no longer disconnects your YouTube access.",
|
||||
],
|
||||
fixes: ["Signing out and back in no longer disconnects your YouTube access."],
|
||||
},
|
||||
{
|
||||
version: "0.39.0",
|
||||
@@ -197,9 +194,7 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
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.",
|
||||
],
|
||||
fixes: ["The Plex library no longer stops loading more titles after you open one and go back."],
|
||||
},
|
||||
{
|
||||
version: "0.37.0",
|
||||
@@ -223,9 +218,7 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
version: "0.36.4",
|
||||
date: "2026-07-10",
|
||||
chores: [
|
||||
"Internal in-app player cleanup.",
|
||||
],
|
||||
chores: ["Internal in-app player cleanup."],
|
||||
},
|
||||
{
|
||||
version: "0.36.1",
|
||||
@@ -259,7 +252,7 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
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.",
|
||||
'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.',
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -267,7 +260,7 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
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.)",
|
||||
'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.)',
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -332,23 +325,22 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
version: "0.31.0",
|
||||
date: "2026-07-07",
|
||||
summary: "Richer downloads — edit details, clickable channels & links, and prettier share-link previews.",
|
||||
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.",
|
||||
],
|
||||
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.",
|
||||
'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.',
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -387,7 +379,8 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
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.",
|
||||
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.",
|
||||
@@ -399,7 +392,8 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
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.",
|
||||
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.",
|
||||
@@ -408,7 +402,8 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
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.",
|
||||
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).",
|
||||
@@ -422,7 +417,8 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
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.",
|
||||
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.",
|
||||
@@ -433,7 +429,8 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
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.",
|
||||
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.",
|
||||
@@ -446,7 +443,8 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
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.",
|
||||
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.",
|
||||
],
|
||||
@@ -477,7 +475,8 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
version: "0.22.3",
|
||||
date: "2026-07-04",
|
||||
summary: "Step through the feed in the player, vertical videos fit, and downloads show their source.",
|
||||
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.",
|
||||
@@ -506,7 +505,8 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
version: "0.22.1",
|
||||
date: "2026-07-04",
|
||||
summary: "Downloaded and shared videos now play in every browser, including on iPhone and iPad.",
|
||||
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.",
|
||||
],
|
||||
@@ -514,7 +514,8 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
version: "0.22.0",
|
||||
date: "2026-07-04",
|
||||
summary: "The Download Center — save videos to the server, edit them into clips, and share them.",
|
||||
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.",
|
||||
@@ -528,7 +529,8 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
version: "0.21.0",
|
||||
date: "2026-07-02",
|
||||
summary: "Run a different account in each browser tab, a roomier collapsible layout, and nav polish.",
|
||||
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.",
|
||||
@@ -544,9 +546,7 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
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.",
|
||||
],
|
||||
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.",
|
||||
],
|
||||
@@ -591,7 +591,8 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
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.",
|
||||
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.)",
|
||||
@@ -665,8 +666,7 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
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.",
|
||||
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.",
|
||||
@@ -762,7 +762,8 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
version: "0.9.0",
|
||||
date: "2026-06-18",
|
||||
summary: "A notifications inbox, and automatic clean-up of videos that can no longer be played.",
|
||||
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.",
|
||||
@@ -788,7 +789,8 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
version: "0.7.0",
|
||||
date: "2026-06-17",
|
||||
summary: "A redesigned, sortable Channel manager — plus a reorganized sidebar and several fixes.",
|
||||
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.",
|
||||
@@ -871,8 +873,7 @@ export const RELEASE_NOTES: ReleaseEntry[] = [
|
||||
{
|
||||
version: "0.2.0",
|
||||
date: "2026-06-15",
|
||||
summary:
|
||||
"Browse beyond your own subscriptions, and a much smarter filter sidebar.",
|
||||
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).",
|
||||
|
||||
Reference in New Issue
Block a user