diff --git a/.open-second-brain/brain.sqlite b/.open-second-brain/brain.sqlite index da3e5a3..afa47a5 100644 Binary files a/.open-second-brain/brain.sqlite and b/.open-second-brain/brain.sqlite differ diff --git a/Brain/inbox/melo-1.0-audit.md b/Brain/inbox/melo-1.0-audit.md new file mode 100644 index 0000000..d51b5a9 --- /dev/null +++ b/Brain/inbox/melo-1.0-audit.md @@ -0,0 +1,133 @@ +# Melo 1.0 – Code-Audit & Design-Review +**Datum:** 26.07.2026 +**Repo:** `/home/dustin/git/melo_app/` (27 Dart-Dateien, v2.7 laut Logger) + +--- + +## 🔴 TOTE BUTTONS (führen zu nichts oder zum falschen Ziel) + +### 1. BottomNavigationBar – 3 von 5 Tabs defekt! +**Datei:** `lib/screens/home_screen.dart` Zeile 367–371 + +| Tab | Label | Was passiert | Sollte passieren | +|-----|-------|-------------|------------------| +| 🎵 Musik | Index 0 | ✅ Home-Screen | ✅ richtig | +| ⬇ Downloads | Index 1 | ✅ DownloadScreen | ✅ richtig | +| 🏷️ Tags | Index 2 | ❌ öffnet **PlaylistSheet**! | Sollte nach Tags filtern o. Tag-Manager zeigen | +| ❤️ Favoriten | Index 3 | ❌ öffnet **PlaylistSheet**! | Sollte favorisierte Songs filtern | +| ⚙️ Einstellungen | Index 4 | ❌ **KEIN Handler** – tut gar nichts! | Sollte Einstellungen-Seite zeigen | + +```dart +// Aktueller Code (defekt): +onTap: (i) { + setState(() => _aktiverTab = i); + if (i == 2) _zeigePlaylistSheet(); // FALSCH: Tags → Playlists + if (i == 3) _zeigePlaylistSheet(); // FALSCH: Favoriten → Playlists + // i == 4 → KEIN Code! Einstellungen-Tab tot. +}, +``` + +### 2. Auskommentierte Widgets (Features existieren, sind aber deaktiviert) +**Datei:** `lib/screens/home_screen.dart` Zeile 272–291 + +- **RecentWidget** (Zeile 273): `// RecentWidget(songs: _vm.letzteSongs, onPlay: _vm.spieleSong),` + - Zeigt "Zuletzt gehört" – Code existiert in `lib/widgets/recent_widget.dart`, korrekt implementiert + +- **TagStatsWidget** (Zeile 290): `// TagStatsWidget(tagCounts: _vm.tagCounts),` + - Zeigt Tag-Häufigkeiten farbcodiert – Code existiert in `lib/widgets/tag_stats_widget.dart`, korrekt implementiert + +### 3. Alle anderen Buttons ✅ intakt +- MeloHeader (Cloud/Suche/Download): alle 3 funktional +- SongTile (Edit/Favorit/Playlist/Play): alle funktional +- MiniPlayer (Play/Pause/Skip): alle funktional +- DownloadScreen (Ordner/Download/Abbrechen): alle funktional +- PlaylistSheet (Neu/Öffnen/Löschen): alle funktional +- NavidromeBrowser (Verbinden/Alben/Stream/Download): alle funktional + +--- + +## 🎨 DESIGN-ANALYSE & VERSCHÖNERUNGSVORSCHLÄGE + +### Aktuelles Design (Bestandsaufnahme) +- **Farbschema:** Dark Theme – Schwarz `#0D0D0D`, Dunkelgrau `#1A1A1A`/`#2A2A2A`, Rot `#CC0000` als Akzent +- **Typografie:** System-Standardschrift, keine Custom-Font. Nur Größen-Variation (9-28px). +- **Layout:** Standard-Material mit BottomNavigationBar, ListView, Cards +- **Rundungen:** Konsistent 8-14px Border-Radius +- **Icons:** Material Icons, teils mit Emoji (♪, 💿, 🎵, 💌) +- **Animationen:** Nur implizit (FAB, BottomSheet); keine expliziten + +### 🔥 Top 10 Verschönerungs-Maßnahmen (priorisiert) + +#### 1. **Custom-Schriftart** – Höchste Wirkung, geringer Aufwand + - Schriftart wie **Inter** oder **Poppins** via `google_fonts` einbinden + - Sofort moderneres, hochwertigeres Look & Feel + - `pubspec.yaml` → `google_fonts: ^6.1.0` + +#### 2. **Glassmorphism-Effekte** + - MiniPlayer + StatistikCard mit `BackdropFilter` + `blur` + - Transparenter, schwebender Look statt flache Container + - `ClipRRect` mit `BackdropFilter(brightness: 0.2, saturation: 0.3)` + +#### 3. **Subtiler Hintergrund-Gradient** + - Statt `MeloTheme.schwarz` ein radialer Gradient von `#1A0505` nach `#0D0D0D` + - Gibt Tiefe, wirkt weniger "flach" + +#### 4. **Song-Tiles mit Swipe-Gesten** + - Swipe links → Favorit toggeln + - Swipe rechts → Zur Playlist hinzufügen + - `flutter_slidable` Package + +#### 5. **Skeleton-Loader / Shimmer** + - Statt `CircularProgressIndicator` beim Laden + - Placeholder-Karten mit `shimmer`-Animation + - Wirkt professioneller, weniger "Lade-Unterbrechung" + +#### 6. **Hero-Animationen** + - MiniPlayer → Vollbild-Player mit fließendem Übergang + - Album-Cover als Hero-Widget + +#### 7. **Leere-Zustände mit Icons/Illustration** + - "Noch keine Playlists" → mit großer Illustration + CTA-Button + - "Keine Treffer" → Such-Illustration + - Statt reinem Text + +#### 8. **Animierte Tab-Indikatoren** + - BottomNavBar mit animiertem Indikator-Balken oder Dot + - Sanfte Farbverläufe beim Wechseln + +#### 9. **Pull-to-Refresh** auf Song-Liste + - `RefreshIndicator` um die ListView + - Neu-Scannen per Wischgeste + +#### 10. **Farbcodierte Fortschrittsbalken** + - Fortschritt farblich codieren (grau→gelb→grün bei Download-Fortschritt) + - Statt einfachem roten Balken + +### Farbpaletten-Erweiterung (Vorschlag) +```dart +// Zusätzlich zu bestehenden Farben: +static const Color rotGlow = Color(0x40CC0000); // für Glow-Effekte +static const Color surfaceHell = Color(0xFF252525); // für Hover/Active +static const Color erfolg = Color(0xFF4CAF50); // Grün-Akzent +static const Color warnung = Color(0xFFFFC107); // Gelb-Akzent +``` + +### Auch interessant (niedrigere Priorität) +- **Waveform-Animation** im MiniPlayer (statt statischem Balken) +- **Konfetti-Effekt** nach erfolgreichem Download +- **Haptisches Feedback** bei Button-Taps (`HapticFeedback.lightImpact()`) +- **Dark-Mode-Only** mit OLED-optimiertem `#000000` für echte Schwarztöne +- **BottomSheet mit Drag-Handle** schon vorhanden → schön! + +--- + +## 📊 Zusammenfassung + +| Kategorie | Befund | +|-----------|--------| +| Tote Buttons | **3 von 5 Tabs defekt** – Tags/Favoriten öffnen Playlists, Einstellungen tut nichts | +| Deaktivierte Widgets | RecentWidget + TagStatsWidget auskommentiert, Code intakt | +| Sonstige Buttons | Alle intakt ✅ | +| Design-Level | Solide Basis, Material 3 Dark Theme, konsistent | +| Größtes Manko | Keine Custom-Schriftart, flache Container, keine Animationen | +| Schnellster Gewinn | Custom Font + Glassmorphism + Gradient-Hintergrund | diff --git a/Brain/log/2026-08-05-abend.a0360993.md b/Brain/log/2026-08-05-abend.a0360993.md new file mode 100644 index 0000000..1231aa0 --- /dev/null +++ b/Brain/log/2026-08-05-abend.a0360993.md @@ -0,0 +1,22 @@ +# Brain Log — 2026-08-05 (Abend) + +## Session: Melo Sprint D+E + Review + +### Was passiert ist +- **Sprint D komplett** (v2.52): Favoriten-Sync-Fix (bidirektional), YT-Fallback, SyncService (Auto-Intervall, Notification), funktionierende Einstellungen +- **Sprint E komplett** (v2.53): Recaps 7T/Monat/Jahr, Tombstone-Sync, Konflikt-Report +- **Code Review D+E**: 3 MED-Findings (Tombstone-Race, DB-Insert neuer Songs, fehlende Tests) → gefixt → **FREIGABE** +- **APK v2.53.1** gebaut + geliefert (21,0 MB) +- **Merge-Dateien v7** regeneriert (briefing + code, 15.511 Zeilen) + +### Highlights +- MED-2 war der Killer: Neue Server-Songs wurden NIE in die lokale DB geschrieben → bei jedem Sync GB-Re-Downloads + falsche "+neu"-Meldungen. Jetzt: DB-Insert mit cloud_id. +- Tombstones jetzt mit Server-Zeitstempel (datetime('now')) statt Client-Zeit → keine Uhr-Drift-Zombies mehr + +### Nebenschauplatz +- YT-Link-Finder: UTF-8-Bug gefixt (0/25 → 4/25 pro Lauf) — 107/325 Songs mit Links, Cron holt Rest + +### Offen +- Sprint F (Android Auto, Home-Widget) +- melo_cloud.py in eigenes Repo aufnehmen +- Tinker-Easter-Egg diff --git a/Brain/log/2026-08-05-nacht.a0360993.md b/Brain/log/2026-08-05-nacht.a0360993.md new file mode 100644 index 0000000..5294f13 --- /dev/null +++ b/Brain/log/2026-08-05-nacht.a0360993.md @@ -0,0 +1,24 @@ +# Brain Log — 2026-08-05 (Nacht) + +## Session: Vibe-Tools-Recherche + Installationen + +### Installiert +1. **youtube-full** (Skill) — Transkripte/Videos, kein API-Key +2. **gitingest-MCP** (3 Tools) — Repo→Text; funktioniert für öffentliche Repos; unser Gitea ist nicht öffentlich → Merge-Dateien bleiben für Claude (oder gitingest-CLI lokal) +3. **Vibe-Coder-MCP** v0.3.5 (CLI `vibe`) — Dev-Tools für Agents +4. **SkillClaw** (venv ~/skillclaw-venv) — **DeepSeek-kompatibel getestet ✅** (Proxy :30001 reichte DeepSeek durch), aber NICHT in Hermes verdrahtet (Proxy-Eingriff riskant, nur auf Freigabe) +5. **hermes-workspace** — **GUI läuft auf Port 3000** (Chat/Terminal/Memory/Skills/Inspector); volle Integration braucht Gateway-API-Server :8642 (Neustart nötig, Telegram kurz weg) + +### Kanban-Erkenntnis +- **Swarm-Setup NICHT nötig** für Kanban an sich +- ABER: Telegram-Sessions laufen als Child-Kontext (`HERMES_DELEGATED_CHILD_CONTEXT=1`) → Kanban-Mutationen gesperrt +- → Kanban nur via CLI/GUI nutzbar, nicht aus Telegram. Für unseren Workflow kein Mehrwert → dokumentiert, nicht aktiv. + +### Community-Recherche (Vibe Coding mit Hermes) +- Muster: Profil-Fleet, Rollen-Isolation, Subagent-Delegation, Skills als Command Center, Memory-Ebenen, Kanban +- Unser Setup folgt den Best-Practices bereits (Profile, Delegation, Skills, Review-Gate) + +### Offen +- gitingest-CLI lokal testen (Merge-Datei-Ersatz für Claude) +- hermes-workspace volle Integration (Gateway :8642) — nur mit Freigabe +- SkillClaw-Proxys in Hermes — nur mit Freigabe diff --git a/Brain/log/2026-08-05.a0360993.md b/Brain/log/2026-08-05.a0360993.md new file mode 100644 index 0000000..d388e28 --- /dev/null +++ b/Brain/log/2026-08-05.a0360993.md @@ -0,0 +1,24 @@ +# Brain Log — 2026-08-05 + +## Session: Melo Sprint C + Vault-Workflow + +### Was passiert ist +- **Sprint C abgeschlossen** (v2.51.4): 5-Tab-Navigation, Cloud-Dashboard, Schnellaktionen, Musikserver-Chip +- **Code Review**: 4 MED-Findings → gefixt → FREIGABE (passed=true) +- **APK v2.51.4** gebaut + geliefert (20,8 MB, arm64) +- **Merge-Dateien** v6 regeneriert (briefing + code, 14.139 Zeilen) + +### Vault-Workflow eingerichtet +- [[Server Aingrad - Komplette Übersicht]] aktualisiert +- [[Melo App - Status]] neu erstellt +- Künftig: Notizen parallel im Vault (Notizen/ + Brain-Log) + +### Nebenschauplatz +- SearXNG installiert (search.baka-net.de, Meta-Suche ohne API-Key) +- RSSHub entfernt (neue Version braucht API-Keys) +- Gehalts-Prognose Juli ~1.731 € / August ~1.383 € (15,10 €/Std, SK1, SH) + +### Offen +- Sprint D (Android Auto, Home-Widget) +- INFO: Server-Songs werden nie in lokale DB geschrieben +- Tinker-Easter-Egg diff --git a/Brain/metrics/index.jsonl b/Brain/metrics/index.jsonl index 1217e37..fbfe9dc 100644 --- a/Brain/metrics/index.jsonl +++ b/Brain/metrics/index.jsonl @@ -1,2 +1,3 @@ {"schema":"o2b.metrics.v1","surface":"index","run_at":"2026-07-09T14:02:54.872Z","payload":{"added":3,"updated":0,"deleted":0,"alias_resolved":0,"relation_violations":0,"tier_drift":0}} {"schema":"o2b.metrics.v1","surface":"index","run_at":"2026-07-23T11:12:04.985Z","payload":{"added":42,"updated":1,"deleted":1,"alias_resolved":0,"relation_violations":0,"tier_drift":0}} +{"schema":"o2b.metrics.v1","surface":"index","run_at":"2026-08-01T11:55:34.940Z","payload":{"added":8,"updated":1,"deleted":0,"alias_resolved":0,"relation_violations":0,"tier_drift":0}} diff --git a/Brain/search/activation-state.json b/Brain/search/activation-state.json index 8407375..02da6b1 100644 --- a/Brain/search/activation-state.json +++ b/Brain/search/activation-state.json @@ -1,7 +1,7 @@ { "version": 1, - "events": 6, - "updatedAt": "2026-07-23T12:47:03.764Z", + "events": 7, + "updatedAt": "2026-08-01T11:55:35.134Z", "paths": { "Brain/INDEX.md": { "strength": 0.3, @@ -14,9 +14,9 @@ "accessCount": 1 }, "Brain/active.md": { - "strength": 0.1, - "lastAccessAt": 1784805125265, - "accessCount": 1 + "strength": 0.2, + "lastAccessAt": 1785585335134, + "accessCount": 2 }, "Brain/inbox/sig-2026-07-09-brain-index.md": { "strength": 0.1, @@ -33,6 +33,11 @@ "lastAccessAt": 1784805125422, "accessCount": 1 }, + "Brain/inbox/sig-2026-07-12-default-model-deepseek.md": { + "strength": 0.1, + "lastAccessAt": 1785585335134, + "accessCount": 1 + }, "Brain/inbox/sig-2026-07-16-auto-brain-load.md": { "strength": 0.1, "lastAccessAt": 1784805125422, @@ -44,9 +49,9 @@ "accessCount": 1 }, "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md": { - "strength": 0.1, - "lastAccessAt": 1784805125265, - "accessCount": 1 + "strength": 0.2, + "lastAccessAt": 1785585335134, + "accessCount": 2 }, "Brain/inbox/sig-2026-07-19-server-port-map-2.md": { "strength": 0.1, @@ -63,6 +68,21 @@ "lastAccessAt": 1784810821353, "accessCount": 2 }, + "Brain/log/2026-07-12-session.md": { + "strength": 0.1, + "lastAccessAt": 1785585335134, + "accessCount": 1 + }, + "Brain/log/2026-07-12.a0360993.md": { + "strength": 0.1, + "lastAccessAt": 1785585335134, + "accessCount": 1 + }, + "Brain/log/2026-07-13.a0360993.md": { + "strength": 0.1, + "lastAccessAt": 1785585335134, + "accessCount": 1 + }, "Brain/log/2026-07-16.a0360993.md": { "strength": 0.1, "lastAccessAt": 1784810821353, @@ -89,9 +109,9 @@ "accessCount": 2 }, "Brain/log/2026-07-23.a0360993.md": { - "strength": 0.1, - "lastAccessAt": 1784805125265, - "accessCount": 1 + "strength": 0.2, + "lastAccessAt": 1785585335134, + "accessCount": 2 }, "Brain/pinned.md": { "strength": 0.2, @@ -108,6 +128,11 @@ "lastAccessAt": 1784805125422, "accessCount": 1 }, + "Brain/preferences/pref-default-model-deepseek.md": { + "strength": 0.1, + "lastAccessAt": 1785585335134, + "accessCount": 1 + }, "Brain/preferences/pref-server-port-map.md": { "strength": 0.1, "lastAccessAt": 1784805125265, @@ -120,6 +145,21 @@ } }, "coAccess": [ + { + "a": "Brain/active.md", + "b": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md", + "count": 2 + }, + { + "a": "Brain/active.md", + "b": "Brain/log/2026-07-23.a0360993.md", + "count": 2 + }, + { + "a": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md", + "b": "Brain/log/2026-07-23.a0360993.md", + "count": 2 + }, { "a": "Brain/INDEX.md", "b": "Brain/log/2026-07-09.a0360993.md", @@ -172,7 +212,7 @@ }, { "a": "Brain/active.md", - "b": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md", + "b": "Brain/inbox/sig-2026-07-12-default-model-deepseek.md", "count": 1 }, { @@ -185,6 +225,21 @@ "b": "Brain/inbox/sig-2026-07-19-server-port-map.md", "count": 1 }, + { + "a": "Brain/active.md", + "b": "Brain/log/2026-07-12-session.md", + "count": 1 + }, + { + "a": "Brain/active.md", + "b": "Brain/log/2026-07-12.a0360993.md", + "count": 1 + }, + { + "a": "Brain/active.md", + "b": "Brain/log/2026-07-13.a0360993.md", + "count": 1 + }, { "a": "Brain/active.md", "b": "Brain/log/2026-07-19.a0360993.md", @@ -197,7 +252,7 @@ }, { "a": "Brain/active.md", - "b": "Brain/log/2026-07-23.a0360993.md", + "b": "Brain/preferences/pref-default-model-deepseek.md", "count": 1 }, { @@ -295,6 +350,36 @@ "b": "Brain/preferences/pref-brain-index.md", "count": 1 }, + { + "a": "Brain/inbox/sig-2026-07-12-default-model-deepseek.md", + "b": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md", + "count": 1 + }, + { + "a": "Brain/inbox/sig-2026-07-12-default-model-deepseek.md", + "b": "Brain/log/2026-07-12-session.md", + "count": 1 + }, + { + "a": "Brain/inbox/sig-2026-07-12-default-model-deepseek.md", + "b": "Brain/log/2026-07-12.a0360993.md", + "count": 1 + }, + { + "a": "Brain/inbox/sig-2026-07-12-default-model-deepseek.md", + "b": "Brain/log/2026-07-13.a0360993.md", + "count": 1 + }, + { + "a": "Brain/inbox/sig-2026-07-12-default-model-deepseek.md", + "b": "Brain/log/2026-07-23.a0360993.md", + "count": 1 + }, + { + "a": "Brain/inbox/sig-2026-07-12-default-model-deepseek.md", + "b": "Brain/preferences/pref-default-model-deepseek.md", + "count": 1 + }, { "a": "Brain/inbox/sig-2026-07-16-auto-brain-load.md", "b": "Brain/inbox/sig-2026-07-16-check-system-time.md", @@ -340,6 +425,21 @@ "b": "Brain/inbox/sig-2026-07-19-server-port-map.md", "count": 1 }, + { + "a": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md", + "b": "Brain/log/2026-07-12-session.md", + "count": 1 + }, + { + "a": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md", + "b": "Brain/log/2026-07-12.a0360993.md", + "count": 1 + }, + { + "a": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md", + "b": "Brain/log/2026-07-13.a0360993.md", + "count": 1 + }, { "a": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md", "b": "Brain/log/2026-07-19.a0360993.md", @@ -352,7 +452,7 @@ }, { "a": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md", - "b": "Brain/log/2026-07-23.a0360993.md", + "b": "Brain/preferences/pref-default-model-deepseek.md", "count": 1 }, { @@ -440,6 +540,51 @@ "b": "Soul.md", "count": 1 }, + { + "a": "Brain/log/2026-07-12-session.md", + "b": "Brain/log/2026-07-12.a0360993.md", + "count": 1 + }, + { + "a": "Brain/log/2026-07-12-session.md", + "b": "Brain/log/2026-07-13.a0360993.md", + "count": 1 + }, + { + "a": "Brain/log/2026-07-12-session.md", + "b": "Brain/log/2026-07-23.a0360993.md", + "count": 1 + }, + { + "a": "Brain/log/2026-07-12-session.md", + "b": "Brain/preferences/pref-default-model-deepseek.md", + "count": 1 + }, + { + "a": "Brain/log/2026-07-12.a0360993.md", + "b": "Brain/log/2026-07-13.a0360993.md", + "count": 1 + }, + { + "a": "Brain/log/2026-07-12.a0360993.md", + "b": "Brain/log/2026-07-23.a0360993.md", + "count": 1 + }, + { + "a": "Brain/log/2026-07-12.a0360993.md", + "b": "Brain/preferences/pref-default-model-deepseek.md", + "count": 1 + }, + { + "a": "Brain/log/2026-07-13.a0360993.md", + "b": "Brain/log/2026-07-23.a0360993.md", + "count": 1 + }, + { + "a": "Brain/log/2026-07-13.a0360993.md", + "b": "Brain/preferences/pref-default-model-deepseek.md", + "count": 1 + }, { "a": "Brain/log/2026-07-16.a0360993.md", "b": "Brain/pinned.md", @@ -490,6 +635,11 @@ "b": "Brain/preferences/pref-server-port-map.md", "count": 1 }, + { + "a": "Brain/log/2026-07-23.a0360993.md", + "b": "Brain/preferences/pref-default-model-deepseek.md", + "count": 1 + }, { "a": "Brain/log/2026-07-23.a0360993.md", "b": "Brain/preferences/pref-server-port-map.md", diff --git a/Brain/search/activation/1785585335134-e8599896.json b/Brain/search/activation/1785585335134-e8599896.json new file mode 100644 index 0000000..a1f571f --- /dev/null +++ b/Brain/search/activation/1785585335134-e8599896.json @@ -0,0 +1,14 @@ +{ + "ts": 1785585335134, + "queryHash": "38b54fdb", + "paths": [ + "Brain/preferences/pref-default-model-deepseek.md", + "Brain/log/2026-07-23.a0360993.md", + "Brain/inbox/sig-2026-07-12-default-model-deepseek.md", + "Brain/log/2026-07-12.a0360993.md", + "Brain/log/2026-07-13.a0360993.md", + "Brain/log/2026-07-12-session.md", + "Brain/active.md", + "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md" + ] +} diff --git a/Notizen/Audit 14.08.2026 - Sicherheit & Code-Review.md b/Notizen/Audit 14.08.2026 - Sicherheit & Code-Review.md new file mode 100644 index 0000000..4d41898 --- /dev/null +++ b/Notizen/Audit 14.08.2026 - Sicherheit & Code-Review.md @@ -0,0 +1,105 @@ +# Audit 14.08.2026 – Sicherheit & Code-Review + +> Stand: 14.08.2026 +> Umfang: Server Aingrad (Sicherheit + Aufräumen) und Melo App (Code-Review) +> Alle Änderungen live verifiziert · Backups: `/home/dustin/backup-audit-2026-08-14/` + +--- + +## ⚠️ Zuerst: Zwei Korrekturen an bestehenden Notizen + +**1. Die Neustart-Befehle in [[Server Aingrad - Komplette Übersicht]] sind gefährlich.** +Dort steht noch: + +```bash +sudo pkill -f baka_auth.py && python3 /home/dustin/scripts/baka_auth.py 8994 & +``` + +Die drei Dienste laufen inzwischen als **systemd-Units mit `Restart=always`**. Der Befehl killt den verwalteten Prozess, systemd startet ihn sofort neu und belegt den Port — der manuell gestartete Prozess scheitert dann an `Address already in use`, oder er gewinnt das Rennen und läuft unverwaltet weiter, bis die Shell endet. Richtig ist: + +```bash +sudo systemctl restart baka-auth # Port 8994 +sudo systemctl restart melo-cloud # Port 8993 +sudo systemctl restart yt-proxy # Port 8992 +sudo systemctl status baka-auth # Zustand prüfen +``` + +**2. Die Dienst-Tabelle ist beim Zugriff überholt.** `search.baka-net.de` steht dort als „Offen" — seit heute Basic Auth. Ebenfalls nicht erfasst: `matrix`, `element`, `admin-matrix`, `livekit`, `workspace`, `crash`, `ladder`. + +--- + +## 🔒 Behobene Sicherheitslücken + +| Befund | Fix | Verifiziert | +|--------|-----|-------------| +| `/whoami` Auth-Bypass: Basic-Header wurde ohne Passwortprüfung geglaubt → jeder bekam `is_admin: true` | Caddy prüft das Passwort vor dem Proxy | 401 statt 200 | +| `/api/cloud/yt-finder` vor der Auth-Prüfung → jeder Request startet 120-s-Subprozess | Doppelte Route entfernt | 401 sofort | +| `ladder` offener Paywall-Proxy (Abuse auf eigene IP) | Basic Auth | 401 | +| `search` offene SearXNG | Basic Auth | 401 | +| `admin-matrix` Synapse-Panel offen | Basic Auth | 401 | +| Navidrome-Admin-Passwort im Klartext in `baka_auth.py` | → `/etc/baka-auth/navidrome_pw` (640 root:dustin) | Sync getestet | +| `handle_profile` listete bei Fehler alle Benutzernamen | Meldung neutralisiert | — | +| Share-Codes aus `random` (vorhersagbar) | `secrets.choice`, 6 → 8 Zeichen | alte Codes gültig | +| `baka_auth` single-threaded → Logins serialisiert hinter Navidrome-Timeouts | ThreadingWSGIServer + `threading.Lock` fürs Rate-Limit | Login getestet | + +Caddy nutzt jetzt ein Snippet `(baka_users)` — Benutzerliste steht **an einer Stelle** statt viermal dupliziert. + +--- + +## 🛑 Wichtigster Fund: Prod-Build von workspace umgeht die Auth + +`hermes-workspace` läuft absichtlich mit `pnpm dev`. Der naheliegende „Fix" (Produktions-Build) wurde getestet — **auf separatem Port 3021, ohne den laufenden Dienst anzufassen**: + +| Route | Dev (3020) | Prod (3021) | +|-------|-----------|-------------| +| `/api/sessions` | `{"ok":false,"error":"Unauthorized"}` | **200 + echte Chat-Titel, Previews, Token-Zahlen** | +| `/api/files` | 401 | **200** | + +Der Produktions-Build setzt die Authentifizierung nicht durch. Eine Umstellung hätte sämtliche Agent-Konversationen öffentlich gemacht. **Nicht auf `node server-entry.js` umstellen, bevor die Auth-Middleware im SSR-Pfad repariert ist.** Prüfkommando danach: + +```bash +curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:PORT/api/sessions # muss 401 sein +``` + +Verbleibender Nachteil des Dev-Servers: er liefert serverseitigen Quellcode aus (`/src/server/auth-middleware.ts`, `/vite.config.ts` → 200). **Keine Secrets betroffen** — `.env` und `/@fs/`-Zugriffe sind mit Vite 7.3.5 korrekt geblockt (403), im ausgelieferten Code stehen nur Variablennamen. + +--- + +## 🎵 Melo App & Cloud + +**Upload-Datenverlust behoben.** `upload()` verknüpfte bei >85 % Titel-Ähnlichkeit auf einen bestehenden Song und **verwarf die hochgeladene Datei** — Live-Versionen und Remixes wurden durch das Studio-Original ersetzt. Entfernt. Begründung durch Messung: 323 von 325 Songs haben einen gültigen Fingerprint (99,4 %), `fpcalc` läuft. Greift der Fingerprint nicht, ist das Audio nachweislich anders; ein Dateiname darf das nicht überstimmen. + +End-to-End getestet (zwei verschiedene Audios, 94 % ähnliche Namen): neu → `new`, identisch → `linked` (SHA256-Dedup intakt), anderes Audio → `new` mit eigener ID. Gespeicherte Dateien byte-identisch mit den Originalen. Testdaten restlos entfernt (wieder 325 Songs, 0 verwaiste Einträge). + +**`cgi`-Modul ersetzt.** Multipart-Parsing läuft jetzt über die stdlib (`email`); `cgi` ist seit Python 3.13 entfernt (PEP 594) — der Upload wäre beim Distro-Upgrade wortlos ausgefallen. Gegen `cgi.FieldStorage` byte-identisch getestet (Nullbytes, CRLF, Boundary-Sequenzen, Umlaute). + +**`deletePlaylist` repariert.** Schickte POST auf `/api/v1/cloud/playlists`; der Server unterscheidet dort nach Methode (POST = anlegen, DELETE = löschen). Das Löschen landete im Anlegen-Handler, scheiterte an der Namensprüfung und lieferte HTTP 200 mit `status: error` — die UI meldete trotzdem Erfolg, die Playlist blieb. Jetzt DELETE, Rückgabewert wird ausgewertet, 3 Regressionstests. + +- **202 Tests grün** (vorher 199), `flutter analyze` ohne Befund +- Commit `2223813` auf Branch `fix/cloud-playlist-delete`, noch nicht auf `main` +- `main` hat zusätzlich `v2.56.2` ungepusht + +--- + +## 🧹 Aufgeräumt (~5 GB, 179 G → 184 G frei) + +APT-Cache (1,1 G) · Build-Output des veralteten Duplikats `git/melo_app` (3,0 G) · npm-Cache · `gateway-restart.log` (29 M → 428 K) · drei leere Alt-Datenbanken in `/var/lib/melo-cloud/`. + +**Nicht angefasst:** `.gradle/caches` (5,2 G) und `.hermes/profiles/server-security/home` (9,3 G — zweites Home mit eigenem Flutter, Chrome, Claude-Versionen). Beides regenerierbar, aber teuer bzw. potenziell in Benutzung. + +--- + +## 📌 Offene Themen + +- **`/home/dustin/scripts` ist kein Git-Repo.** ~3400 Zeilen Python tragen Auth und Musik-Cloud, völlig unversioniert. Einziger Schutz sind die Backups von heute. Eigenes Repo dringend empfohlen (`.gitignore` für `__pycache__` und Secrets). +- **Auth-Middleware im SSR-Pfad von workspace** — Blocker für jeden Prod-Build. +- **Versionsstrings der App widersprechen sich:** `main.dart:32` → 2.56.1, `settings_screen.dart:364` → 2.56.1, `settings_screen.dart:500` → 2.56.0, `home_screen.dart:1236` → 2.56.0. Nirgends 2.56.2. Besser eine Konstante, auf die alle vier zeigen. +- **Passwortloses sudo bleibt bewusst.** `backup_and_cleanup.sh` läuft per Cron täglich 04:00 und braucht es — global entfernen bricht das Backup still. Falls Härtung: NOPASSWD auf die konkret nötigen Befehle einschränken und den Cron-Lauf testen. +- **`_download`/`_stream` in `melo_cloud.py`** lesen ganze Dateien in den RAM (`fh.read()`), ebenso `download()` in der App (`r.bodyBytes`). Bei 50-MB-Songs und 7,7 GB RAM perspektivisch ein Thema. +- Basic-Auth-Passwörter (`baka`, `dustin`, `tinker`) schützen jetzt deutlich mehr als vorher — falls eins schwach ist, wäre das der nächste Schritt. + +--- + +## Verwandte Notizen +- [[Server Aingrad - Komplette Übersicht]] — Dienst-Tabelle und Neustart-Befehle oben korrigieren +- [[Melo App - Status]] — Stand dort ist v2.53.1, aktuell ist v2.56.2 + Fix-Branch diff --git a/Notizen/Melo App - Status.md b/Notizen/Melo App - Status.md new file mode 100644 index 0000000..6870044 --- /dev/null +++ b/Notizen/Melo App - Status.md @@ -0,0 +1,43 @@ +# Melo App - Status + +> Stand: 05.08.2026 · v2.53.1 · arm64 · 21,0 MB + +## Aktuelle Version +- **v2.53.1** — Sprint D+E abgeschlossen, Review-FREIGABE +- 143/143 Tests, 0 Lint-Issues +- Push: `file:///home/dustin/gitea/data/git/repositories/baka/melo-app.git` + +## Sync-System (v2.52-53) +- Favoriten bidirektional (lokal ∪ Server, sofort-Push) +- YT-Links nur Server-Fallback (kein Re-Download) +- Tombstones mit Server-Zeitstempel +- Auto-Sync Aus/1h/3h/6h/12h + Notification +- Konflikt-Report bei >24h Offline + +## Navigation (5 Tabs, Rechtshänder) +``` +🏠 Start — Weiterhören, Recap (7T/Monat/Jahr) +📚 Bibliothek — Songs, Alben, Künstler, Tags, Playlists, Downloads +▶️ Jetzt läuft — Now-Playing-Fullscreen +☁️ Cloud — Dashboard, Sync, Konflikt-Report +⚙️ Mehr — Einstellungen, Erweitert +``` + +## Versions-Historie +| Version | Inhalt | +|---------|--------| +| v2.48 | Sprint A: Shuffle, Repeat, Queue, Sleep-Timer | +| v2.49 | Sprint B: Now-Playing, Lyrics | +| v2.50 | Glow-Pulsation, Crossfade, 98 Tests | +| v2.51 | Sprint C: 5-Tabs, Cloud-Dashboard | +| v2.52 | Sprint D: Favoriten-Sync, YT-Fallback, Einstellungen | +| v2.53 | Sprint E: Recaps, Tombstones, Konflikt-Report | + +## Offene Themen +- Sprint F: Android Auto, Home-Widget, Equalizer +- melo_cloud.py nicht versioniert (eigenes Repo empfohlen) +- Tinker-Easter-Egg: "Illuminati Song" + +## Verwandte Notizen +- [[Server Aingrad - Komplette Übersicht]] +- Merge-Dateien für Claude: lokal `~/notizen/melo-claude-briefing.md` + `melo-app-code.md` diff --git a/Notizen/Server Aingrad - Komplette Übersicht.md b/Notizen/Server Aingrad - Komplette Übersicht.md index 85edc65..9666753 100644 --- a/Notizen/Server Aingrad - Komplette Übersicht.md +++ b/Notizen/Server Aingrad - Komplette Übersicht.md @@ -1,9 +1,8 @@ # Server Aingrad – Komplette Übersicht -> Stand: 24.07.2026 -> IP: 159.195.51.99 -> ZeroTier: 10.19.81.21 -> System: Ubuntu 24.04 LTS, 4 Kerne, 8 GB RAM, 251 GB SSD +> Stand: 05.08.2026 +> IP: 159.195.51.99 +> System: Ubuntu 24.04 LTS, 8 Kerne, 7.7 GB RAM, 2 GB Swap > Domain: baka-net.de --- @@ -15,13 +14,18 @@ ssh dustin@159.195.51.99 # Docker-Container anzeigen -docker ps +sudo docker ps # Logs eines Containers -docker logs +sudo docker logs -# Server neustarten -sudo reboot +# Caddy neu laden +sudo systemctl reload caddy + +# Auth/Cloud/YT-Prozesse neu starten +sudo pkill -f baka_auth.py && python3 /home/dustin/scripts/baka_auth.py 8994 & +sudo pkill -f melo_cloud.py && python3 /home/dustin/scripts/melo_cloud.py 8993 & +sudo pkill -f yt_proxy.py && python3 /home/dustin/scripts/yt_proxy.py 8992 & # Festplattenplatz prüfen df -h @@ -29,182 +33,37 @@ df -h # RAM/Nutzung prüfen free -m -# Hermes Gateway neustarten -systemctl --user restart hermes-gateway +# YT-Finder manuell +python3 /home/dustin/scripts/yt_link_finder.py ``` --- -## 🔒 1. Firewall (UFW) – Port-Freigaben +## 🌍 Domains & Dienste -**Status:** `sudo ufw status` +| URL | Dienst | Port | Zugriff | +|-----|--------|------|---------| +| https://baka-net.de | Dashboard (SPA) | 443 | Basic Auth | +| https://baka-net.de/melo/ | Melo Downloads | 443 | Öffentlich | +| https://cloud.baka-net.de | Melo Cloud API (v1) | 8993 | JWT | +| https://musik.baka-net.de | Navidrome | 4533 | Proxy-Auth | +| https://git.baka-net.de | Gitea | 3000 | Login | +| https://yt.baka-net.de | YT-Proxy | 8992 | Bearer-JWT | +| https://search.baka-net.de | SearXNG Meta-Suche | 8888 | Offen | +| https://mc.baka-net.de | MC-Infoseite | — | Öffentlich | +| Minecraft | Bedrock 1.26.36.1 | 19132/UDP | Offen, offline-mode | -| Erlaubt für | Port | Erklärung | -|-------------|------|-----------| -| SSH | 22/tcp | Server-Zugriff | -| Web (Caddy) | 80, 443/tcp | Websites + SSL | -| Syncthing | 22000/tcp+udp | Datei-Sync | -| ZeroTier | 9993/udp | VPN-Netzwerk | -| ZeroTier-Intern | Alle Ports auf `zt+` | Zugriff über sicheres VPN | +## Docker-Container +`anisette` · `synapse` · `navidrome` · `ladder` · `gitea` · `searxng` ---- +## Wichtigste Datenbanken +- Baka-Auth: `/var/lib/melo-cloud/baka_auth.db` +- Registry (325 Songs): `/var/lib/melo-cloud/registry.db` +- Navidrome: 323 Songs, MusicFolder `/var/lib/melo-cloud/registry` -## 📦 2. Docker-Container +## ⚠️ Legacy +- API-Key `melo-cloud-2026-*` entfernt (v2.45, JWT ersetzt) — Build OHNE --dart-define -```bash -docker ps # Laufende Container anzeigen -docker ps -a # Alle Container (auch gestoppte) -docker logs -f # Live-Logs anzeigen -docker restart # Container neustarten -docker stop # Container stoppen -docker system prune -af # Ungenutzte Docker-Daten löschen -``` - -### Aktive Container - -| Container | Port | Zweck | -|-----------|------|-------| -| **gitea** | `127.0.0.1:3000` | Eigenes Git-System (git.baka-net.de) | -| **synapse** | `127.0.0.1:8008` | Matrix-Chat-Server (matrix.baka-net.de) | -| **anisette** | `127.0.0.1:6969` | Anisette-V3 für iOS-Sideloading (anisette.baka-net.de) | - ---- - -## 🌐 3. Caddy-Webserver (Domain-Routing) - -**Konfiguration:** `/etc/caddy/Caddyfile` - -```bash -caddy reload # Konfiguration neu laden -systemctl restart caddy # Caddy neustarten -journalctl -u caddy -n 50 # Letzte 50 Log-Einträge -``` - -| Domain | Weiterleitung auf | -|--------|-------------------| -| baka-net.de | Statische Webseite | -| matrix.baka-net.de | localhost:8008 (Synapse) | -| git.baka-net.de | localhost:3000 (Gitea) | -| anisette.baka-net.de | localhost:6969 (Anisette-V3) | - ---- - -## 🧰 4. Installierte Entwickler-Tools - -```bash -# Flutter & Dart (Android/iOS App-Entwicklung) -export PATH="$HOME/development/flutter/bin:$PATH" -flutter doctor # Status prüfen -flutter build apk --release --split-per-abi # APK bauen - -# Android SDK -export ANDROID_HOME="$HOME/development/android-sdk" -sdkmanager --list_installed # Installierte SDK-Versionen - -# Java -java -version # OpenJDK 17 -``` - ---- - -## 🛡️ 5. Security-Tools - -### Gitleaks – Findet Secrets in Git-Repos -```bash -# Aktuelles Repo scannen -gitleaks detect --source /pfad/zum/repo --verbose - -# Nur geänderte Dateien vor Commit prüfen -gitleaks detect --source . --log-level debug - -# Komplette Git-Historie durchsuchen -gitleaks detect --source /pfad/zum/repo --no-git -``` - -### Trivy – Schwachstellen-Scanner -```bash -# Repository scannen -trivy repo https://github.com/user/repo - -# Dateisystem scannen -trivy fs /pfad/zum/repo - -# Docker-Image scannen -trivy image alpine:latest -``` - -### Semgrep – Statische Code-Analyse (SAST) -```bash -# Projekt analysieren -semgrep --config=auto /pfad/zum/projekt - -# Nach Sicherheitslücken suchen -semgrep --config=p/default /pfad/zum/projekt - -# Nur bestimmte Regeln -semgrep --config=p/docker-security /pfad -``` - ---- - -## 🌐 6. Website-Klon-Tools - -### HTTrack – Komplette Webseiten kopieren -```bash -# Komplette Seite runterladen -httrack "https://example.com" -O /home/dustin/archiv/seite --depth=3 - -# Nur eine Seite + Ressourcen -httrack "https://example.com/seite.html" -O /home/dustin/archiv/seite --depth=1 - -# Mit Benutzername/Passwort -httrack "https://user:pass@example.com" -O /home/dustin/archiv/seite -``` - ---- - -## 🔄 7. Automatische Backups (Cron - 04:00 Uhr) - -```bash -# Backup-Skript manuell ausführen -sudo /home/dustin/scripts/backup_and_cleanup.sh - -# Backup-Ordner prüfen -ls -lh /home/dustin/Sync/backups/ - -# Crontab anzeigen -sudo crontab -l -``` - -**Sichert automatisch:** Gitea-Daten + Synapse-Datenbank -**Bereinigt:** Docker-Müll (`system prune`) -**Backup-Ziel:** `/home/dustin/Sync/backups/` (7 Tage Aufbewahrung) - ---- - -## 🧪 8. Weitere Tools - -| Tool | Befehl | Zweck | -|------|--------|-------| -| ZeroTier | `zerotier-cli listnetworks` | VPN-Status prüfen | -| Syncthing | `systemctl status syncthing@dustin` | Sync-Dienst prüfen | -| ADB | `adb devices` | Android-Geräte-Liste | -| Flutter | `flutter build apk --release --split-per-abi` | APK bauen | - ---- - -## 📁 Wichtige Pfade - -| Pfad | Inhalt | -|------|--------| -| `/home/dustin/` | Benutzer-Home | -| `/home/dustin/git/` | Git-Repos | -| `/home/dustin/git/melo_app/` | Melo App Quellcode | -| `/home/dustin/development/` | Flutter + Android SDK | -| `/home/dustin/hermes-vault/` | Notizen (Obsidian) | -| `/home/dustin/.hermes/` | Hermes-Konfiguration | -| `/home/dustin/scripts/` | Eigene Skripte | -| `/home/dustin/Sync/` | Syncthing-Synchronisation | -| `/home/dustin/Sync/backups/` | Backup-Archive | -| `/home/dustin/musik/` | Musik-Ordner | -| `/etc/caddy/Caddyfile` | Caddy-Konfiguration | +## Verwandte Notizen +- [[Melo App - Status]] +- Detaillierte Zugangsdaten: lokal `~/notizen/baka-net-gesamt.md` diff --git a/Projects/Melo Cloud Sync Plan.md b/Projects/Melo Cloud Sync Plan.md new file mode 100644 index 0000000..f1a2d17 --- /dev/null +++ b/Projects/Melo Cloud Sync Plan.md @@ -0,0 +1,58 @@ +# Melo Cloud Sync – Phasen-Plan + +> Stand: 26.07.2026 +> Server: Aingrad (Netcup RS 1000) +> Technik: Python/Flask + SQLite + Symlinks + +--- + +## 🔴 **Phase 1: Registry-Server** + +``` +/var/lib/melo-cloud/ +├── registry/ ← Alle Songs (nur 1x physisch) +│ └── abc123.mp3 +├── users/ +│ ├── baka/ ← Symlinks auf registry/ +│ └── melo/ ← Symlinks auf registry/ +└── covers/ ← Original-Cover von YouTube +``` + +- [ ] Flask API (Port 8993) +- [ ] SQLite DB mit `registry` + `user_songs` Tabellen +- [ ] Auth per Navidrome-Credentials +- [ ] Upload-API: SHA256-Check → fpcalc-Fingerprint → speichern in Registry → Hardlink +- [ ] Deduplizierung: SHA256 + Fingerprint + Titel-Similarität (>90%) +- [ ] Custom-Titel/Cover pro User +- [ ] Systemd-Service `melo-cloud.service` + +## 🟡 **Phase 2: Sync-API** + +- [ ] `POST /api/cloud/upload` – MP3 hochladen + Registry-Check +- [ ] `GET /api/cloud/download` – Song vom Server runterladen +- [ ] `GET /api/cloud/list` – Alle eigenen Songs + Status +- [ ] `DELETE /api/cloud/delete` – Link in User-Cloud löschen +- [ ] `GET /api/cloud/status` – Übersicht (Count, letzter Sync) + +## 🟢 **Phase 3: CloudScreen (Flutter)** + +- [ ] Neuer Tab "Cloud" mit Bottom-Nav +- [ ] Upload: Lokale MP3s → Server mit Fortschritt +- [ ] Download: Server-Songs → Lokal (Batch) +- [ ] Sync-Logik: `checkLocalVsServer()` → Diff anzeigen +- [ ] Sync-Intervall: Manuell / 3h / 6h / 12h + +## 🔵 **Phase 4: Playlist-Teilen** + +- [ ] Share-Button → 6-stelliger Code generieren +- [ ] Code eingeben → Playlist importieren +- [ ] "Nur passende Songs" / "Alle inkl. fehlende" Auswahl +- [ ] Matching: Per `registry.orig_title` → Levenshtein-Abgleich + +## 🟣 **Phase 5: Geräteübergreifender Sync** + +- [ ] Push-Benachrichtigung bei neuen Songs +- [ ] Auto-Sync nach Intervall +- [ ] Lösch-Sync über Geräte +- [ ] Konflikte: Server = Source of Truth +- [ ] Sync-Protokoll (letzte 50 Aktionen)