Vault initial

This commit is contained in:
Hermes (Server)
2026-08-17 10:56:15 +02:00
parent 26cc1e86b0
commit 3274c11938
12 changed files with 625 additions and 192 deletions
Binary file not shown.
+133
View File
@@ -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 367371
| 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 272291
- **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 |
+22
View File
@@ -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
+24
View File
@@ -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
+24
View File
@@ -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
+1
View File
@@ -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-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-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}}
+164 -14
View File
@@ -1,7 +1,7 @@
{ {
"version": 1, "version": 1,
"events": 6, "events": 7,
"updatedAt": "2026-07-23T12:47:03.764Z", "updatedAt": "2026-08-01T11:55:35.134Z",
"paths": { "paths": {
"Brain/INDEX.md": { "Brain/INDEX.md": {
"strength": 0.3, "strength": 0.3,
@@ -14,9 +14,9 @@
"accessCount": 1 "accessCount": 1
}, },
"Brain/active.md": { "Brain/active.md": {
"strength": 0.1, "strength": 0.2,
"lastAccessAt": 1784805125265, "lastAccessAt": 1785585335134,
"accessCount": 1 "accessCount": 2
}, },
"Brain/inbox/sig-2026-07-09-brain-index.md": { "Brain/inbox/sig-2026-07-09-brain-index.md": {
"strength": 0.1, "strength": 0.1,
@@ -33,6 +33,11 @@
"lastAccessAt": 1784805125422, "lastAccessAt": 1784805125422,
"accessCount": 1 "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": { "Brain/inbox/sig-2026-07-16-auto-brain-load.md": {
"strength": 0.1, "strength": 0.1,
"lastAccessAt": 1784805125422, "lastAccessAt": 1784805125422,
@@ -44,9 +49,9 @@
"accessCount": 1 "accessCount": 1
}, },
"Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md": { "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md": {
"strength": 0.1, "strength": 0.2,
"lastAccessAt": 1784805125265, "lastAccessAt": 1785585335134,
"accessCount": 1 "accessCount": 2
}, },
"Brain/inbox/sig-2026-07-19-server-port-map-2.md": { "Brain/inbox/sig-2026-07-19-server-port-map-2.md": {
"strength": 0.1, "strength": 0.1,
@@ -63,6 +68,21 @@
"lastAccessAt": 1784810821353, "lastAccessAt": 1784810821353,
"accessCount": 2 "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": { "Brain/log/2026-07-16.a0360993.md": {
"strength": 0.1, "strength": 0.1,
"lastAccessAt": 1784810821353, "lastAccessAt": 1784810821353,
@@ -89,9 +109,9 @@
"accessCount": 2 "accessCount": 2
}, },
"Brain/log/2026-07-23.a0360993.md": { "Brain/log/2026-07-23.a0360993.md": {
"strength": 0.1, "strength": 0.2,
"lastAccessAt": 1784805125265, "lastAccessAt": 1785585335134,
"accessCount": 1 "accessCount": 2
}, },
"Brain/pinned.md": { "Brain/pinned.md": {
"strength": 0.2, "strength": 0.2,
@@ -108,6 +128,11 @@
"lastAccessAt": 1784805125422, "lastAccessAt": 1784805125422,
"accessCount": 1 "accessCount": 1
}, },
"Brain/preferences/pref-default-model-deepseek.md": {
"strength": 0.1,
"lastAccessAt": 1785585335134,
"accessCount": 1
},
"Brain/preferences/pref-server-port-map.md": { "Brain/preferences/pref-server-port-map.md": {
"strength": 0.1, "strength": 0.1,
"lastAccessAt": 1784805125265, "lastAccessAt": 1784805125265,
@@ -120,6 +145,21 @@
} }
}, },
"coAccess": [ "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", "a": "Brain/INDEX.md",
"b": "Brain/log/2026-07-09.a0360993.md", "b": "Brain/log/2026-07-09.a0360993.md",
@@ -172,7 +212,7 @@
}, },
{ {
"a": "Brain/active.md", "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 "count": 1
}, },
{ {
@@ -185,6 +225,21 @@
"b": "Brain/inbox/sig-2026-07-19-server-port-map.md", "b": "Brain/inbox/sig-2026-07-19-server-port-map.md",
"count": 1 "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", "a": "Brain/active.md",
"b": "Brain/log/2026-07-19.a0360993.md", "b": "Brain/log/2026-07-19.a0360993.md",
@@ -197,7 +252,7 @@
}, },
{ {
"a": "Brain/active.md", "a": "Brain/active.md",
"b": "Brain/log/2026-07-23.a0360993.md", "b": "Brain/preferences/pref-default-model-deepseek.md",
"count": 1 "count": 1
}, },
{ {
@@ -295,6 +350,36 @@
"b": "Brain/preferences/pref-brain-index.md", "b": "Brain/preferences/pref-brain-index.md",
"count": 1 "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", "a": "Brain/inbox/sig-2026-07-16-auto-brain-load.md",
"b": "Brain/inbox/sig-2026-07-16-check-system-time.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", "b": "Brain/inbox/sig-2026-07-19-server-port-map.md",
"count": 1 "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", "a": "Brain/inbox/sig-2026-07-18-vps-plan-august-2026.md",
"b": "Brain/log/2026-07-19.a0360993.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", "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 "count": 1
}, },
{ {
@@ -440,6 +540,51 @@
"b": "Soul.md", "b": "Soul.md",
"count": 1 "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", "a": "Brain/log/2026-07-16.a0360993.md",
"b": "Brain/pinned.md", "b": "Brain/pinned.md",
@@ -490,6 +635,11 @@
"b": "Brain/preferences/pref-server-port-map.md", "b": "Brain/preferences/pref-server-port-map.md",
"count": 1 "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", "a": "Brain/log/2026-07-23.a0360993.md",
"b": "Brain/preferences/pref-server-port-map.md", "b": "Brain/preferences/pref-server-port-map.md",
@@ -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"
]
}
@@ -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
+43
View File
@@ -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`
+36 -177
View File
@@ -1,9 +1,8 @@
# Server Aingrad Komplette Übersicht # Server Aingrad Komplette Übersicht
> Stand: 24.07.2026 > Stand: 05.08.2026
> IP: 159.195.51.99 > IP: 159.195.51.99
> ZeroTier: 10.19.81.21 > System: Ubuntu 24.04 LTS, 8 Kerne, 7.7 GB RAM, 2 GB Swap
> System: Ubuntu 24.04 LTS, 4 Kerne, 8 GB RAM, 251 GB SSD
> Domain: baka-net.de > Domain: baka-net.de
--- ---
@@ -15,13 +14,18 @@
ssh dustin@159.195.51.99 ssh dustin@159.195.51.99
# Docker-Container anzeigen # Docker-Container anzeigen
docker ps sudo docker ps
# Logs eines Containers # Logs eines Containers
docker logs <container> sudo docker logs <container>
# Server neustarten # Caddy neu laden
sudo reboot 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 # Festplattenplatz prüfen
df -h df -h
@@ -29,182 +33,37 @@ df -h
# RAM/Nutzung prüfen # RAM/Nutzung prüfen
free -m free -m
# Hermes Gateway neustarten # YT-Finder manuell
systemctl --user restart hermes-gateway 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 | ## Docker-Container
|-------------|------|-----------| `anisette` · `synapse` · `navidrome` · `ladder` · `gitea` · `searxng`
| 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 |
--- ## 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 ## Verwandte Notizen
docker ps # Laufende Container anzeigen - [[Melo App - Status]]
docker ps -a # Alle Container (auch gestoppte) - Detaillierte Zugangsdaten: lokal `~/notizen/baka-net-gesamt.md`
docker logs -f <name> # Live-Logs anzeigen
docker restart <name> # Container neustarten
docker stop <name> # 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 |
+58
View File
@@ -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)