siftlode/backend/app
npeter83 e56502789f feat: M4 (part 2) — React reader UI with theming
- Vite + React + TS + Tailwind SPA served by FastAPI (multi-stage Docker build)
- Four color schemes (Midnight default, Forest, Slate, YouTube) x dark/light,
  adjustable text size; persisted to user preferences and localStorage
- Header search, grid/list toggle, theme menu; sidebar filters (show state,
  sort, include Shorts/live, language + topic tag chips with any/all matching)
- Infinite-scroll feed of video cards; click opens youtube.com in a new tab;
  per-video watched / saved / hidden actions with optimistic updates
- SPA fallback routing; login screen for unauthenticated users
2026-06-11 02:19:47 +02:00
..
routes feat: M4 (part 1) — feed API, watch state, user preferences 2026-06-11 02:11:02 +02:00
static fix: default app UI language to English (login page) 2026-06-11 01:03:36 +02:00
sync feat: M3 — automatic channel tagging (language + topic system tags) 2026-06-11 01:57:19 +02:00
youtube feat: M2 (part 2) — RSS poller, backfill, enrichment, scheduler 2026-06-11 01:36:41 +02:00
__init__.py feat: M1 foundation — compose stack, FastAPI, Google OAuth, encrypted tokens 2026-06-11 01:01:37 +02:00
auth.py fix: request offline access on OAuth login so Google returns a refresh token 2026-06-11 01:14:06 +02:00
config.py feat: M3 — automatic channel tagging (language + topic system tags) 2026-06-11 01:57:19 +02:00
db.py feat: M1 foundation — compose stack, FastAPI, Google OAuth, encrypted tokens 2026-06-11 01:01:37 +02:00
main.py feat: M4 (part 2) — React reader UI with theming 2026-06-11 02:19:47 +02:00
models.py feat: M4 (part 1) — feed API, watch state, user preferences 2026-06-11 02:11:02 +02:00
quota.py feat: M2 (part 1) — subscription import, YouTube client, quota guard 2026-06-11 01:22:07 +02:00
scheduler.py feat: M3 — automatic channel tagging (language + topic system tags) 2026-06-11 01:57:19 +02:00
security.py feat: M1 foundation — compose stack, FastAPI, Google OAuth, encrypted tokens 2026-06-11 01:01:37 +02:00