- Filterzeile mit Von, An, Kanal-Dropdown, Hops (≤) und Freitextsuche
- buildRow() befüllt data-from/to/channel/hops/search für performante Filterung
- rowVisible() prüft alle aktiven Filter (AND-Logik)
- Channel-Dropdown wird beim channels-WS-Event befüllt
- Reset-Button setzt alle Zusatzfilter zurück
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
INSERT OR IGNORE + UPDATE statt SELECT → INSERT eliminiert den
UNIQUE-constraint-Fehler bei konkurrierenden async-Aufrufen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Wenn beim Start keine User in der Datenbank vorhanden sind, wird
automatisch ein verifizierter Admin angelegt:
E-Mail: admin@localhost
Passwort: changeme
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- database.path in config.yaml: meshdd.db → data/meshdd.db
- data/.gitkeep: Verzeichnis in Git verankert, *.db-wal/shm gitignored
- database.py: PRAGMA wal_checkpoint(FULL) vor db.close() für sauberes Schließen
- main.py: Shutdown-Schritte einzeln mit try/except gekapselt;
db.close() wird jetzt auch bei Fehlern in vorherigen Schritten ausgeführt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- auth.secret_key und smtp.* direkt in config/config.yaml aufgenommen
- config/env.example entfernt, config/config.example.yaml als Vorlage hinzugefügt
- meshbot/auth.py: config.env() → config.get() für alle Auth/SMTP-Werte
- meshbot/config.py: ENV_PATH, _load_env(), env() entfernt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>