No description
  • JavaScript 41.5%
  • Python 40%
  • CSS 13.7%
  • HTML 2.7%
  • Dockerfile 2.1%
Find a file
2026-05-30 18:30:14 +00:00
backend Docker-turnkey: PWA-Icons, .dockerignore; CLAUDE.md; Wiki-Seiten 2026-05-30 18:19:22 +00:00
frontend Docker turnkey: Backend-Healthcheck + service_healthy-Gate, reproduzierbarer Frontend-Build (npm ci + package-lock), benanntes Netzwerk/Container 2026-05-30 18:30:14 +00:00
wiki Docker-turnkey: PWA-Icons, .dockerignore; CLAUDE.md; Wiki-Seiten 2026-05-30 18:19:22 +00:00
.env.example Voice Cal: Erfassungs-Tool (Sprache/Text -> CalDAV), OIDC, konfigurierbares LLM, Dark 2026-05-30 18:12:49 +00:00
.gitignore Voice Cal: Erfassungs-Tool (Sprache/Text -> CalDAV), OIDC, konfigurierbares LLM, Dark 2026-05-30 18:12:49 +00:00
CLAUDE.md Docker-turnkey: PWA-Icons, .dockerignore; CLAUDE.md; Wiki-Seiten 2026-05-30 18:19:22 +00:00
docker-compose.yml Docker turnkey: Backend-Healthcheck + service_healthy-Gate, reproduzierbarer Frontend-Build (npm ci + package-lock), benanntes Netzwerk/Container 2026-05-30 18:30:14 +00:00
README.md Voice Cal: Erfassungs-Tool (Sprache/Text -> CalDAV), OIDC, konfigurierbares LLM, Dark 2026-05-30 18:12:49 +00:00

Voice Cal

Schnelles Erfassungs-Tool: Sprache oder Text → Termin/Aufgabe, direkt in deine Nextcloud (CalDAV). PWA (iOS + Android über URL), geschützt per OIDC (authentik). Keine Kalender-Anzeige in der App Termine schaust du in Nextcloud an; diese App ist nur zum Eintragen.

Flow

  1. Tippen ins Textfeld oder aufs schwebende Mikro unten rechts.
  2. Backend: bei Audio faster-whisper → Text; dann OpenRouter → strukturiertes JSON.
  3. Review-Karte (Typ/Titel/Datum/Zeit/Ort editierbar) es wird noch nichts geschrieben.
  4. „In Kalender eintragen" → VEVENT/VTODO per CalDAV in die Nextcloud. Kurze Bestätigung, fertig.

Komponenten

Teil Technik
Frontend React + Vite + vite-plugin-pwa (kein Kalender-Widget)
Backend FastAPI
STT faster-whisper (large-v3-turbo, multilingual)
LLM OpenRouter, Modell zur Laufzeit über Settings wählbar
Kalender CalDAV (Nextcloud), nur schreibend
Auth authentik OIDC (Auth Code + PKCE)

Endpunkte

  • POST /api/process Audio (multipart) → {transcript, parsed}
  • POST /api/parse {text}{transcript, parsed} (ohne Whisper)
  • POST /api/confirm {item} → schreibt in CalDAV
  • GET/PUT /api/settings aktives LLM-Modell (in /data/settings.json)
  • GET /api/health

Setup

cp .env.example .env   # ausfüllen, dann:
docker compose up -d --build

Läuft auf :8080, dahinter dein Nginx Proxy Manager mit Let's Encrypt. Mikro braucht HTTPS nur über die NPM-Domain testen, nicht http://IP:8080.

authentik

Provider (OAuth2/OIDC), Typ Public (SPA, kein Secret), PKCE an. Redirect-URI: https://voicecal.itdata-gera.de/. Client-ID → OIDC_AUDIENCE + VITE_OIDC_CLIENT_ID, Issuer → OIDC_ISSUER + VITE_OIDC_AUTHORITY.

Nextcloud

App-Passwort erzeugen (Sicherheit → App-Passwörter) → CALDAV_PASSWORD. CALDAV_USER = Login-Name.

OpenRouter

model training aus, ZDR erzwingen. Default-Modell in .env; in der App über das Zahnrad jederzeit umstellbar (persistiert im settings-Volume).

Lokale Entwicklung

cd backend && pip install -r requirements.txt && uvicorn app.main:app --reload
cd frontend && npm install && npm run dev

Hinweise / Ausbau

  • App-Icons (frontend/public/icon-192.png, icon-512.png) ergänzen.
  • iOS liefert audio/mp4 statt webm das Backend normalisiert per ffmpeg, ist eingebaut.
  • Modell-Dropdown ist kuratiert + Freitext. Optional dynamisch: im Backend ein GET /api/models ergänzen, das https://openrouter.ai/api/v1/models proxyt und auf Structured-Output-fähige filtert.