mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 20:01:09 +02:00
📝 docs(devlog): add missing devlogs for Jan 24-27 and Feb 14-15
Add 5 devlogs covering previously undocumented development days: - 2026-01-24: Guest mode improvements for Clock & Contacts - 2026-01-25: NutriPhi app, Prometheus monitoring, Watchtower - 2026-01-27: Matrix self-hosting, Stats/Doc/Ollama bots - 2026-02-14: Matrix STT bot, gift code UI, onboarding bot - 2026-02-15: Onboarding modal polish, Calendar ViewsBar
This commit is contained in:
parent
f77edbdedd
commit
7747ca6a36
5 changed files with 1548 additions and 0 deletions
|
|
@ -0,0 +1,115 @@
|
|||
---
|
||||
title: 'Guest Mode Verbesserungen für Clock & Contacts'
|
||||
description: 'Session-first Guest Mode für Contacts und diverse Guest-Mode-Fixes für Clock App. Behebung von Auth-Redirect und undefined Errors.'
|
||||
date: 2026-01-24
|
||||
author: 'Till Schneider'
|
||||
category: 'bugfix'
|
||||
tags: ['guest-mode', 'clock', 'contacts', 'session-storage', 'authentication', 'ux']
|
||||
featured: false
|
||||
commits: 4
|
||||
readTime: 3
|
||||
stats:
|
||||
filesChanged: 17
|
||||
linesAdded: 591
|
||||
linesRemoved: 156
|
||||
contributors:
|
||||
- name: 'Till Schneider'
|
||||
handle: 'Till-JS'
|
||||
commits: 4
|
||||
workingHours:
|
||||
start: '2026-01-24T11:00'
|
||||
end: '2026-01-25T11:00'
|
||||
---
|
||||
|
||||
Fokussierter Tag mit **4 Commits** zur Verbesserung des Guest-Mode-Erlebnisses:
|
||||
|
||||
- **Clock Guest Mode** - Alarms/Timers ohne Auth-Redirect ladbar
|
||||
- **Contacts Session-First** - Neuer Guest-Mode-Ansatz mit Session-Storage
|
||||
- **Bugfixes** - undefined Error bei userSettings.nav behoben
|
||||
|
||||
---
|
||||
|
||||
## Clock App Guest Mode Fixes
|
||||
|
||||
Zwei kritische Fixes für das Clock App Guest-Erlebnis:
|
||||
|
||||
### Alarms/Timers in Guest Mode
|
||||
|
||||
```typescript
|
||||
// Vorher: Daten wurden nur für eingeloggte User geladen
|
||||
// Nachher: Guest Mode lädt aus localStorage
|
||||
if (!session) {
|
||||
// Load from localStorage for guest mode
|
||||
alarms = loadAlarmsFromLocalStorage();
|
||||
timers = loadTimersFromLocalStorage();
|
||||
}
|
||||
```
|
||||
|
||||
### Auth Redirect entfernt
|
||||
|
||||
Das Dashboard war für Gäste unzugänglich, da ein Auth-Redirect vorhanden war:
|
||||
|
||||
| Vorher | Nachher |
|
||||
| -------------------- | --------------------------- |
|
||||
| Redirect zu `/login` | Dashboard direkt zugänglich |
|
||||
| Daten nicht geladen | LocalStorage-Fallback |
|
||||
|
||||
---
|
||||
|
||||
## Contacts Session-First Guest Mode
|
||||
|
||||
Neues Feature für die Contacts App: Session-first Guest Mode ermöglicht es Nutzern, die App sofort zu testen ohne Registrierung.
|
||||
|
||||
### Architektur
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Contacts App │
|
||||
├─────────────────────────────────────────────────────┤
|
||||
│ 1. Check Auth Session │
|
||||
│ ├─ Session vorhanden → Supabase-Daten laden │
|
||||
│ └─ Keine Session → SessionStorage verwenden │
|
||||
│ │
|
||||
│ 2. Guest Mode Features │
|
||||
│ ├─ Kontakte erstellen/bearbeiten │
|
||||
│ ├─ Gruppen verwalten │
|
||||
│ └─ Alles lokal gespeichert │
|
||||
│ │
|
||||
│ 3. Upgrade-Pfad │
|
||||
│ └─ Bei Registrierung: Daten zu Supabase sync │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Implementation
|
||||
|
||||
- **545 neue Zeilen** für Session-Storage-Integration
|
||||
- Automatischer Sync bei späterer Registrierung
|
||||
- Keine Daten gehen verloren
|
||||
|
||||
---
|
||||
|
||||
## Bugfixes
|
||||
|
||||
| Fix | Beschreibung |
|
||||
| ---------------------------- | ---------------------------------------------- |
|
||||
| `userSettings.nav undefined` | Guard für undefined userSettings in Guest Mode |
|
||||
| Auth Redirect Dashboard | Entfernt für Guest-Zugänglichkeit |
|
||||
| Alarms nicht geladen | LocalStorage-Fallback hinzugefügt |
|
||||
|
||||
---
|
||||
|
||||
## Zusammenfassung
|
||||
|
||||
| Bereich | Commits | Highlights |
|
||||
| -------------------- | ------- | ----------------------- |
|
||||
| **Clock Fixes** | 2 | Guest Mode funktional |
|
||||
| **Contacts Feature** | 1 | Session-first Ansatz |
|
||||
| **Web Fixes** | 1 | undefined Error behoben |
|
||||
|
||||
---
|
||||
|
||||
## Nächste Schritte
|
||||
|
||||
1. **Guest Mode für weitere Apps** ausrollen
|
||||
2. **Sync-Logik** für Guest → Auth Übergang verfeinern
|
||||
3. **Onboarding Flow** für Guest-Nutzer optimieren
|
||||
|
|
@ -0,0 +1,366 @@
|
|||
---
|
||||
title: 'NutriPhi App, Prometheus Monitoring & Watchtower Auto-Deploy'
|
||||
description: 'AI-powered Nutrition Tracking App hinzugefügt, Prometheus Metriken für alle Backends, umfassende Grafana Dashboards, und Watchtower für automatisches Container-Deployment.'
|
||||
date: 2026-01-25
|
||||
author: 'Till Schneider'
|
||||
category: 'feature'
|
||||
tags:
|
||||
[
|
||||
'nutriphi',
|
||||
'prometheus',
|
||||
'grafana',
|
||||
'watchtower',
|
||||
'monitoring',
|
||||
'docker',
|
||||
'ci-cd',
|
||||
'health-checks',
|
||||
'presi',
|
||||
'storage',
|
||||
]
|
||||
featured: true
|
||||
commits: 38
|
||||
readTime: 15
|
||||
stats:
|
||||
filesChanged: 446
|
||||
linesAdded: 32534
|
||||
linesRemoved: 17786
|
||||
contributors:
|
||||
- name: 'Till Schneider'
|
||||
handle: 'Till-JS'
|
||||
commits: 38
|
||||
workingHours:
|
||||
start: '2026-01-25T11:00'
|
||||
end: '2026-01-26T11:00'
|
||||
---
|
||||
|
||||
Massiver Tag mit **38 Commits** und Fokus auf neue App, Monitoring und Infrastructure:
|
||||
|
||||
- **NutriPhi** - AI-powered Nutrition Tracking App mit Gemini
|
||||
- **Prometheus Metriken** - Für alle Backends implementiert
|
||||
- **Grafana Dashboards** - Umfassende Visualisierung und Alerting
|
||||
- **Watchtower** - Automatisches Docker-Image-Update auf Mac Mini
|
||||
- **Presi & Storage** - Apps aus Archiv wiederhergestellt
|
||||
|
||||
---
|
||||
|
||||
## NutriPhi - AI Nutrition Tracking
|
||||
|
||||
Neue App für intelligentes Ernährungs-Tracking mit AI-Analyse.
|
||||
|
||||
### Features
|
||||
|
||||
| Feature | Beschreibung |
|
||||
| --------------------- | ------------------------------------------- |
|
||||
| **Foto-Analyse** | Mahlzeit fotografieren, AI erkennt Zutaten |
|
||||
| **Nährwert-Tracking** | Kalorien, Makros, Mikronährstoffe |
|
||||
| **Meal History** | Tägliche/wöchentliche Übersichten |
|
||||
| **AI Suggestions** | Ernährungsempfehlungen basierend auf Zielen |
|
||||
|
||||
### Tech Stack
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ NutriPhi │
|
||||
├──────────────┬──────────────┬───────────────────────┤
|
||||
│ Mobile │ Web │ Backend │
|
||||
│ (Expo) │ (SvelteKit) │ (NestJS) │
|
||||
├──────────────┴──────────────┴───────────────────────┤
|
||||
│ Google Gemini API │
|
||||
│ (Vision + Text Analysis) │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Datenbankschema
|
||||
|
||||
```sql
|
||||
-- Haupttabellen
|
||||
CREATE TABLE meals (
|
||||
id UUID PRIMARY KEY,
|
||||
user_id UUID REFERENCES users(id),
|
||||
name TEXT,
|
||||
photo_url TEXT,
|
||||
eaten_at TIMESTAMP,
|
||||
calories INTEGER,
|
||||
protein DECIMAL,
|
||||
carbs DECIMAL,
|
||||
fat DECIMAL
|
||||
);
|
||||
|
||||
CREATE TABLE daily_goals (
|
||||
id UUID PRIMARY KEY,
|
||||
user_id UUID REFERENCES users(id),
|
||||
calories_target INTEGER,
|
||||
protein_target DECIMAL,
|
||||
carbs_target DECIMAL,
|
||||
fat_target DECIMAL
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Prometheus Metriken
|
||||
|
||||
Monitoring-Integration für alle NestJS Backends.
|
||||
|
||||
### Implementation
|
||||
|
||||
```typescript
|
||||
// Jedes Backend hat jetzt:
|
||||
import { PrometheusModule } from '@willsoto/nestjs-prometheus';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
PrometheusModule.register({
|
||||
defaultMetrics: { enabled: true },
|
||||
path: '/metrics',
|
||||
}),
|
||||
],
|
||||
})
|
||||
export class AppModule {}
|
||||
```
|
||||
|
||||
### Metriken pro Backend
|
||||
|
||||
| Metrik | Typ | Beschreibung |
|
||||
| ------------------------------- | --------- | ------------------------ |
|
||||
| `http_requests_total` | Counter | Gesamtzahl HTTP Requests |
|
||||
| `http_request_duration_seconds` | Histogram | Request-Dauer |
|
||||
| `http_requests_in_progress` | Gauge | Aktive Requests |
|
||||
| `nodejs_heap_size_bytes` | Gauge | Memory Usage |
|
||||
| `active_users_total` | Gauge | Eingeloggte User |
|
||||
|
||||
### Betroffene Backends
|
||||
|
||||
- mana-core-auth (Port 3001)
|
||||
- chat-backend (Port 3002)
|
||||
- todo-backend (Port 3004)
|
||||
- clock-backend (Port 3005)
|
||||
- picture-backend (Port 3006)
|
||||
- zitare-backend (Port 3007)
|
||||
- presi-backend (Port 3008)
|
||||
- manadeck-backend (Port 3009)
|
||||
- contacts-backend (Port 3010)
|
||||
- calendar-backend (Port 3016)
|
||||
- nutriphi-backend (Port 3027)
|
||||
|
||||
---
|
||||
|
||||
## Grafana Dashboards
|
||||
|
||||
Umfassende Visualisierung aller ManaCore Services.
|
||||
|
||||
### Dashboard-Übersicht
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ ManaCore Monitoring │
|
||||
├─────────────────────────────────────────────────────┤
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||
│ │ Overview │ │ Services │ │ Alerts │ │
|
||||
│ │ Dashboard │ │ Dashboard │ │ Dashboard │ │
|
||||
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||
│ │ CI/CD │ │ Docker │ │ User │ │
|
||||
│ │ Pipeline │ │ Containers │ │ Statistics │ │
|
||||
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Alerting Rules
|
||||
|
||||
| Alert | Condition | Severity |
|
||||
| --------------- | --------------- | -------- |
|
||||
| `ServiceDown` | Up == 0 for 1m | Critical |
|
||||
| `HighErrorRate` | Error rate > 5% | Warning |
|
||||
| `HighLatency` | P99 > 500ms | Warning |
|
||||
| `HighMemory` | Memory > 80% | Warning |
|
||||
|
||||
### User Statistics Panel
|
||||
|
||||
Neues Feature: User-Statistiken in Grafana anzeigen:
|
||||
|
||||
```typescript
|
||||
// Metrics endpoint includes active users
|
||||
register.registerMetric(
|
||||
new Gauge({
|
||||
name: 'manacore_active_users',
|
||||
help: 'Number of active users per app',
|
||||
labelNames: ['app'],
|
||||
})
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Watchtower Auto-Deploy
|
||||
|
||||
Automatisches Container-Update bei neuen Docker Images.
|
||||
|
||||
### Konfiguration
|
||||
|
||||
```yaml
|
||||
# docker-compose.macmini.yml
|
||||
watchtower:
|
||||
image: containrrr/watchtower
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
- WATCHTOWER_CLEANUP=true
|
||||
- WATCHTOWER_POLL_INTERVAL=300
|
||||
- WATCHTOWER_INCLUDE_STOPPED=true
|
||||
command: --interval 300
|
||||
```
|
||||
|
||||
### Workflow
|
||||
|
||||
```
|
||||
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
||||
│ GitHub │────>│ GitHub │────>│ Docker │
|
||||
│ Push │ │ Actions │ │ Registry │
|
||||
└──────────────┘ └──────────────┘ └──────────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
||||
│ Service │<────│ Watchtower │<────│ Polling │
|
||||
│ Restart │ │ Pull │ │ (5 min) │
|
||||
└──────────────┘ └──────────────┘ └──────────────┘
|
||||
```
|
||||
|
||||
### Vorteile
|
||||
|
||||
- **Zero-Downtime**: Rolling Updates
|
||||
- **Automatisch**: Keine manuellen Deployments nötig
|
||||
- **Cleanup**: Alte Images werden gelöscht
|
||||
|
||||
---
|
||||
|
||||
## Presi & Storage Apps
|
||||
|
||||
Apps aus dem Archiv wiederhergestellt und deployment-ready gemacht.
|
||||
|
||||
### Presi (Präsentations-Tool)
|
||||
|
||||
| Feature | Status |
|
||||
| ------------- | --------------- |
|
||||
| Slide Editor | ✅ Funktional |
|
||||
| Export PDF | ✅ Funktional |
|
||||
| Collaboration | 🚧 In Progress |
|
||||
| Docker | ✅ Konfiguriert |
|
||||
|
||||
### Storage (Cloud Storage)
|
||||
|
||||
| Feature | Status |
|
||||
| ----------------- | --------------- |
|
||||
| File Upload | ✅ Funktional |
|
||||
| Folder Management | ✅ Funktional |
|
||||
| Sharing | 🚧 In Progress |
|
||||
| Docker | ✅ Konfiguriert |
|
||||
|
||||
### Deployment Config
|
||||
|
||||
```yaml
|
||||
# Neue Services in docker-compose.macmini.yml
|
||||
presi-backend:
|
||||
image: ghcr.io/till-js/presi-backend:latest
|
||||
ports:
|
||||
- '3008:3008'
|
||||
healthcheck:
|
||||
test: ['CMD', 'curl', '-f', 'http://localhost:3008/health']
|
||||
|
||||
storage-web:
|
||||
image: ghcr.io/till-js/storage-web:latest
|
||||
ports:
|
||||
- '5185:5185'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Health Endpoints
|
||||
|
||||
Alle Web-Apps haben jetzt `/health` Endpoints für Monitoring.
|
||||
|
||||
### Implementation
|
||||
|
||||
```typescript
|
||||
// +server.ts in jeder SvelteKit App
|
||||
export async function GET() {
|
||||
return json({ status: 'healthy', timestamp: new Date().toISOString() });
|
||||
}
|
||||
```
|
||||
|
||||
### Betroffene Apps
|
||||
|
||||
- calendar-web, clock-web, contacts-web
|
||||
- chat-web, picture-web, zitare-web
|
||||
- todo-web, manadeck-web, manacore-web
|
||||
- presi-web, storage-web, nutriphi-web
|
||||
|
||||
---
|
||||
|
||||
## CI/CD Verbesserungen
|
||||
|
||||
Docker Build Jobs für neue Apps hinzugefügt.
|
||||
|
||||
### Neue Workflows
|
||||
|
||||
```yaml
|
||||
# .github/workflows/docker-presi.yml
|
||||
# .github/workflows/docker-storage.yml
|
||||
# .github/workflows/docker-nutriphi.yml
|
||||
```
|
||||
|
||||
### Health Check Fixes
|
||||
|
||||
Mehrere Health-Check-Pfade korrigiert:
|
||||
|
||||
| Service | Vorher | Nachher |
|
||||
| ---------------- | ------------- | --------- |
|
||||
| contacts-backend | `/api/health` | `/health` |
|
||||
| mana-core-auth | `/api/health` | `/health` |
|
||||
| todo-backend | `/api/health` | `/health` |
|
||||
| calendar | Port 3015 | Port 3016 |
|
||||
|
||||
---
|
||||
|
||||
## Infrastructure Cleanup
|
||||
|
||||
Hetzner Staging-Infrastruktur entfernt zugunsten von Mac Mini Production.
|
||||
|
||||
### Entfernte Dateien
|
||||
|
||||
```
|
||||
scripts/hetzner/ # 15,581 Zeilen entfernt
|
||||
docker-compose.staging.yml
|
||||
scripts/staging-deploy.sh
|
||||
```
|
||||
|
||||
### Begründung
|
||||
|
||||
- Mac Mini als einziger Produktionsserver
|
||||
- Keine Staging-Umgebung mehr nötig
|
||||
- Kosteneinsparung
|
||||
|
||||
---
|
||||
|
||||
## Zusammenfassung
|
||||
|
||||
| Bereich | Commits | Highlights |
|
||||
| ----------------- | ------- | ---------------------------- |
|
||||
| **NutriPhi** | 2 | Neue AI Nutrition App |
|
||||
| **Monitoring** | 8 | Prometheus für alle Backends |
|
||||
| **Grafana** | 3 | Dashboards & Alerting |
|
||||
| **Watchtower** | 6 | Auto-Deploy eingerichtet |
|
||||
| **Apps Restore** | 4 | Presi & Storage reaktiviert |
|
||||
| **Health Checks** | 8 | Alle Apps mit /health |
|
||||
| **CI/CD** | 5 | Docker Build Jobs |
|
||||
| **Fixes** | 2 | Port & Path Korrekturen |
|
||||
|
||||
---
|
||||
|
||||
## Nächste Schritte
|
||||
|
||||
1. **Matrix Infrastructure** für GDPR-konforme Bots
|
||||
2. **NutriPhi Mobile** App fertigstellen
|
||||
3. **Alerting** in Grafana aktivieren
|
||||
4. **User Statistics** Dashboard erweitern
|
||||
|
|
@ -0,0 +1,363 @@
|
|||
---
|
||||
title: 'Matrix Self-Hosting, 3 neue Bots & Chat Model Comparison'
|
||||
description: 'GDPR-konforme Matrix-Infrastruktur mit Synapse, neue Stats/ProjectDoc/Ollama Bots, GuestWelcomeModal und Chat Model-Vergleichsfeature.'
|
||||
date: 2026-01-27
|
||||
author: 'Till Schneider'
|
||||
category: 'feature'
|
||||
tags:
|
||||
[
|
||||
'matrix',
|
||||
'synapse',
|
||||
'gdpr',
|
||||
'self-hosting',
|
||||
'stats-bot',
|
||||
'project-doc-bot',
|
||||
'ollama-bot',
|
||||
'chat',
|
||||
'model-comparison',
|
||||
'guest-mode',
|
||||
'telegram-bot',
|
||||
]
|
||||
featured: true
|
||||
commits: 11
|
||||
readTime: 12
|
||||
stats:
|
||||
filesChanged: 112
|
||||
linesAdded: 7365
|
||||
linesRemoved: 257
|
||||
contributors:
|
||||
- name: 'Till Schneider'
|
||||
handle: 'Till-JS'
|
||||
commits: 11
|
||||
workingHours:
|
||||
start: '2026-01-27T11:00'
|
||||
end: '2026-01-28T11:00'
|
||||
---
|
||||
|
||||
Strategischer Tag mit **11 Commits** und Fokus auf GDPR-Compliance und Developer Experience:
|
||||
|
||||
- **Matrix Self-Hosting** - Eigene Synapse-Instanz für GDPR
|
||||
- **3 neue Matrix Bots** - Stats, Project Doc, Ollama
|
||||
- **Chat Model Comparison** - Feature zum Vergleich von AI-Modellen
|
||||
- **GuestWelcomeModal** - Verbessertes Guest Onboarding
|
||||
- **Cleanup** - Märchenzauber-Projekt entfernt
|
||||
|
||||
---
|
||||
|
||||
## Matrix Self-Hosting für GDPR
|
||||
|
||||
Eigene Matrix-Infrastruktur für GDPR-konforme Bot-Kommunikation.
|
||||
|
||||
### Warum Self-Hosting?
|
||||
|
||||
| Aspekt | Matrix.org | Self-Hosted |
|
||||
| ----------- | ------------- | --------------- |
|
||||
| Datenhoheit | ❌ US-Server | ✅ Mac Mini DE |
|
||||
| GDPR | ⚠️ Fragwürdig | ✅ Voll konform |
|
||||
| Latenz | ~100ms | ~10ms |
|
||||
| Kosten | Kostenlos | Server-Kosten |
|
||||
| Kontrolle | Keine | Volle |
|
||||
|
||||
### Architektur
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Mac Mini Server │
|
||||
├─────────────────────────────────────────────────────┤
|
||||
│ ┌─────────────┐ ┌─────────────┐ │
|
||||
│ │ Synapse │ │ PostgreSQL │ │
|
||||
│ │ (Matrix) │◄───│ Database │ │
|
||||
│ │ Port 8448 │ │ │ │
|
||||
│ └──────┬──────┘ └─────────────┘ │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ ┌─────────────────────────────────────────────┐ │
|
||||
│ │ Matrix Bots │ │
|
||||
│ ├──────────┬──────────┬──────────┬───────────┤ │
|
||||
│ │ Stats │ Project │ Ollama │ Clock │ │
|
||||
│ │ Bot │ Doc Bot │ Bot │ Bot │ │
|
||||
│ └──────────┴──────────┴──────────┴───────────┘ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Element Web Client │
|
||||
│ https://element.mana.how │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Docker Konfiguration
|
||||
|
||||
```yaml
|
||||
# docker-compose.matrix.yml
|
||||
synapse:
|
||||
image: matrixdotorg/synapse:latest
|
||||
volumes:
|
||||
- ./synapse-data:/data
|
||||
environment:
|
||||
- SYNAPSE_SERVER_NAME=matrix.mana.how
|
||||
- SYNAPSE_REPORT_STATS=no
|
||||
ports:
|
||||
- '8448:8448'
|
||||
- '8008:8008'
|
||||
|
||||
postgres-matrix:
|
||||
image: postgres:15
|
||||
volumes:
|
||||
- ./postgres-matrix-data:/var/lib/postgresql/data
|
||||
```
|
||||
|
||||
### OIDC Integration
|
||||
|
||||
```yaml
|
||||
# homeserver.yaml
|
||||
oidc_providers:
|
||||
- idp_id: manacore
|
||||
idp_name: ManaCore SSO
|
||||
issuer: 'https://auth.mana.how'
|
||||
client_id: 'synapse'
|
||||
client_secret: '${MATRIX_OIDC_SECRET}'
|
||||
scopes: ['openid', 'profile', 'email']
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Neue Matrix Bots
|
||||
|
||||
### Stats Bot
|
||||
|
||||
Statistiken über die ManaCore-Plattform direkt in Matrix.
|
||||
|
||||
```
|
||||
!stats users - Anzahl registrierter User
|
||||
!stats apps - App-Nutzungsstatistiken
|
||||
!stats daily - Tägliche Aktivität
|
||||
!global - Globale Plattform-Stats
|
||||
```
|
||||
|
||||
**Features:**
|
||||
|
||||
- Prometheus-Integration für Live-Metriken
|
||||
- Grafana-Dashboard-Links
|
||||
- Historische Datenanalyse
|
||||
|
||||
### Project Doc Bot
|
||||
|
||||
Dokumentations-Assistent für Entwickler.
|
||||
|
||||
```
|
||||
!doc search <query> - Docs durchsuchen
|
||||
!doc api <endpoint> - API-Dokumentation
|
||||
!doc setup <app> - Setup-Anleitung
|
||||
!doc claude - CLAUDE.md anzeigen
|
||||
```
|
||||
|
||||
**Features:**
|
||||
|
||||
- Durchsucht alle CLAUDE.md Dateien
|
||||
- API-Dokumentation aus OpenAPI Specs
|
||||
- Code-Beispiele mit Syntax-Highlighting
|
||||
|
||||
### Ollama Bot
|
||||
|
||||
Direkter Zugang zu lokalen LLMs via Matrix.
|
||||
|
||||
```
|
||||
!llm <prompt> - Prompt an Standard-Modell
|
||||
!llm model <name> - Modell wechseln
|
||||
!llm list - Verfügbare Modelle
|
||||
!code <prompt> - Code-optimiertes Modell
|
||||
```
|
||||
|
||||
**Verfügbare Modelle:**
|
||||
|
||||
- gemma3:4b, gemma3:12b
|
||||
- llama3.2:3b, llama3.2:11b
|
||||
- codellama:13b
|
||||
- mistral:7b
|
||||
|
||||
---
|
||||
|
||||
## Chat Model Comparison
|
||||
|
||||
Neues Feature: Vergleiche Antworten verschiedener AI-Modelle.
|
||||
|
||||
### UI Design
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Model Comparison Mode [Toggle] │
|
||||
├─────────────────────────────────────────────────────┤
|
||||
│ ┌──────────────────┐ ┌──────────────────┐ │
|
||||
│ │ GPT-4 Turbo │ │ Claude 3.5 │ │
|
||||
│ │ │ │ │ │
|
||||
│ │ Response A │ │ Response B │ │
|
||||
│ │ │ │ │ │
|
||||
│ └──────────────────┘ └──────────────────┘ │
|
||||
│ │
|
||||
│ ┌──────────────────┐ ┌──────────────────┐ │
|
||||
│ │ Gemini Pro │ │ Ollama Local │ │
|
||||
│ │ │ │ │ │
|
||||
│ │ Response C │ │ Response D │ │
|
||||
│ │ │ │ │ │
|
||||
│ └──────────────────┘ └──────────────────┘ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Implementation
|
||||
|
||||
```typescript
|
||||
// apps/chat/apps/web/src/lib/components/ModelComparison.svelte
|
||||
<script lang="ts">
|
||||
let selectedModels = $state<string[]>(['gpt-4-turbo', 'claude-3.5-sonnet']);
|
||||
let responses = $state<Record<string, string>>({});
|
||||
|
||||
async function compareModels(prompt: string) {
|
||||
const results = await Promise.all(
|
||||
selectedModels.map(model =>
|
||||
chatService.generate(prompt, { model })
|
||||
)
|
||||
);
|
||||
// ... display results side by side
|
||||
}
|
||||
</script>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## GuestWelcomeModal
|
||||
|
||||
Verbessertes Onboarding für Guest-Nutzer.
|
||||
|
||||
### Features
|
||||
|
||||
| Feature | Beschreibung |
|
||||
| ---------------------- | -------------------------------------- |
|
||||
| **Intro Animation** | Kurze Vorstellung der App |
|
||||
| **Feature Highlights** | Was ist ohne Login möglich |
|
||||
| **Upgrade CTA** | Prominenter "Account erstellen" Button |
|
||||
| **Skip Option** | "Als Gast fortfahren" |
|
||||
|
||||
### Design
|
||||
|
||||
```svelte
|
||||
<!-- packages/shared-auth-ui/src/lib/components/GuestWelcomeModal.svelte -->
|
||||
<Modal bind:open={showModal}>
|
||||
<h2>Willkommen bei {appName}!</h2>
|
||||
|
||||
<p>Du kannst die App auch ohne Account nutzen.</p>
|
||||
|
||||
<ul>
|
||||
<li>✅ {guestFeature1}</li>
|
||||
<li>✅ {guestFeature2}</li>
|
||||
<li>❌ {authOnlyFeature}</li>
|
||||
</ul>
|
||||
|
||||
<div class="actions">
|
||||
<Button variant="primary" on:click={register}>Account erstellen</Button>
|
||||
<Button variant="ghost" on:click={continueAsGuest}>Als Gast fortfahren</Button>
|
||||
</div>
|
||||
</Modal>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Telegram Bot Improvements
|
||||
|
||||
Local STT Support und Prometheus Metriken.
|
||||
|
||||
### Speech-to-Text
|
||||
|
||||
```typescript
|
||||
// Vorher: Nur Cloud STT
|
||||
// Nachher: Lokale Whisper-Instanz
|
||||
const sttService = new LocalSTTService({
|
||||
model: 'whisper-large-v3',
|
||||
device: 'cuda', // GPU-beschleunigt
|
||||
});
|
||||
```
|
||||
|
||||
### Metriken
|
||||
|
||||
```typescript
|
||||
// Neue Prometheus Metriken
|
||||
register.registerMetric(
|
||||
new Counter({
|
||||
name: 'telegram_messages_total',
|
||||
help: 'Total Telegram messages processed',
|
||||
labelNames: ['type'], // text, voice, image
|
||||
})
|
||||
);
|
||||
|
||||
register.registerMetric(
|
||||
new Histogram({
|
||||
name: 'telegram_stt_duration_seconds',
|
||||
help: 'STT processing time',
|
||||
})
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Cleanup: Märchenzauber entfernt
|
||||
|
||||
Das Märchenzauber-Projekt wurde aus der Codebase entfernt.
|
||||
|
||||
### Entfernte Dateien
|
||||
|
||||
```
|
||||
apps-archived/maerchenzauber/ # Komplett entfernt
|
||||
- 11 Dateien
|
||||
- 231 Zeilen
|
||||
```
|
||||
|
||||
### Begründung
|
||||
|
||||
- Projekt nicht mehr aktiv entwickelt
|
||||
- Ressourcen auf aktive Apps fokussieren
|
||||
- Archiv-Ordner wurde zu groß
|
||||
|
||||
---
|
||||
|
||||
## Developer Experience Verbesserungen
|
||||
|
||||
Lokale Entwicklung wurde verbessert.
|
||||
|
||||
### Neue Scripts
|
||||
|
||||
```json
|
||||
{
|
||||
"dev:matrix": "docker-compose -f docker-compose.matrix.yml up -d",
|
||||
"dev:stats-bot": "pnpm --filter @matrix/stats-bot dev",
|
||||
"dev:doc-bot": "pnpm --filter @matrix/project-doc-bot dev"
|
||||
}
|
||||
```
|
||||
|
||||
### Health Check Fixes
|
||||
|
||||
| Service | Fix |
|
||||
| ------------- | ------------------------ |
|
||||
| presi-backend | Korrekter `/health` Pfad |
|
||||
|
||||
---
|
||||
|
||||
## Zusammenfassung
|
||||
|
||||
| Bereich | Commits | Highlights |
|
||||
| ---------------- | ------- | ---------------------- |
|
||||
| **Matrix Infra** | 2 | Self-Hosted Synapse |
|
||||
| **Matrix Bots** | 3 | Stats, Doc, Ollama |
|
||||
| **Chat** | 1 | Model Comparison |
|
||||
| **Guest UX** | 1 | Welcome Modal |
|
||||
| **Telegram** | 1 | Local STT + Metrics |
|
||||
| **Cleanup** | 1 | Märchenzauber entfernt |
|
||||
| **Fixes** | 2 | Health Checks |
|
||||
|
||||
---
|
||||
|
||||
## Nächste Schritte
|
||||
|
||||
1. **Element Web** auf eigenem Server deployen
|
||||
2. **E2EE** für Matrix-Räume aktivieren
|
||||
3. **Voice Messages** in Matrix Bots
|
||||
4. **Bot-to-Bot** Kommunikation für komplexe Workflows
|
||||
|
|
@ -0,0 +1,466 @@
|
|||
---
|
||||
title: 'Matrix STT Bot, Gift Code UI & Onboarding Bot'
|
||||
description: 'Speech-to-Text Bot für Matrix, Gift Code Web-Interface, Clock Bot Timer-Progress, Onboarding Bot für Profil-Setup und umfangreiche Bot-Fixes.'
|
||||
date: 2026-02-14
|
||||
author: 'Till Schneider'
|
||||
category: 'feature'
|
||||
tags:
|
||||
[
|
||||
'matrix',
|
||||
'stt',
|
||||
'speech-to-text',
|
||||
'gift-codes',
|
||||
'onboarding',
|
||||
'clock-bot',
|
||||
'timer',
|
||||
'tts',
|
||||
'german-voice',
|
||||
'emoji-picker',
|
||||
'nutriphi',
|
||||
'stats-bot',
|
||||
]
|
||||
featured: true
|
||||
commits: 56
|
||||
readTime: 18
|
||||
stats:
|
||||
filesChanged: 182
|
||||
linesAdded: 9285
|
||||
linesRemoved: 2431
|
||||
contributors:
|
||||
- name: 'Till Schneider'
|
||||
handle: 'Till-JS'
|
||||
commits: 56
|
||||
workingHours:
|
||||
start: '2026-02-14T11:00'
|
||||
end: '2026-02-15T11:00'
|
||||
---
|
||||
|
||||
Produktiver Valentinstag mit **56 Commits** und vielen neuen Features:
|
||||
|
||||
- **Matrix STT Bot** - Speech-to-Text direkt in Matrix
|
||||
- **Gift Code UI** - Web-Interface für Geschenkcode-Verwaltung
|
||||
- **Onboarding Bot** - Matrix Bot für Profil-Setup
|
||||
- **Clock Bot Timer** - Live Progress mit Message Editing
|
||||
- **TTS German Voice** - Kerstin als neue deutsche Stimme
|
||||
- **Emoji Picker** - Recently Used + WhatsApp-Style Input
|
||||
|
||||
---
|
||||
|
||||
## Matrix STT Bot
|
||||
|
||||
Neuer Bot für Speech-to-Text-Transkription in Matrix.
|
||||
|
||||
### Features
|
||||
|
||||
| Feature | Beschreibung |
|
||||
| ------------------- | -------------------------- |
|
||||
| **Voice Messages** | Automatische Transkription |
|
||||
| **Multi-Language** | Deutsch, Englisch, weitere |
|
||||
| **Inline Response** | Transkription als Reply |
|
||||
| **High Accuracy** | Whisper Large V3 |
|
||||
|
||||
### Architektur
|
||||
|
||||
```
|
||||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||||
│ Matrix Room │────>│ STT Bot │────>│ mana-stt │
|
||||
│ (Voice Msg) │ │ (Port 3340) │ │ (Whisper) │
|
||||
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ ┌─────────────────┐ │
|
||||
│ │ Transcription │<────────────┘
|
||||
│ │ Result │
|
||||
│ └────────┬────────┘
|
||||
│ │
|
||||
▼ ▼
|
||||
┌─────────────────────────────────────────┐
|
||||
│ Matrix Room: Reply with Transcription │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Dockerfile Pattern
|
||||
|
||||
```dockerfile
|
||||
# Gleiche Struktur wie TTS Bot
|
||||
FROM node:20-alpine AS builder
|
||||
WORKDIR /app
|
||||
COPY package.json pnpm-lock.yaml ./
|
||||
RUN corepack enable && pnpm install --frozen-lockfile
|
||||
|
||||
COPY . .
|
||||
RUN pnpm build
|
||||
|
||||
FROM node:20-alpine
|
||||
WORKDIR /app
|
||||
COPY --from=builder /app/dist ./dist
|
||||
COPY --from=builder /app/node_modules ./node_modules
|
||||
CMD ["node", "dist/main.js"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Gift Code Web UI
|
||||
|
||||
Web-Interface für Geschenkcode-Einlösung und Verwaltung.
|
||||
|
||||
### Benutzer-Interface
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ 🎁 Geschenkcode einlösen │
|
||||
├─────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌──────────────────────────────────────────────┐ │
|
||||
│ │ CODE-XXXX-XXXX-XXXX │ │
|
||||
│ └──────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ [ Einlösen ] │
|
||||
│ │
|
||||
├─────────────────────────────────────────────────────┤
|
||||
│ Meine eingelösten Codes: │
|
||||
│ ✅ 500 Credits - 14.02.2026 │
|
||||
│ ✅ Pro Subscription 1 Month - 01.02.2026 │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### API Endpoints
|
||||
|
||||
| Endpoint | Method | Beschreibung |
|
||||
| ----------------------- | ------ | ----------------------- |
|
||||
| `/api/gifts/redeem` | POST | Code einlösen |
|
||||
| `/api/gifts/me` | GET | Eigene eingelöste Codes |
|
||||
| `/api/gifts/me/history` | GET | Einlöse-Historie |
|
||||
|
||||
### Gift Types
|
||||
|
||||
```typescript
|
||||
type GiftType =
|
||||
| 'credits' // Direkte Credits
|
||||
| 'subscription' // Abo-Zeit
|
||||
| 'first_come' // Begrenzte Anzahl
|
||||
| 'unlimited'; // Unbegrenzt einlösbar
|
||||
```
|
||||
|
||||
### Bugfixes
|
||||
|
||||
- `userId undefined` - Guard verwendet `userId`, Controller erwartete `sub`
|
||||
- Duplicate Claim Check für `first_come` Type
|
||||
- Nullable Fields explizit auf `null` gesetzt für Drizzle
|
||||
|
||||
---
|
||||
|
||||
## Onboarding Bot
|
||||
|
||||
Matrix Bot für geführtes Profil-Setup neuer Nutzer.
|
||||
|
||||
### Onboarding Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Onboarding Bot Flow │
|
||||
├─────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 1. 👋 Willkommen! Wie heißt du? │
|
||||
│ └─ User: "Max" │
|
||||
│ │
|
||||
│ 2. 📸 Möchtest du ein Profilbild hochladen? │
|
||||
│ └─ User: [Bild] oder "Überspringen" │
|
||||
│ │
|
||||
│ 3. 🎂 Wann hast du Geburtstag? │
|
||||
│ └─ User: "15.03.1990" │
|
||||
│ │
|
||||
│ 4. 🌍 Welche Sprache bevorzugst du? │
|
||||
│ └─ User: "Deutsch" │
|
||||
│ │
|
||||
│ 5. ✅ Profil komplett! Viel Spaß! │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### State Machine
|
||||
|
||||
```typescript
|
||||
enum OnboardingState {
|
||||
WELCOME = 'welcome',
|
||||
NAME = 'name',
|
||||
AVATAR = 'avatar',
|
||||
BIRTHDAY = 'birthday',
|
||||
LANGUAGE = 'language',
|
||||
COMPLETE = 'complete',
|
||||
}
|
||||
|
||||
// Transitions
|
||||
const transitions = {
|
||||
[OnboardingState.WELCOME]: OnboardingState.NAME,
|
||||
[OnboardingState.NAME]: OnboardingState.AVATAR,
|
||||
[OnboardingState.AVATAR]: OnboardingState.BIRTHDAY,
|
||||
[OnboardingState.BIRTHDAY]: OnboardingState.LANGUAGE,
|
||||
[OnboardingState.LANGUAGE]: OnboardingState.COMPLETE,
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Clock Bot Timer Progress
|
||||
|
||||
Live-Timer mit Message-Editing für Echtzeit-Updates.
|
||||
|
||||
### Feature
|
||||
|
||||
```
|
||||
Timer gestartet: 5 Minuten
|
||||
|
||||
┌────────────────────────────────┐
|
||||
│ ⏱️ Timer │
|
||||
│ ████████░░░░░░░░░░ 3:42 │
|
||||
│ │
|
||||
│ Verbleibend: 3 Minuten 42 Sek │
|
||||
└────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Room Topic Updates
|
||||
|
||||
Timer-Status wird auch im Room Topic angezeigt:
|
||||
|
||||
```typescript
|
||||
// Phase 3: Room Topic Integration
|
||||
async function updateRoomTopic(roomId: string, timerStatus: string) {
|
||||
await client.sendStateEvent(roomId, 'm.room.topic', '', {
|
||||
topic: `⏱️ ${timerStatus}`,
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### Widget Styling
|
||||
|
||||
Optimiert für Element Info Panel:
|
||||
|
||||
```css
|
||||
/* Kompaktes Layout für Widget */
|
||||
.timer-widget {
|
||||
padding: 8px;
|
||||
font-size: 14px;
|
||||
background: var(--element-bg);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## TTS German Voice
|
||||
|
||||
Neue deutsche Stimme "Kerstin" für natürlichere Sprachausgabe.
|
||||
|
||||
### Verfügbare Stimmen
|
||||
|
||||
| Voice | Language | Gender | Engine |
|
||||
| ------------- | -------- | ------ | ------ |
|
||||
| `de_kerstin` | Deutsch | Female | Piper |
|
||||
| `de_thorsten` | Deutsch | Male | Piper |
|
||||
| `en_amy` | English | Female | Piper |
|
||||
|
||||
### Auto-Endpoint
|
||||
|
||||
```typescript
|
||||
// /synthesize/auto wählt automatisch passende Stimme
|
||||
POST /synthesize/auto
|
||||
{
|
||||
"text": "Hallo, wie geht es dir?",
|
||||
// Automatisch: de_kerstin (erkannt: Deutsch)
|
||||
}
|
||||
```
|
||||
|
||||
### WAV Format
|
||||
|
||||
Für bessere Matrix-Kompatibilität auf WAV gewechselt:
|
||||
|
||||
```typescript
|
||||
// Vorher: MP3 (Probleme mit Element)
|
||||
// Nachher: WAV (native Unterstützung)
|
||||
const format = 'wav';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Emoji Picker Improvements
|
||||
|
||||
WhatsApp-Style Input und Recently Used Emojis.
|
||||
|
||||
### Recently Used
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Kürzlich verwendet: │
|
||||
│ 😀 😂 ❤️ 👍 🎉 🔥 💯 ✨ │
|
||||
├─────────────────────────────────────────────────────┤
|
||||
│ Smileys & Menschen: │
|
||||
│ 😀 😃 😄 😁 😆 😅 🤣 😂 ... │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Cross-App Sync
|
||||
|
||||
Recently Used Emojis werden über mana-core-auth synchronisiert:
|
||||
|
||||
```typescript
|
||||
// API Endpoint
|
||||
GET / api / users / me / preferences / emojis;
|
||||
POST / api / users / me / preferences / emojis;
|
||||
```
|
||||
|
||||
### WhatsApp-Style Input
|
||||
|
||||
```svelte
|
||||
<div class="chat-input">
|
||||
<button class="emoji-trigger" on:click={togglePicker}> 😀 </button>
|
||||
<textarea bind:value={message} />
|
||||
<button class="send" on:click={send}> ➤ </button>
|
||||
</div>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## NutriPhi Bot Improvements
|
||||
|
||||
### Auto-Analyze Text
|
||||
|
||||
Mahlzeiten können jetzt auch als Text beschrieben werden:
|
||||
|
||||
```
|
||||
User: Ich hatte heute Morgen 2 Scheiben Toast mit Butter und Marmelade
|
||||
|
||||
Bot: 🍽️ Mahlzeit erkannt:
|
||||
- 2x Toast: 140 kcal
|
||||
- Butter (20g): 144 kcal
|
||||
- Marmelade (30g): 78 kcal
|
||||
─────────────────
|
||||
Gesamt: 362 kcal
|
||||
```
|
||||
|
||||
### Fixes
|
||||
|
||||
- Gemini Model Update: `gemini-2.0-flash-exp` → `gemini-2.5-flash`
|
||||
- Korrektes API-Feldname für Bildanalyse
|
||||
- Dockerfile: Shared Packages hinzugefügt
|
||||
|
||||
---
|
||||
|
||||
## Stats Bot Infrastructure Monitoring
|
||||
|
||||
Neue Commands für Server-Überwachung.
|
||||
|
||||
### Commands
|
||||
|
||||
```
|
||||
!infra status - Service-Status aller Container
|
||||
!infra memory - Memory-Verbrauch
|
||||
!infra cpu - CPU-Auslastung
|
||||
!infra disk - Festplatten-Status
|
||||
!infra network - Netzwerk-Traffic
|
||||
```
|
||||
|
||||
### Prometheus Integration
|
||||
|
||||
```typescript
|
||||
// Metriken direkt aus Prometheus abrufen
|
||||
const metrics = await prometheus.query('up{job=~".*backend.*"}');
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Bot-to-Bot Loop Prevention
|
||||
|
||||
Fix für endlose Bot-Antwort-Schleifen.
|
||||
|
||||
### Problem
|
||||
|
||||
```
|
||||
User → Bot A → Bot B → Bot A → Bot B → ...
|
||||
```
|
||||
|
||||
### Lösung
|
||||
|
||||
```typescript
|
||||
// Ignoriere Messages von anderen Bots
|
||||
if (isBot(event.sender)) {
|
||||
return; // Keine Antwort
|
||||
}
|
||||
|
||||
// Ignoriere Edit-Events
|
||||
if (event.content['m.relates_to']?.rel_type === 'm.replace') {
|
||||
return;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Session Auto-Refresh
|
||||
|
||||
Automatische JWT-Token-Erneuerung bei Ablauf.
|
||||
|
||||
```typescript
|
||||
// Interceptor für automatisches Refresh
|
||||
async function fetchWithRefresh(url: string, options: RequestInit) {
|
||||
const response = await fetch(url, options);
|
||||
|
||||
if (response.status === 401) {
|
||||
await refreshToken();
|
||||
return fetch(url, {
|
||||
...options,
|
||||
headers: {
|
||||
...options.headers,
|
||||
Authorization: `Bearer ${getNewToken()}`,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
return response;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Umami Analytics Update
|
||||
|
||||
Tracking IDs für alle Web-Apps aktualisiert.
|
||||
|
||||
### Betroffene Apps
|
||||
|
||||
| App | Neue Tracking ID |
|
||||
| ------------ | ---------------- |
|
||||
| manacore-web | `manacore-prod` |
|
||||
| chat-web | `chat-prod` |
|
||||
| calendar-web | `calendar-prod` |
|
||||
| clock-web | `clock-prod` |
|
||||
| contacts-web | `contacts-prod` |
|
||||
| todo-web | `todo-prod` |
|
||||
| picture-web | `picture-prod` |
|
||||
| zitare-web | `zitare-prod` |
|
||||
|
||||
---
|
||||
|
||||
## Zusammenfassung
|
||||
|
||||
| Bereich | Commits | Highlights |
|
||||
| ---------------- | ------- | ---------------------- |
|
||||
| **Matrix STT** | 3 | Speech-to-Text Bot |
|
||||
| **Gift Codes** | 6 | Web UI + Fixes |
|
||||
| **Onboarding** | 2 | Profile Setup Bot |
|
||||
| **Clock Bot** | 4 | Timer Progress + Topic |
|
||||
| **TTS** | 4 | German Voice + WAV |
|
||||
| **Emoji Picker** | 3 | Recently Used + Sync |
|
||||
| **NutriPhi** | 5 | Text-Analyse + Fixes |
|
||||
| **Stats Bot** | 3 | Infra Monitoring |
|
||||
| **Bot Fixes** | 8 | Loop Prevention + Auth |
|
||||
| **Session** | 2 | Auto-Refresh |
|
||||
| **Analytics** | 2 | Umami Update |
|
||||
| **Sonstige** | 14 | Diverse Fixes |
|
||||
|
||||
---
|
||||
|
||||
## Nächste Schritte
|
||||
|
||||
1. **Onboarding UI** in Web-Apps integrieren
|
||||
2. **Gift Code Admin** Dashboard
|
||||
3. **Voice-to-Voice** Matrix Bots
|
||||
4. **Multi-Room** Timer Sync
|
||||
|
|
@ -0,0 +1,238 @@
|
|||
---
|
||||
title: 'Onboarding Modal Polish & Calendar ViewsBar'
|
||||
description: 'Onboarding Modal als kompaktes Design mit korrekten Layer-Farben, STT API Key Support und neue Calendar ViewsBar Komponente.'
|
||||
date: 2026-02-15
|
||||
author: 'Till Schneider'
|
||||
category: 'update'
|
||||
tags: ['onboarding', 'ui-polish', 'calendar', 'views-bar', 'stt', 'api-key', 'gift-codes']
|
||||
featured: false
|
||||
commits: 7
|
||||
readTime: 5
|
||||
stats:
|
||||
filesChanged: 14
|
||||
linesAdded: 382
|
||||
linesRemoved: 314
|
||||
contributors:
|
||||
- name: 'Till Schneider'
|
||||
handle: 'Till-JS'
|
||||
commits: 7
|
||||
workingHours:
|
||||
start: '2026-02-15T11:00'
|
||||
end: '2026-02-16T11:00'
|
||||
---
|
||||
|
||||
Fokussierter Tag mit **7 Commits** für UI-Polish und kleinere Features:
|
||||
|
||||
- **Onboarding Modal** - Kompaktes Design statt Fullscreen
|
||||
- **Calendar ViewsBar** - Unified View Switcher Komponente
|
||||
- **STT API Key** - Support für alle Matrix Bots
|
||||
- **Gift Code Fixes** - Debug-Logging entfernt
|
||||
|
||||
---
|
||||
|
||||
## Onboarding Modal Polish
|
||||
|
||||
Das Onboarding-Modal wurde von Fullscreen auf kompaktes Modal umgestellt.
|
||||
|
||||
### Vorher vs. Nachher
|
||||
|
||||
| Aspekt | Fullscreen | Kompakt |
|
||||
| -------------------- | ---------- | --------- |
|
||||
| Bildschirmabdeckung | 100% | ~60% |
|
||||
| Hintergrund sichtbar | ❌ | ✅ |
|
||||
| Mobile UX | Okay | Besser |
|
||||
| Escape-Gefühl | Bedrängend | Einladend |
|
||||
|
||||
### Elevation Layer Colors
|
||||
|
||||
Korrektur der Layer-Farben für das Design-System:
|
||||
|
||||
```css
|
||||
/* Vorher: Falsche Elevation */
|
||||
.modal-content {
|
||||
background: var(--surface-0);
|
||||
}
|
||||
|
||||
/* Nachher: Korrekte Elevation */
|
||||
.modal-content {
|
||||
background: var(--surface-1); /* Erhöht */
|
||||
}
|
||||
|
||||
.modal-overlay {
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
```
|
||||
|
||||
### Design-System Referenz
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Elevation Layers │
|
||||
├─────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ surface-0 ████████ Base (Page Background) │
|
||||
│ surface-1 ████████ Raised (Cards, Modals) │
|
||||
│ surface-2 ████████ Higher (Dropdowns, Tooltips) │
|
||||
│ surface-3 ████████ Highest (Floating Elements) │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Calendar ViewsBar
|
||||
|
||||
Neue unified Komponente für den View-Wechsel im Calendar.
|
||||
|
||||
### Features
|
||||
|
||||
| Feature | Beschreibung |
|
||||
| ---------------------- | ------------------ |
|
||||
| **Day/Week/Month** | Standard-Ansichten |
|
||||
| **Year Overview** | Jahresübersicht |
|
||||
| **Agenda** | Listen-Ansicht |
|
||||
| **Keyboard Shortcuts** | D, W, M, Y, A |
|
||||
|
||||
### Component API
|
||||
|
||||
```svelte
|
||||
<script lang="ts">
|
||||
import { ViewsBar } from '$lib/components/ViewsBar.svelte';
|
||||
|
||||
let currentView = $state<'day' | 'week' | 'month' | 'year' | 'agenda'>('week');
|
||||
</script>
|
||||
|
||||
<ViewsBar bind:view={currentView} />
|
||||
```
|
||||
|
||||
### Implementation
|
||||
|
||||
```svelte
|
||||
<!-- apps/calendar/apps/web/src/lib/components/ViewsBar.svelte -->
|
||||
<div class="views-bar">
|
||||
{#each views as view}
|
||||
<button
|
||||
class:active={currentView === view.id}
|
||||
on:click={() => (currentView = view.id)}
|
||||
title="{view.label} ({view.shortcut})"
|
||||
>
|
||||
<Icon name={view.icon} />
|
||||
<span class="label">{view.label}</span>
|
||||
</button>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.views-bar {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
padding: 4px;
|
||||
background: var(--surface-1);
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
button.active {
|
||||
background: var(--primary);
|
||||
color: var(--on-primary);
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## STT API Key Support
|
||||
|
||||
API Key Authentication für den Transcription Service.
|
||||
|
||||
### Motivation
|
||||
|
||||
- Externer Zugriff auf mana-stt
|
||||
- Rate Limiting pro API Key
|
||||
- Usage Tracking
|
||||
|
||||
### Implementation
|
||||
|
||||
```typescript
|
||||
// packages/bot-services/src/transcription.service.ts
|
||||
export class TranscriptionService {
|
||||
private apiKey?: string;
|
||||
|
||||
constructor(config: { apiKey?: string }) {
|
||||
this.apiKey = config.apiKey;
|
||||
}
|
||||
|
||||
async transcribe(audioBuffer: Buffer): Promise<string> {
|
||||
const headers: Record<string, string> = {
|
||||
'Content-Type': 'audio/wav',
|
||||
};
|
||||
|
||||
if (this.apiKey) {
|
||||
headers['X-API-Key'] = this.apiKey;
|
||||
}
|
||||
|
||||
const response = await fetch(`${this.baseUrl}/transcribe`, {
|
||||
method: 'POST',
|
||||
headers,
|
||||
body: audioBuffer,
|
||||
});
|
||||
|
||||
return response.json();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Betroffene Bots
|
||||
|
||||
Alle Matrix Bots mit STT-Funktionalität:
|
||||
|
||||
- matrix-stt-bot
|
||||
- matrix-nutriphi-bot
|
||||
- matrix-chat-bot (Voice Messages)
|
||||
|
||||
### Environment Variable
|
||||
|
||||
```env
|
||||
STT_API_KEY=your-api-key-here
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Gift Code Fixes
|
||||
|
||||
### Debug Logging entfernt
|
||||
|
||||
Nach erfolgreichem Fix des `userId undefined` Problems wurde das Debug-Logging entfernt:
|
||||
|
||||
```diff
|
||||
- console.log('Gift redemption debug:', {
|
||||
- userId,
|
||||
- giftCode,
|
||||
- giftType,
|
||||
- });
|
||||
```
|
||||
|
||||
### Cleanup
|
||||
|
||||
- Produktions-ready ohne Debug-Output
|
||||
- Cleaner Logs für Monitoring
|
||||
|
||||
---
|
||||
|
||||
## Zusammenfassung
|
||||
|
||||
| Bereich | Commits | Highlights |
|
||||
| -------------- | ------- | ----------------------------- |
|
||||
| **Onboarding** | 2 | Modal → Kompakt, Layer Colors |
|
||||
| **Calendar** | 1 | ViewsBar Komponente |
|
||||
| **STT** | 2 | API Key für Bots |
|
||||
| **Gift Codes** | 1 | Debug Cleanup |
|
||||
| **Fixes** | 1 | userId Guard |
|
||||
|
||||
---
|
||||
|
||||
## Nächste Schritte
|
||||
|
||||
1. **Onboarding Steps** - Weitere Steps implementieren
|
||||
2. **Calendar Sync** - CalDAV Integration
|
||||
3. **STT Streaming** - Real-time Transkription
|
||||
4. **Gift Admin Panel** - Code-Erstellung im UI
|
||||
Loading…
Add table
Add a link
Reference in a new issue