diff --git a/README.md b/README.md index ebc3b11..580e825 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ channels you follow into one clean, filterable feed — no algorithm deciding wh Shorts or livestream noise unless you want it. Self-hosted, multi-user, and private: your data stays on your own server. -![Siftlode feed](frontend/public/welcome/feed.png) +![Siftlode feed](frontend/public/welcome/feed.webp) Everything expensive (channels, videos, metadata) is fetched from YouTube once and stored locally, so filtering, searching and sorting are instant and don't burn API quota. Click a video to watch it @@ -16,8 +16,8 @@ blocker and SponsorBlock keep working. - **A readable subscription feed** — sort and filter by channel, tag, language, topic, length, upload date or watch state; hide channels without unsubscribing; save filter setups as named views. -- **Search all of YouTube** from the feed — results play, save and add to playlists like any other - video, and are materialised into your catalog. +- **Search all of YouTube** from the feed — live results you can play, save or add to playlists like + any other video; they stay temporary and out of your catalog unless you keep one. - **Channel pages & a channel manager** — per-channel stats and uploads, priorities, and your own tags to slice the feed by. - **Playlists with two-way YouTube sync** — build them locally, keep them in sync in both directions. @@ -25,6 +25,8 @@ blocker and SponsorBlock keep working. - **Download Center** — save videos to the server with yt-dlp in a Plex-friendly layout (format presets, per-user storage quota), trim / crop / split & join them in a built-in editor, then save to your device, share with another user, or hand out a public watch link. +- **Plex library** *(optional)* — point Siftlode at your own Plex server to browse and play its + movies and shows alongside your feed, with watch state kept in sync. - **Multi-user** with per-user private state, a shared catalog, and a fair daily API-quota guard. - **Self-hosted & private**, with a first-run web setup wizard and the interface in **English and Hungarian**. diff --git a/VERSION b/VERSION index ad0b33d..e8f304f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.57.2 \ No newline at end of file +0.58.0 \ No newline at end of file diff --git a/frontend/public/welcome/channels.webp b/frontend/public/welcome/channels.webp new file mode 100644 index 0000000..b90e345 Binary files /dev/null and b/frontend/public/welcome/channels.webp differ diff --git a/frontend/public/welcome/downloads.webp b/frontend/public/welcome/downloads.webp new file mode 100644 index 0000000..679a4fe Binary files /dev/null and b/frontend/public/welcome/downloads.webp differ diff --git a/frontend/public/welcome/feed.webp b/frontend/public/welcome/feed.webp new file mode 100644 index 0000000..30ebdd6 Binary files /dev/null and b/frontend/public/welcome/feed.webp differ diff --git a/frontend/public/welcome/player.webp b/frontend/public/welcome/player.webp new file mode 100644 index 0000000..2ddb3bb Binary files /dev/null and b/frontend/public/welcome/player.webp differ diff --git a/frontend/public/welcome/playlists.webp b/frontend/public/welcome/playlists.webp new file mode 100644 index 0000000..8d33fe2 Binary files /dev/null and b/frontend/public/welcome/playlists.webp differ diff --git a/frontend/public/welcome/plex.webp b/frontend/public/welcome/plex.webp new file mode 100644 index 0000000..b59c5a9 Binary files /dev/null and b/frontend/public/welcome/plex.webp differ diff --git a/frontend/public/welcome/search.webp b/frontend/public/welcome/search.webp new file mode 100644 index 0000000..513d326 Binary files /dev/null and b/frontend/public/welcome/search.webp differ diff --git a/frontend/src/components/Welcome.tsx b/frontend/src/components/Welcome.tsx index 313c3ff..48d6462 100644 --- a/frontend/src/components/Welcome.tsx +++ b/frontend/src/components/Welcome.tsx @@ -2,7 +2,9 @@ import { useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { ArrowRight, + Clapperboard, Code2, + Download, Expand, Filter, Inbox, @@ -115,20 +117,19 @@ export default function Welcome() { - {/* Secondary showcase — smaller thumbnails; click to view full size. */} -
- - + {/* Gallery — one shot per module; click any to view it full size. */} +
+
+ {GALLERY.map((g) => ( + + ))} +
@@ -159,12 +160,25 @@ export default function Welcome() { ); } +// The screenshot gallery below the hero — one shot per module, each opening full-size in the +// lightbox. Order roughly follows the nav rail; the feed leads as the hero above the fold. +const GALLERY: { key: string; src: string }[] = [ + { key: "channels", src: "/welcome/channels.webp" }, + { key: "playlists", src: "/welcome/playlists.webp" }, + { key: "search", src: "/welcome/search.webp" }, + { key: "player", src: "/welcome/player.webp" }, + { key: "downloads", src: "/welcome/downloads.webp" }, + { key: "plex", src: "/welcome/plex.webp" }, +]; + const FEATURES: { key: string; icon: LucideIcon }[] = [ { key: "readable", icon: Filter }, { key: "neverMiss", icon: Inbox }, { key: "search", icon: Search }, { key: "playlists", icon: ListVideo }, { key: "player", icon: PlayCircle }, + { key: "downloads", icon: Download }, + { key: "plex", icon: Clapperboard }, { key: "private", icon: Lock }, ]; diff --git a/frontend/src/i18n/locales/en/welcome.json b/frontend/src/i18n/locales/en/welcome.json index 1d6b39e..2d7f071 100644 --- a/frontend/src/i18n/locales/en/welcome.json +++ b/frontend/src/i18n/locales/en/welcome.json @@ -1,24 +1,28 @@ { "hero": { - "title": "Your YouTube subscriptions, the way a feed should work.", - "subtitle": "Every upload from the channels you follow in one clean, filterable feed — no algorithm deciding what you see, and no Shorts or livestream noise unless you want it.", - "trust": "Self-hosted and private. Sign in with email, or continue with Google." + "title": "Your subscriptions, in one quiet feed.", + "subtitle": "Every upload from the channels you follow, in one place you can actually filter, search and sort. No algorithm deciding what you see — and no Shorts or livestreams unless you want them.", + "trust": "Self-hosted and private: your data stays on your own server. Sign in with email, or continue with Google." }, "openSource": { "title": "Free and open source", - "body": "Siftlode's code is public — see how it works, run your own private instance, or open an issue.", + "body": "The whole thing is open — read the code, run your own private copy, or open an issue.", "link": "View the source" }, "preview": { "feed": "The feed — filter by channel, language, topic, length and date.", "channels": "Channel manager", - "playlists": "Playlists" + "playlists": "Playlists", + "player": "In-app player", + "downloads": "Download Center", + "search": "Search results", + "plex": "Your Plex library" }, "features": { - "heading": "Why Siftlode", + "heading": "What it does", "readable": { "title": "Your subscriptions, actually readable", - "body": "Sort and filter by channel, tag, language, topic, length or date, and save your setups as views. You decide what surfaces, not an algorithm." + "body": "Sort and filter by channel, tag, language, topic, length or date, and save your setups as views." }, "neverMiss": { "title": "Never miss an upload", @@ -26,19 +30,27 @@ }, "search": { "title": "Search all of YouTube", - "body": "Search YouTube right from your feed — results play, save and add to playlists like any other video." + "body": "Search right from your feed — results play, save and add to playlists like any other video." }, "playlists": { "title": "Playlists that sync both ways", - "body": "Build playlists locally and keep them in two-way sync with YouTube." + "body": "Build them locally and keep them in two-way sync with YouTube." }, "player": { "title": "Watch in-app, resume anywhere", - "body": "An in-app player picks up each video exactly where you left off — no recommendation rabbit-hole." + "body": "A built-in player picks each video up where you left off, with keyboard and scroll controls." + }, + "downloads": { + "title": "Download Center", + "body": "Save videos to your server in a Plex-friendly layout, trim or join them, then share a link." + }, + "plex": { + "title": "Your Plex library too", + "body": "Browse and play what your Plex server already holds, right alongside your feed." }, "private": { "title": "Self-hosted and private", - "body": "Run it yourself, multi-user, in English and Hungarian. Your data stays yours." + "body": "Run it yourself, multi-user, in English and Hungarian — your data stays yours." } }, "auth": { diff --git a/frontend/src/i18n/locales/hu/welcome.json b/frontend/src/i18n/locales/hu/welcome.json index 1a80932..73a7a29 100644 --- a/frontend/src/i18n/locales/hu/welcome.json +++ b/frontend/src/i18n/locales/hu/welcome.json @@ -1,24 +1,28 @@ { "hero": { - "title": "A YouTube-feliratkozásaid úgy, ahogy egy hírfolyamnak működnie kéne.", - "subtitle": "Minden feltöltés a követett csatornáidról egyetlen tiszta, szűrhető hírfolyamban — nincs algoritmus, ami eldönti, mit látsz, és nincs Shorts- vagy élő-zaj, hacsak nem kéred.", - "trust": "Self-hosted és privát. Lépj be e-maillel, vagy folytasd Google-fiókkal." + "title": "A feliratkozásaid egyetlen nyugodt hírfolyamban.", + "subtitle": "Minden feltöltés a követett csatornáidról egy helyen, amit tényleg szűrhetsz, kereshetsz és rendezhetsz. Nincs algoritmus, ami eldönti, mit látsz — és nincs Shorts vagy élő adás, hacsak nem kéred.", + "trust": "Self-hosted és privát: az adataid a saját szervereden maradnak. Lépj be e-maillel, vagy folytasd Google-fiókkal." }, "openSource": { "title": "Ingyenes és nyílt forráskódú", - "body": "A Siftlode kódja nyilvános — nézd meg, hogyan működik, futtass saját privát példányt, vagy nyiss egy hibajegyet.", + "body": "Az egész nyílt — nézd meg a kódot, futtass saját privát példányt, vagy nyiss egy hibajegyet.", "link": "Forráskód megtekintése" }, "preview": { "feed": "A hírfolyam — szűrés csatorna, nyelv, téma, hossz és dátum szerint.", "channels": "Csatorna-kezelő", - "playlists": "Lejátszási listák" + "playlists": "Lejátszási listák", + "player": "Beépített lejátszó", + "downloads": "Letöltésközpont", + "search": "Keresési találatok", + "plex": "A Plex-könyvtárad" }, "features": { - "heading": "Miért a Siftlode", + "heading": "Mit tud", "readable": { "title": "A feliratkozásaid végre olvashatóan", - "body": "Rendezz és szűrj csatorna, címke, nyelv, téma, hossz vagy dátum szerint, és mentsd el a beállításaidat nézetként. Te döntöd el, mi kerül elő, nem egy algoritmus." + "body": "Rendezz és szűrj csatorna, címke, nyelv, téma, hossz vagy dátum szerint, és mentsd el a beállításaidat nézetként." }, "neverMiss": { "title": "Egy feltöltés se vesszen el", @@ -26,19 +30,27 @@ }, "search": { "title": "Keress az egész YouTube-on", - "body": "Keress a YouTube-on közvetlenül a hírfolyamból — a találatok ugyanúgy lejátszhatók, menthetők és listához adhatók, mint bármely más videó." + "body": "Keress közvetlenül a hírfolyamból — a találatok ugyanúgy lejátszhatók, menthetők és listához adhatók, mint bármely más videó." }, "playlists": { - "title": "Kétirányban szinkronizált lejátszási listák", - "body": "Építs helyi lejátszási listákat, és tartsd őket kétirányú szinkronban a YouTube-bal." + "title": "Kétirányban szinkronizált listák", + "body": "Építsd helyben, és tartsd kétirányú szinkronban a YouTube-bal." }, "player": { "title": "Nézd appon belül, folytasd bárhonnan", - "body": "Az appon belüli lejátszó pontosan onnan folytatja a videót, ahol abbahagytad — nincs ajánló-örvény." + "body": "A beépített lejátszó onnan folytatja a videót, ahol abbahagytad — billentyű- és görgetés-vezérléssel." + }, + "downloads": { + "title": "Letöltésközpont", + "body": "Ments videókat a szerveredre Plex-barát elrendezésben, vágd vagy fűzd össze őket, majd oszd meg egy linkkel." + }, + "plex": { + "title": "A Plex-könyvtárad is", + "body": "Böngészd és játszd le, amit a Plex-szervered már tárol, a hírfolyamod mellett." }, "private": { "title": "Self-hosted és privát", - "body": "Futtasd magad, többfelhasználós, angolul és magyarul. Az adataid a tieid maradnak." + "body": "Futtasd magad, többfelhasználós, angolul és magyarul — az adataid a tieid maradnak." } }, "auth": { diff --git a/frontend/src/lib/releaseNotes.ts b/frontend/src/lib/releaseNotes.ts index f56d4de..94dc73f 100644 --- a/frontend/src/lib/releaseNotes.ts +++ b/frontend/src/lib/releaseNotes.ts @@ -14,6 +14,17 @@ export interface ReleaseEntry { } export const RELEASE_NOTES: ReleaseEntry[] = [ + { + 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",