Zum Hauptinhalt springen

Zurรผck zum Devlog

Donnerstag, 29. Januar 2026

Feature

55 Commits

25 min Lesezeit

Microservices, Matrix Phase 3 & Massive Konsolidierung

3 neue Microservices (mana-llm, mana-crawler, mana-notify), Matrix Web Client Phase 3 mit VoIP/Video, Screen Sharing, @Mentions und Emoji Reactions, plus umfassende Codebase-Konsolidierung mit 8 neuen Shared Packages

T

Till Schneider

Autor

AuรŸergewรถhnlich produktiver Tag mit 55 Commits - aufgeteilt in drei groรŸe Bereiche:

  • 3 neue Microservices - mana-llm (LLM Abstraction), mana-crawler (Web Crawler), mana-notify (Notifications)
  • Matrix Web Client Phase 3 - VoIP/Video Calls, Screen Sharing, @Mentions, Emoji Reactions, Search
  • Massive Konsolidierung - 8 neue Shared Packages, ~2.500 LOC Code-Deduplizierung

Neue Microservices

mana-llm: Central LLM Abstraction Service

Neuer Python/FastAPI Service als zentraler Gateway fรผr alle LLM-Anfragen im Monorepo.

Architektur

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                        Consumer Apps                                 โ”‚
โ”‚  matrix-ollama-bot โ”‚ telegram-ollama-bot โ”‚ chat-backend โ”‚ etc.     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                 โ”‚ HTTP/SSE
                                 โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     mana-llm (Port 3025)                            โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                 โ”‚
โ”‚  โ”‚   Router    โ”‚  โ”‚   Cache     โ”‚  โ”‚   Metrics   โ”‚                 โ”‚
โ”‚  โ”‚ (Provider)  โ”‚  โ”‚  (Redis)    โ”‚  โ”‚ (Prometheus)โ”‚                 โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                 โ”‚
โ”‚         โ”‚                                                           โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”‚
โ”‚  โ”‚              Provider Adapters                   โ”‚               โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚               โ”‚
โ”‚  โ”‚  โ”‚  Ollama  โ”‚  โ”‚ OpenAI   โ”‚  โ”‚  OpenRouter  โ”‚  โ”‚               โ”‚
โ”‚  โ”‚  โ”‚  Adapter โ”‚  โ”‚ Adapter  โ”‚  โ”‚   Adapter    โ”‚  โ”‚               โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚               โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Features

FeatureBeschreibung
OpenAI-compatible API/v1/chat/completions, /v1/embeddings, /v1/models
Provider Routingollama/gemma3:4b, openrouter/llama-3.1-8b, groq/...
Streaming (SSE)Server-Sent Events fรผr Token-Streaming
Vision SupportMultimodal mit Base64-Bildern
Redis CacheOptional fรผr hรคufige Anfragen
Prometheus Metrics/metrics Endpoint

Provider Routing

# Ollama (Standard wenn kein Prefix)
curl -X POST http://localhost:3025/v1/chat/completions \
  -d '{"model": "ollama/gemma3:4b", "messages": [...]}'

# OpenRouter
curl -X POST http://localhost:3025/v1/chat/completions \
  -d '{"model": "openrouter/meta-llama/llama-3.1-8b-instruct", ...}'

# Groq
curl -X POST http://localhost:3025/v1/chat/completions \
  -d '{"model": "groq/llama-3.1-8b-instant", ...}'

Projekt-Struktur

services/mana-llm/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ main.py                 # FastAPI Entry Point
โ”‚   โ”œโ”€โ”€ config.py               # Pydantic Settings
โ”‚   โ”œโ”€โ”€ providers/
โ”‚   โ”‚   โ”œโ”€โ”€ base.py             # Abstract Provider
โ”‚   โ”‚   โ”œโ”€โ”€ ollama.py           # Ollama Provider
โ”‚   โ”‚   โ”œโ”€โ”€ openai_compat.py    # OpenAI-compatible Provider
โ”‚   โ”‚   โ””โ”€โ”€ router.py           # Provider Routing
โ”‚   โ”œโ”€โ”€ models/
โ”‚   โ”‚   โ”œโ”€โ”€ requests.py         # Request Models
โ”‚   โ”‚   โ””โ”€โ”€ responses.py        # Response Models
โ”‚   โ”œโ”€โ”€ streaming/
โ”‚   โ”‚   โ””โ”€โ”€ sse.py              # SSE Response Handler
โ”‚   โ””โ”€โ”€ utils/
โ”‚       โ”œโ”€โ”€ cache.py            # Redis Caching
โ”‚       โ””โ”€โ”€ metrics.py          # Prometheus Metrics
โ”œโ”€โ”€ tests/
โ”‚   โ”œโ”€โ”€ test_api.py
โ”‚   โ”œโ”€โ”€ test_providers.py
โ”‚   โ””โ”€โ”€ test_streaming.py
โ”œโ”€โ”€ Dockerfile
โ”œโ”€โ”€ docker-compose.yml
โ”œโ”€โ”€ requirements.txt
โ””โ”€โ”€ pyproject.toml

