# SAVEPOINT — Rippy ## Aktueller Stand **v1.10 — Complete Dark Mode Implementation (22.07.2026)** Rippy läuft auf Arcane VM (192.168.178.162): - ✅ Arcane WebUI: http://192.168.178.162:3552 - ✅ Rippy UI: http://192.168.178.162:80 - ✅ Rippy API: http://192.168.178.162:8000 - ✅ Theme Context ausgelagert (App.tsx → ThemeContext.tsx + useDarkMode.ts) - ✅ Config Validation mit TMDB-API-Key Pflicht - ✅ Cache Key Centralization (cache/keys.py) - ✅ Dark Mode mit Theme-Toggle und localStorage persistence (UI-Only) - ✅ **Alle UI-Komponenten komplett auf Dark Mode aktualisiert:** - `App.tsx`, `Dashboard.tsx`, `Settings.tsx`, `MetadataPreview.tsx` - ✅ Sidebar Navigation mit Dark Mode Support - ✅ Einstellungen-Page mit Tab-Struktur - ✅ Doppelte Arcane-Einträge behoben (`rippy` statt `Rippy`) - ✅ Import-Fixes (relative → absolute Imports) - ✅ Git Sync in Arcane konfiguriert - ✅ Commit: `d2fb281` — Complete Dark Mode Implementation ### Docker-Container | Container | Port | Status | |-----------|------|--------| | rippy-api | 8000 | Healthy | | rippy-worker | - | Running | | rippy-ui | 80 | Running | | rippy-postgres | 5432 | Healthy | | rippy-redis | 6379 | Healthy | ### Features - ✅ **Etappe 3**: SQLite-Cache, TMDB/MusicBrainz/TheTVDB Clients, Pre-Scan, Metadaten-Preview - ✅ **Etappe 4**: Jellyfin-Formatierung (NFO-Generator, Image-Downloader) - ✅ **Etappe 5**: JWT-Auth (15min/7T), Rate-Limiting (100/min), API-Key-Management - ✅ **Etappe 6**: Docker read_only, tmpfs, healthchecks, minimale Images - ✅ **Etappe 7**: API UI Modernisiert, Import-Fixes, Doppelte Einträge behoben - ✅ **Etappe 8**: Dark Mode mit Theme-Toggle, Separation of Concerns - ✅ **Etappe 9**: Complete Dark Mode Implementation (alle UI-Komponenten) - ✅ **Dokumentation**: README, KONZEPT.md, ROADMAP.md, SAVEPOINT.md ### Nächste Schritte - Job-Verlauf UI (aktuell nur leere Listen) - TMDB API Schlüssel in Arcane Environment konfigurieren - Proxmox LXC Template - Ansible Playbooks ### SoC Refactoring — Abgeschlossen (Etappe 9) - ✅ **Theme-Context**: Theme-Logik aus App.tsx ausgelagert - ✅ **Dark Mode Utility**: useDarkMode Hook implementiert - ✅ **Component-Struktur**: Dark Mode props von inneren Komponenten versteckt - ✅ **Config Validation**: TMDB-API-Key ist Pflicht - ✅ **Cache Key Centralization**: cache/keys.py erstellt - ✅ **CD-Ripping**: abcde-Integration implementiert ### Git-Log ``` d2fb281 - fix: complete dark mode implementation with all UI components 43dfce5 - feat(ui): implement dark mode with theme toggle rippy-ui-modern - UI Modernisiert & Import-Fixes 3d87c8c - Dokumentation aktualisiert bdb9f8d - SAVEPOINT v1.5: Sicherheit abgeschlossen efa642e - Etappe 6: Sicherheit ``` --- ## v2.0 — Fix-Runde nach externem Code-Review (22.07.2026, Claude) **Alle Befunde des Reviews behoben, echte Tests eingeführt, Ampel-CI aktiv.** Gefixt: - **Metadaten-Preview WIEDERHERGESTELLT**: Beim SoC-Refactoring hatte ein Stub-Paket die echte prescan-Implementierung überschattet — die Preview lieferte immer „Unknown Disc". Echte Logik liegt jetzt im Paket, tote Altmodule (cache.py, prescan.py flach) gelöscht. - Fortschrittsmeldung: Celery `update_state` statt Aufrufe eines nie existierenden Tasks; `self.send_task` (erfundene API) entfernt. - abcde-Kommando korrigiert (`-o` war doppelt → CD-Ripping war nie funktionsfähig); Zielverzeichnis jetzt via OUTPUTDIR-Config; Kommando-Bau als testbare Funktion. - JWT: fester Schlüssel PFLICHT (kein Zufalls-Fallback pro Prozess mehr); Logout blacklistet wirklich; Cleanup löscht nur Abgelaufene (vorher: alles). - main.py: crashende Endpoints repariert (fehlende Imports Path/secrets, nicht existentes api_keys-Dict → ratelimit-Store), Audio-`year`-Bug, Admin-Zugang aus .env statt hartkodiert. - Ruff komplett grün (29 Funde), package-lock.json committet. - Tests: test_auth, test_cache_keys, test_ripping_helpers (der giftige test_health-Placebo ist raus). ## ✅ ENTSCHIEDEN (22.07. abends): Das KONZEPT gilt — MakeMKV kommt **MakeMKV lossless (Muss-Feature) wird umgesetzt — als eigene Etappe 10 in der ROADMAP** (Worker-Container + makemkvcon + Beta-Key, in Zed zu bauen, E2E mit echter Disc). Bis dahin bleibt HandBrake als SICHTBARER Übergang aktiv — jede*r weiß: aktuell wird transkodiert, nicht verlustfrei gesichert. ## Deploy-Weg seit 22.07. abends: GRÜN-GATE (vollautomatisch) Push auf `main` → Ampel prüft → grün → CI befördert auf Branch `stable` → **Arcane-GitSync zieht `stable` und deployt**. Rot deployt NIE. `./deploy.sh` ist nur noch der Notfall-Hebel; SSH zur VM bleibt als Fallback erlaubt.