- JavaScript 41.5%
- Python 40%
- CSS 13.7%
- HTML 2.7%
- Dockerfile 2.1%
| backend | ||
| frontend | ||
| wiki | ||
| .env.example | ||
| .gitignore | ||
| CLAUDE.md | ||
| docker-compose.yml | ||
| README.md | ||
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
- Tippen ins Textfeld oder aufs schwebende Mikro unten rechts.
- Backend: bei Audio faster-whisper → Text; dann OpenRouter → strukturiertes JSON.
- Review-Karte (Typ/Titel/Datum/Zeit/Ort editierbar) – es wird noch nichts geschrieben.
- „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 CalDAVGET/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/mp4stattwebm– das Backend normalisiert per ffmpeg, ist eingebaut. - Modell-Dropdown ist kuratiert + Freitext. Optional dynamisch: im Backend ein
GET /api/modelsergänzen, dashttps://openrouter.ai/api/v1/modelsproxyt und auf Structured-Output-fähige filtert.