mana-crawler: Web Crawler Service

NestJS-basierter Web Crawler fรผr systematisches Crawling und Content-Extraktion.

Architektur

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚              mana-crawler (Port 3023)                                โ”‚
โ”‚                                                                      โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                  โ”‚
โ”‚  โ”‚ Crawl API   โ”‚  โ”‚ Queue       โ”‚  โ”‚ Parser      โ”‚                  โ”‚
โ”‚  โ”‚ Controller  โ”‚โ”€โ”€โ”‚ Service     โ”‚โ”€โ”€โ”‚ Service     โ”‚                  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚ (BullMQ)    โ”‚  โ”‚ (Cheerio)   โ”‚                  โ”‚
โ”‚                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                  โ”‚
โ”‚                         โ”‚                โ”‚                          โ”‚
โ”‚                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”                    โ”‚
โ”‚                   โ”‚     Storage Service         โ”‚                    โ”‚
โ”‚                   โ”‚  (PostgreSQL + Redis)       โ”‚                    โ”‚
โ”‚                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

API Endpoints

EndpointBeschreibung
POST /api/v1/crawlNeuen Crawl-Job starten
GET /api/v1/crawl/:jobIdJob-Status abrufen
GET /api/v1/crawl/:jobId/resultsErgebnisse (paginiert)
DELETE /api/v1/crawl/:jobIdJob abbrechen
POST /api/v1/crawl/:jobId/pauseJob pausieren
POST /api/v1/crawl/:jobId/resumeJob fortsetzen

Features

FeatureBeschreibung
Queue-basiertBullMQ mit Redis fรผr Job-Processing
Robots.txtAutomatische Compliance (konfigurierbar)
Rate LimitingPer-Domain Rate Limiting (default: 2 req/s)
Custom SelectorsCSS-Selektoren fรผr Content-Extraktion
Markdown OutputAutomatische HTMLโ†’Markdown Konvertierung
Bull BoardDashboard unter /queue/dashboard

Beispiel-Request

curl -X POST http://localhost:3023/api/v1/crawl \
  -H "Content-Type: application/json" \
  -d '{
    "startUrl": "https://docs.example.com",
    "config": {
      "maxDepth": 3,
      "maxPages": 500,
      "respectRobots": true,
      "rateLimit": 2,
      "includePatterns": ["/docs/*"],
      "excludePatterns": ["/api/*", "*.pdf"],
      "selectors": {
        "content": "article.main-content",
        "title": "h1.page-title"
      },
      "output": {
        "format": "markdown"
      }
    }
  }'

mana-notify: Central Notification Service

Zentraler Notification-Service fรผr Email, Push, Matrix und Webhooks.

Architektur

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                 Consumer Apps                                        โ”‚
โ”‚   Auth โ”‚ Calendar โ”‚ Chat โ”‚ Picture โ”‚ Zitare โ”‚ ...                   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚              mana-notify (Port 3040)                                 โ”‚
โ”‚                                                                      โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                  โ”‚
โ”‚  โ”‚ Notificationโ”‚  โ”‚ Template    โ”‚  โ”‚ Preferences โ”‚                  โ”‚
โ”‚  โ”‚ API         โ”‚  โ”‚ Engine      โ”‚  โ”‚ Manager     โ”‚                  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                  โ”‚
โ”‚         โ”‚                โ”‚                                           โ”‚
โ”‚         โ–ผ                โ–ผ                                           โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                   โ”‚
โ”‚  โ”‚           BullMQ Job Queues                   โ”‚                   โ”‚
โ”‚  โ”‚  Email โ”‚ Push โ”‚ Matrix โ”‚ Webhook              โ”‚                   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                   โ”‚
โ”‚         โ”‚         โ”‚         โ”‚         โ”‚                             โ”‚
โ”‚         โ–ผ         โ–ผ         โ–ผ         โ–ผ                             โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                   โ”‚
โ”‚  โ”‚ Brevo   โ”‚ โ”‚ Expo    โ”‚ โ”‚ Matrix  โ”‚ โ”‚ HTTP    โ”‚                   โ”‚
โ”‚  โ”‚ SMTP    โ”‚ โ”‚ Push    โ”‚ โ”‚ API     โ”‚ โ”‚ Client  โ”‚                   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Notification Channels

