Progressive Web App für eine Gesangslehrerin, um Schüler, Unterrichtsstunden und Repertoire zu verwalten. Läuft offline-first via PouchDB und synchronisiert mit CouchDB auf einem Heimserver über Tailscale.
- Schülerverwaltung — Schüler anlegen, Termin (inkl. 2-wöchentlicher Cadence), Tarif, Status (aktiv/pausiert)
- Abrechnung — Stundenkarte (n-er), Festvertrag oder Frei; Zähler, Reset, Karte wechseln
- Stundenprotokoll — Einträge pro Song mit Notiz + Hinweis, Timeline-Ansicht
- Allgemeine Notizen — songübergreifende Notizen pro Schüler (eigener Tab)
- Bibliothek — alle Songs aller Schüler gruppiert nach Titel, durchsuchbar
- Heute — wer hat heute Unterricht (inkl. Cadence-Logik, Nachholtermine, Ferien)
- Verschieben — Stunde auf anderes Datum/Uhrzeit verschieben
- Offline — vollständig offline nutzbar (PouchDB + Service Worker)
- Backup — tägliches Backup nach filen.io
| Schicht | Technologie |
|---|---|
| Frontend | SvelteKit 5 · Svelte 5 Runes · TypeScript |
| Styling | Tailwind CSS · Material-You Tokens (CSS-Variablen) |
| Lokale DB | PouchDB (IndexedDB) |
| Sync | CouchDB auf Raspberry Pi via Tailscale |
| Deployment | Docker (CouchDB + nginx + Backup-Service) |
| PWA | Workbox Service Worker via @vite-pwa/sveltekit |
pupils/
├── app/ # SvelteKit PWA
│ ├── src/
│ │ ├── lib/ # repo.ts, db.ts, types.ts, stores.ts, Komponenten
│ │ └── routes/ # +page.svelte je Route (/heute, /bibliothek, /einstellungen, /s/[id])
│ └── static/ # Icons, Manifest
├── stack/ # Docker-Stack (CouchDB + nginx + backup)
├── docs/ # DEPLOY.md, FIRST_RUN.md, DISASTER_RECOVERY.md
├── AGENTS.md # Konventionen für alle AI-Agents (Implementer, Reviewer)
├── CLAUDE.md # Architekt-Rolle für Claude Code
└── TASK.md # Aktiver Implementierungsauftrag (ggf. leer nach Release)
Voraussetzungen: Node.js ≥ 20, Docker
# CouchDB starten (dev)
docker compose -f docker-compose.dev.yml up -d
# → http://localhost:5984/_utils (admin / devpassword)
# App starten
cd app
npm install
npm run dev
# → http://localhost:5173
# TypeScript prüfen
npm run checkVollständige Anleitung: docs/DEPLOY.md
# Pflicht-Umgebungsvariablen in stack/.env:
COUCHDB_ADMIN_PASSWORD=... # ≥ 24 Zeichen
TEACHER_PASSWORD=... # ≥ 16 Zeichen (App-Login)
FILEN_EMAIL=...
FILEN_PASSWORD=...Stack deployen:
cd stack
docker compose up -d| Typ | ID-Format |
|---|---|
| Student | student:<ulid> |
| Song | song:<studentUlid>:<songUlid> |
| Entry | entry:<songUlid>:<invTimestamp>:<entryUlid> |
Entry-IDs nutzen invertierte Timestamps → allDocs liefert neueste zuerst.
Änderungen laufen durch drei Rollen:
- Architect (Claude Code) — plant, schreibt
TASK.md - Implementer (
/implementOpenCode-Skill) — schreibt Code, schreibt Handoff - Reviewer (
/reviewOpenCode-Skill) — prüft Code, führtnpm run checkaus
Details: AGENTS.md · CLAUDE.md
MIT