# Twitch4SteamDeck — TODO > Checkboxen-Tracker. Nach jedem erledigten Punkt sofort abhaken und kurzes > Update in `CLAUDE_PROGRESS.md` ergänzen. ## Phase 0 — Projekt-Skelett - [x] `package.json`, tsconfig (root/node/web) - [x] `electron.vite.config.ts`, `electron-builder.yml`, `.gitignore` - [x] Main-Stub mit BrowserWindow - [x] Preload-Stub mit `contextBridge` - [x] Renderer (React + Big-Screen-Baseline-CSS) - [x] Smoke-Test: `npm install && npm run dev` zeigt Fenster ## Phase 1 — Twitch OAuth Device Code Flow - [x] `deviceCodeFlow.ts` (request + polling + refresh) - [x] `tokenStore.ts` (safeStorage-Persistenz) - [x] `authService.ts` (Lifecycle + EventEmitter) - [x] IPC-Handler + Preload-Bridge - [x] `LoginScreen.tsx` (QR + Code + Countdown) - [x] `App.tsx` Routing nach Auth-Status - [x] `.env.example` - [x] **End-to-End-Verifikation durch User** (Login mit echter Twitch-App durchführen) - [x] Token-Persistenz prüfen: App-Neustart → bleibt eingeloggt - [ ] Logout testen: `userData/twitch-tokens.bin` wird gelöscht (später) ## Phase 2 — Twitch Helix-Client + Followed-Channels-Home-Screen - [x] `src/main/twitch/types.ts` (Helix-Response-Typen) - [x] `src/main/twitch/helixClient.ts` (fetch-Wrapper, Auth-Header, Client-ID-Header, Paginierung) - [x] Helix-Endpoints implementieren: - [x] `GET /users` (eigener User → user_id cachen) - [x] `GET /channels/followed?user_id=…` (paginiert) - [x] `GET /streams?user_id=…` (batched, max 100 IDs pro Call) - [x] IPC: `twitch:get-followed` registrieren (merged live-Status + Avatar) - [x] Preload-API erweitern: `window.t4sd.twitch.getFollowed` - [x] `FollowingScreen.tsx` — Karten-Grid mit Live-Indicator, Vorschaubild, Titel, Zuschauerzahl - [x] Spatial-Navigation: eigene Implementierung (Arrow-Keys + Region-Switch Sidebar ↔ Main) - [x] Gamepad-Service: `src/renderer/src/input/gamepad.ts` (Gamepad-API → Keyboard-Events) - [x] `FocusableCard.tsx` — Block-Layout, Avatar + Name + Titel + Spiel + Viewer-Badge - [x] `AppShell.tsx` + `Sidebar.tsx` — Layout mit linker Navigation (Du folgst / Durchsuchen / Mein Account) - [x] `Icons.tsx` — inline SVG-Icons (Heart, Compass, User) - [x] `BrowseScreen.tsx` + `AccountScreen.tsx` — Platzhalter-Screens mit Logout - [ ] **End-to-End-Verifikation durch User** (Sidebar-Navigation + Karten-Grid mit echten Daten testen) ## Phase 3 — Streamlink + mpv (Live-Wiedergabe) - [ ] `src/main/playback/streamlink.ts` — Subprozess-Spawning, `--twitch-disable-ads`, OAuth-Header für Sub-only Inhalte, optional TTV.LOL-Plugin - [ ] `src/main/playback/mpvController.ts` — Spawn mpv mit `--input-ipc-server`, Unix-Socket JSON-IPC (Win: Named Pipe), `pause`/`seek`/`quit`-Befehle, `observe_property time-pos` - [ ] IPC: `playback:start-live`, `playback:stop` - [ ] Channel-Detail-Screen mit „Live ansehen"-Button - [ ] Quality-Picker - [ ] End-to-End: 5 min Live-Stream ohne Werbe-Unterbrechung ## Phase 4 — VOD-Browsing + -Wiedergabe - [ ] Helix `GET /videos?user_id=…&type=archive` (paginiert) - [ ] VOD-Listen-Screen pro Channel - [ ] `playback:start-vod` (mit optionaler Resume-Position) - [ ] mpv-Resume: `--start=` beim Spawn ## Phase 5 — Lokaler VOD-Verlauf - [ ] SQLite-Setup: `src/main/store/db.ts` (better-sqlite3, Migrations) - [ ] `historyRepo.ts` mit `vod_history`-Tabelle (siehe plan.md) - [ ] mpv `time-pos`-Observer schreibt alle ~5s in DB - [ ] „Continue Watching"-Reihe auf HomeScreen - [ ] Auto-Complete bei >95% Wiedergabefortschritt ## Phase 6 — Flatpak-Packaging - [ ] `flatpak/tv.twitch4steamdeck.App.yml` Manifest (Runtime, Module, Permissions) - [ ] mpv + streamlink als Flatpak-Module bündeln - [ ] Test-Build: `flatpak-builder --user --install build-dir flatpak/…yml` - [ ] Auf Steam Deck (oder VM) installieren und Login + Live + VOD durchspielen - [ ] Als Non-Steam-Game in Gaming Mode hinzufügen, dort testen ## Post-MVP (bewusst nicht im ersten Release) - [ ] Chat (Live + VOD-Replay) inkl. BTTV/FFZ/7TV - [ ] Suche / Kategorien-Browsing - [ ] Eigene Twitch-Client-ID im Build verankert - [ ] README mit Disclaimer (ToS) + Setup-Anleitung - [ ] Flathub-Einreichung