ChannelProviderFeatures
EmailBrevo SMTPTemplates, HTML/Plain Text
PushExpoiOS, Android, Web
MatrixMatrix APIFormatted Messages
WebhookHTTPPOST/PUT, Retry

API Endpoints

EndpointAuthBeschreibung
POST /api/v1/notifications/sendService-KeySofort senden
POST /api/v1/notifications/scheduleService-KeyZeitgesteuert
POST /api/v1/notifications/batchService-KeyMehrere senden
POST /api/v1/devices/registerJWTPush-Device registrieren
GET /api/v1/preferencesJWTUser-Prรคferenzen
GET /api/v1/templatesService-KeyTemplates verwalten

Client SDK

import { NotifyClient } from '@manacore/notify-client';

const notify = new NotifyClient({
	serviceUrl: 'http://localhost:3040',
	serviceKey: process.env.MANA_NOTIFY_SERVICE_KEY,
	appId: 'calendar',
});

// Email senden
await notify.sendEmail({
	to: '[email protected]',
	template: 'calendar-reminder',
	data: { eventTitle: 'Meeting', eventTime: '14:00' },
});

// Push an User
await notify.sendPush({
	userId: 'user-uuid',
	title: 'Erinnerung',
	body: 'Meeting in 15 Minuten',
	data: { eventId: 'xxx' },
});

Default Templates

TemplateChannelVerwendung
auth-password-resetEmailPassword Reset
auth-verificationEmailEmail Verification
auth-welcomeEmailWillkommens-Email
calendar-reminderEmailEvent-Erinnerung

Matrix Web Client Phase 3

Massive Feature-Erweiterung des SvelteKit Matrix Clients mit 25 Commits.

VoIP & Video Calls

Vollstรคndige WebRTC-Integration fรผr Audio/Video-Anrufe.

apps/matrix/apps/web/src/lib/components/call/
โ”œโ”€โ”€ CallView.svelte           # 224 LOC - Anruf-UI mit Steuerung
โ”œโ”€โ”€ IncomingCallDialog.svelte # 123 LOC - Eingehender Anruf Dialog
โ””โ”€โ”€ index.ts

Features:

FeatureBeschreibung
Audio/Video Calls1:1 WebRTC Anrufe
Screen SharingBildschirm teilen
Mute/UnmuteAudio/Video Steuerung
Call Accept/DeclineIncoming Call Dialog
Camera SwitchKamera wechseln

@Mention Autocomplete

Intelligente User-Erwรคhnung mit Autocomplete:

<!-- MessageInput.svelte -->
<script lang="ts">
	let showMentionPopup = $state(false);
	let mentionSearch = $state('');
	let mentionCandidates = $state<MatrixUser[]>([]);

	function handleInput() {
		const text = inputElement?.textContent || '';
		const mentionMatch = text.match(/@(\w*)$/);
		if (mentionMatch) {
			showMentionPopup = true;
			mentionSearch = mentionMatch[1];
			mentionCandidates = filterMembers(mentionSearch);
		}
	}
</script>

{#if showMentionPopup}
	<div class="mention-popup">
		{#each mentionCandidates as user}
			<button onclick={() => insertMention(user)}>
				<Avatar src={user.avatarUrl} />
				<span>{user.displayName}</span>
			</button>
		{/each}
	</div>
{/if}

Message Forwarding

Nachrichten an andere Rรคume weiterleiten:

apps/matrix/apps/web/src/lib/components/chat/
โ”œโ”€โ”€ ForwardMessageDialog.svelte  # 173 LOC - Room-Auswahl Dialog
โ””โ”€โ”€ Message.svelte               # Forward-Button hinzugefรผgt

Emoji Reactions

Reaktionen auf Nachrichten:

FeatureBeschreibung
Quick ReactionsSchnellauswahl (Thumbs-up etc.)
Emoji PickerErweiterter Picker mit Kategorien
Reaction CountAggregierte Reaktionen anzeigen
Own ReactionEigene Reaktion highlighten

Extended Emoji Picker

Vollstรคndiger Emoji-Picker mit Kategorien und Skin-Tone Support.

Nachrichten im aktuellen Raum durchsuchen:

apps/matrix/apps/web/src/lib/components/chat/
โ””โ”€โ”€ SearchDialog.svelte  # 185 LOC

Features:

  • Volltextsuche in Nachrichten
  • Ergebnisse mit Kontext
  • Keyboard Shortcut: Cmd+F / Ctrl+F
  • Jump to Message

Browser Notifications

// apps/matrix/apps/web/src/lib/notifications/index.ts (171 LOC)

export class NotificationService {
	async requestPermission(): Promise<boolean>;
	async showNotification(room: Room, event: MatrixEvent): Promise<void>;
	private shouldShowNotification(event: MatrixEvent): boolean;
}

Features:

  • Permission Request bei erstem Nachrichtenempfang
  • Click-to-Focus auf Nachricht
  • Unread Badge Update
  • Tab-Focus Detection (keine Notifikation wenn aktiv)

Keyboard Shortcuts

ShortcutAktion
Cmd+F / Ctrl+FSuche รถffnen
Cmd+K / Ctrl+KQuick Room Switch
Cmd+N / Ctrl+NNeuer Raum
EscDialog schlieรŸen
EnterNachricht senden
Shift+EnterNeue Zeile

Online Status & Presence

  • Online/Offline/Busy Indikatoren
  • Letzte Aktivitรคt
  • Typing Indicator (verbessert)

Read Receipts

  • Gelesen-Markierung pro Nachricht
  • Aggregierte Receipts (Avatar-Stack)
  • Eigene Nachricht: โ€œGelesen von Xโ€

UI/UX Verbesserungen

VerbesserungBeschreibung
Mobile ResponsiveBesseres Layout auf kleinen Screens
Login RedesignAngepasst an Central Auth UI
Settings AccessDirekter Zugang aus Sidebar
Theme SelectorLight/Dark/System in Settings
Markdown Support**bold**, *italic*, Code Blocks
Link PreviewsAutomatische Link-Erkennung

Massive Konsolidierung

Der wichtigste Teil des Tages: ~2.500 LOC Code-Deduplizierung durch 8 neue Shared Packages.

Neue Shared Packages

PackageMigrierte Apps/ServicesLOC gespart
@manacore/shared-nestjs-health12 Backends~312 LOC
@manacore/shared-nestjs-setup8 Backends~280 LOC
@manacore/shared-tsconfig13 Backends~280 LOC
@manacore/shared-vite-config15 Web Apps~350 LOC
@manacore/shared-drizzle-config16 Configs~160 LOC
@manacore/shared-logger2 Mobile Apps~120 LOC
shared-nestjs-metrics6 Backends~709 LOC
Navigation Store Factory10 Apps~50 LOC
App Settings Store Factory3 Apps~323 LOC
Gesamt~2.584 LOC

@manacore/shared-nestjs-health

// Vorher (26 LOC pro Backend)
@Controller('health')
export class HealthController {
  @Get()
  check() {
    return { status: 'ok', timestamp: new Date().toISOString(), service: 'chat' };
  }
}

// Nachher (1 Import)
import { HealthModule } from '@manacore/shared-nestjs-health';
@Module({ imports: [HealthModule.forRoot({ serviceName: 'chat-backend' })] })

Migrierte Backends (12): calendar, chat, clock, contacts, nutriphi, picture, planta, presi, skilltree, storage, todo, zitare

@manacore/shared-nestjs-setup

// Vorher (85 LOC pro Backend)
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const corsOrigins = process.env.CORS_ORIGINS?.split(',') || [...];
  app.enableCors({ origin: corsOrigins, ... });
  app.useGlobalPipes(new ValidationPipe({ ... }));
  app.setGlobalPrefix('api/v1', { exclude: ['health'] });
  // ...
}

// Nachher (15 LOC)
import { bootstrapApp } from '@manacore/shared-nestjs-setup';
const app = await bootstrapApp(AppModule, { defaultPort: 3002 });
await app.listen(process.env.PORT || 3002);

Migrierte Backends (8): chat, calendar, contacts, zitare, clock, planta, presi, nutriphi

@manacore/shared-tsconfig

// Vorher (25 LOC pro Backend)
{
  "compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
    // ... 20+ weitere Zeilen
  }
}

// Nachher (3 LOC)
{
  "extends": "@manacore/shared-tsconfig/nestjs"
}

Verfรผgbare Configs:

  • nestjs.json - NestJS Backend
  • sveltekit.json - SvelteKit Web
  • expo.json - Expo Mobile
  • astro.json - Astro Landing

@manacore/shared-vite-config

// Vorher (30-60 LOC pro App)
export default defineConfig({
  plugins: [tailwindcss(), sveltekit()],
  server: { port: 5174, strictPort: true },
  ssr: { noExternal: ['@manacore/shared-icons', ...] },
  optimizeDeps: { exclude: ['@manacore/shared-icons', ...] },
});

// Nachher (12 LOC)
import { createViteConfig, mergeViteConfig } from '@manacore/shared-vite-config';

const baseConfig = createViteConfig({ port: 5174 });
export default defineConfig(mergeViteConfig(baseConfig, {
  plugins: [tailwindcss(), sveltekit()],
}));

Migrierte Apps (15): Alle SvelteKit Web Apps

@manacore/shared-drizzle-config

// Vorher (10-15 LOC)
export default defineConfig({
	schema: './src/db/schema/index.ts',
	out: './src/db/migrations',
	dialect: 'postgresql',
	dbCredentials: { url: process.env.DATABASE_URL || '...' },
	verbose: true,
	strict: true,
});

// Nachher (1 Zeile)
import { createDrizzleConfig } from '@manacore/shared-drizzle-config';
export default createDrizzleConfig({ dbName: 'chat' });

Bot Migration zu mana-llm

Alle LLM-nutzenden Bots und Services wurden auf mana-llm migriert:

ServiceVorherNachher
matrix-ollama-botDirekt zu OllamaVia mana-llm
telegram-ollama-botDirekt zu OllamaVia mana-llm
telegram-project-doc-botDirekt zu OllamaVia mana-llm
chat-backendDirekt zu OllamaVia mana-llm

Vorteile:

  • Zentrale Provider-Konfiguration
  • Einheitliches Logging/Metrics
  • Einfacher Cloud-Provider-Wechsel
  • Caching รผber Services hinweg
// Vorher (in jedem Bot)
const response = await fetch(`${OLLAMA_URL}/api/chat`, {
	method: 'POST',
	body: JSON.stringify({ model, messages, stream: true }),
});

// Nachher (via mana-llm)
const response = await fetch(`${MANA_LLM_URL}/v1/chat/completions`, {
	method: 'POST',
	body: JSON.stringify({ model: 'ollama/gemma3:4b', messages, stream: true }),
});

Dokumentation

CONSOLIDATION_OPPORTUNITIES.md

Vollstรคndige Analyse der Konsolidierungsmรถglichkeiten mit:

  • Detaillierte Code-Analyse
  • LOC-Einsparungen pro MaรŸnahme
  • Status-Tracking (erledigt/offen)
  • Code-Beispiele vorher/nachher

MICROSERVICES_API_OVERVIEW.md

Neues Dokument mit API-รœbersicht aller Microservices:

  • Ports und Endpoints
  • Authentication-Methoden
  • Request/Response Beispiele

Bugfixes

FixBeschreibung
Docker HealthchecksNode-basierte Healthchecks fรผr mana-core-auth, nutriphi-web
Matrix SidebarGap und Scrolling-Layout gefixt
Matrix Message InputLayout-Verbesserungen
Matrix Shared PackagesFehlende Dependencies im Dockerfile
Matrix Vite ConfigInline Config fรผr Docker-Kompatibilitรคt
TTS BotMP3 Format, keine doppelten Nachrichten
Matrix RoomItemlastMessageTime Validierung

Neue Services/Ports

ServicePortTypBeschreibung
mana-llm3025Python/FastAPILLM Gateway
mana-crawler3023NestJSWeb Crawler
mana-notify3040NestJSNotifications

Zusammenfassung

BereichCommitsHighlights
mana-llm2Python Service, Provider Routing, SSE Streaming
mana-crawler1BullMQ, Cheerio, Robots.txt Compliance
mana-notify24 Channels, Templates, Device Registration
Matrix Phase 325VoIP, Screen Share, @Mentions, Reactions, Search
Konsolidierung188 neue Shared Packages, ~2.500 LOC gespart
Bot Migration14 Services auf mana-llm migriert
Bugfixes6Docker, Matrix UI, TTS Bot

Gesamteinsparung: ~2.584 LOC durch Konsolidierung + bessere Wartbarkeit


Nรคchste Schritte

  1. mana-llm auf Mac Mini deployen
  2. mana-notify mit Auth-Service integrieren
  3. mana-crawler fรผr Questions App nutzen
  4. Matrix E2EE aktivieren
  5. Restliche Backends zu shared-nestjs-setup migrieren
  6. Mobile Apps mit mana-notify fรผr Push integrieren

Tags

#mana-llm #mana-crawler #mana-notify #matrix #voip #video-calls #screen-sharing #consolidation #shared-packages #refactoring #nestjs #sveltekit #python #fastapi