classRoom ist ein Werkzeugkasten für Lehrerinnen und Lehrer: Auftrag, Zeit, Ziele und Lautstärke – groß und klar am Beamer, ohne Einarbeitung. Selbst gehostet mit Docker, alle Daten bleiben auf dem eigenen Server.
Funktionen · Installation · Konfiguration · Update, Daten & Backup · Entwicklung · Changelog
| 📋 Auftrag | Großer Titel, nummerierte Schritte, Bilder und Links; Editor mit Formatierung. Schrift per A− / A+ (bis 250 %) und Bilder in feinen Stufen vergrößern, Vollbild. Schritte als Stunden- oder Selbstlern-Ziele an alle, eine Gruppe oder einzelne Schüler senden (mit Rückgängig); Gruppen mit Name und Farbe bleiben gespeichert – danach zeigt jeder Schritt, wie viele ihn erledigt haben. |
| ⏱️ Kopfband | Zeitbalken in vier Phasen (Arbeitsphase · Aufräumen · Jetzt zurück in Raum 101 · Sofort zurück in Raum 101!), rechts immer „Zurück in Raum 101 um 22:38“, mit Viertelstunden-Strichen, Digitaluhr. Ohne laufende Stunde zeigt der Balken „▶ Stunde starten · 45 min · bis 18:18 · Zimmer 101“ und „Anpassen…“. Im Menü startet eine Karte die Stunde mit den Reitern Zeit · Raum · Aufräumen: Dauer (15/30/45/90 min) oder eigene Zeiten, Raum aus einer eigenen Liste (oder kein Raumwechsel), Aufräumen-Phase in Minuten. |
| 🎯 Stundenziele & Selbstlernen | Eine Kachel pro Schüler, live aktualisiert, 20–30 Schüler ohne Scrollen. Jede Kachel zeigt das aktuelle Ziel und die Zeit seit dem letzten Abhaken – wer seit 15 min nichts abgehakt hat, wird gelb markiert. Schüler können „Nur meine Kachel“ einschalten. |
| 🚦 Lautstärke-Ampel | Misst über das Mikrofon des Lehrer-Geräts – nur im Browser, kein Ton wird gespeichert oder übertragen. Schüler sehen die Farbe. |
| 📝 Test-Modus | Große Uhr, vergangene und verbleibende Zeit im Vollbild; läuft serverseitig weiter. |
| 🎨 Hintergründe | 25 Verläufe, 26 Muster, 18 Fotos oder eigene Bilder – für alle festgelegt oder von jedem Schüler selbst gewählt. Hell- und Dunkelmodus. |
| 👥 Verwaltung | Schüler und Lehrkräfte in Minuten angelegt; Schüler melden sich mit Kürzel oder „Vorname Nachname“ an. |
Alle Details zu den Funktionen
Auftrag (Startseite)
- Eine nummerierte Liste erscheint als Schritte mit Zahl im Kreis – auch von Hand getippte Zeilen mit „- “ oder „1. “ am Anfang; Umschalt+Enter gibt einem Schritt eine graue Zusatzzeile.
- Bilder per Knopf, Strg+V oder Hineinziehen (irgendwo auf die Karte) – sie werden vor dem Hochladen verkleinert (höchstens 1920 px, einige hundert KB). Rechts als gleich zugeschnittene Vorschau, ein Klick zeigt das ganze Bild.
- Links stehen klein unten in der Karte. Das HTML wird beim Speichern serverseitig bereinigt.
- Leiste Stundenziele darunter: ein Quadrat pro Schüler, je mehr erledigt, desto grüner – sind alle fertig: „🎉 Alle Ziele erledigt“.
Stundenziele & Selbstlern-Modus
- Klick auf eine Kachel klappt die Checkliste auf; nur die Kacheln darunter rücken nach. Lehrkräfte können alle auf-/einklappen.
- Beide Modi zeigen das aktuelle Ziel und die Zeit seit dem letzten Abhaken; lange Ziele werden gekürzt, die Zeit bleibt sichtbar.
- „Neue Stunde“ leert nur die Stundenziele; Selbstlern-Ziele bleiben.
- Schüler bearbeiten nur ihre eigene Kachel.
Lautstärke-Ampel
- Im Menü unter Anzeige → Ampel: Empfindlichkeit, Schwellen für Gelb und Rot, Live-Test.
- Browser erlauben das Mikrofon nur über HTTPS oder
localhost.
Zugänge
- Das erste Lehrerkonto kommt aus der
.env; sein Passwort wird bei jedem Start auf den.env-Wert gesetzt – so kommt man nach einem vergessenen Passwort wieder hinein. - Schüler-Passwörter werden nur einmal angezeigt; „Neues Passwort“ meldet den Schüler überall ab.
- Nach 5 falschen Passwörtern ist ein Benutzername 5 Minuten gesperrt.
Allgemein
- Für Smartphone und Tablet angepasst; eigene Dialoge im Stil der App.
- Geplant: Zufallsauswahl, Gruppen bilden.
Du brauchst nur Docker mit Compose – kein Node.js, kein Quellcode. Images gibt es für amd64 und arm64 (z. B. Raspberry Pi).
1. Ordner anlegen und zwei Dateien aus diesem Repo hineinkopieren: docker-compose.yml und .env.example.
mkdir -p /opt/classroom && cd /opt/classroom
# docker-compose.yml und .env.example hierher kopieren
cp .env.example .env2. Passwort setzen – in der .env mindestens das Lehrerkonto eintragen:
TEACHER_USERNAME=lehrer
TEACHER_PASSWORD=ein-sicheres-passwort3. Starten:
docker compose pull
docker compose up -dFertig – classRoom läuft unter http://localhost:3000 (bzw. http://<server-ip>:3000). Mit dem Lehrerkonto anmelden und unter Menü → Schüler verwalten die Klasse anlegen.
Tip
Für die Lautstärke-Ampel braucht der Browser HTTPS (oder localhost). Im Schulnetz am einfachsten hinter einen Reverse Proxy wie Caddy oder Traefik stellen.
Alles steht in der .env; nach einer Änderung docker compose up -d ausführen. Raum, Zeiten, Aufräumen-Minuten, Ampel und Hintergrund lassen sich zusätzlich im Menü ändern – diese Werte überschreiben die .env.
| Variable | Wofür | Standard |
|---|---|---|
TEACHER_USERNAME |
Benutzername des ersten Lehrerkontos | lehrer |
TEACHER_PASSWORD |
Passwort dazu – muss gesetzt werden (mind. 8 Zeichen) | – |
PORT |
Port, unter dem classRoom erreichbar ist | 3000 |
CLASSROOM_VERSION |
Image-Version, z. B. 0.3.3 |
latest |
Weitere Einstellungen
| Variable | Wofür | Standard |
|---|---|---|
SESSION_HOURS |
Wie lange eine Anmeldung gültig bleibt (Stunden) | 12 |
DEFAULT_ROOM_CHANGE |
Nach der Stunde Raumwechsel: Balken zeigt „Zurück in Raum …“ statt nur „Ende“ | true |
DEFAULT_ROOM_NAME |
Raum, in den es danach zurückgeht | Klassenzimmer |
DEFAULT_START_TIME / DEFAULT_RETURN_TIME |
Beginn und Ende (HH:MM), leer = nicht gesetzt |
– |
LESSON_DURATIONS |
Dauern in Minuten: die erste gilt für „Stunde starten“ im Kopfband, alle erscheinen im Menü | 45,90 |
WARN_MINUTES |
Ab wie vielen Minuten vor Schluss „Aufräumen“ erscheint (auch Test-Modus) | 5 |
GO_MINUTES |
Ab wie vielen Minuten vor Schluss „Jetzt zurück in …“ erscheint | 3 |
DEFAULT_THEME |
system, light oder dark |
system |
GOALS_COLLAPSED |
Ziel-Kacheln anfangs eingeklappt | true |
UPLOAD_MAX_MB |
Maximale Bildgröße nach dem Verkleinern | 5 |
NOISE_ENABLED |
Lautstärke-Ampel anzeigen | true |
NOISE_SENSITIVITY |
Empfindlichkeit des Mikrofons, 1–10 | 5 |
NOISE_YELLOW / NOISE_RED |
Pegel 0–100 für Gelb bzw. Rot | 50 / 75 |
DATABASE_PATH |
Nur ohne Docker: Pfad der SQLite-Datei | data/classroom.db |
Aktualisieren (auf latest bzw. CLASSROOM_VERSION):
docker compose pull && docker compose up -dDaten bleiben dabei erhalten; neue Tabellen und Spalten werden beim Start automatisch ergänzt. Was sich geändert hat, steht im CHANGELOG.
Nicht im Ordner mit der docker-compose.yml, sondern im Docker-Volume classroom-data, das Docker selbst verwaltet:
| Was | Wo |
|---|---|
docker-compose.yml, .env |
Im Installationsordner, z. B. /opt/classroom |
| Schüler, Ziele, Gruppen, Auftrag, Räume, Einstellungen, Logins | Eine SQLite-Datei classroom.db im Volume |
| Hochgeladene Bilder und Hintergründe | Ebenfalls in der Datenbank, nicht als einzelne Dateien |
Docker setzt den Ordnernamen vor den Volume-Namen – bei /opt/classroom heißt es classroom_classroom-data. Unter Linux liegt es meist unter /var/lib/docker/volumes/classroom_classroom-data/_data/. Name und Pfad zeigen:
docker volume ls
docker volume inspect classroom_classroom-data # Pfad bei „Mountpoint“Warning
docker compose down -v und docker volume rm … löschen das Volume und damit alle Daten. Ein normales docker compose down oder ein Update ist unbedenklich. Für einen Umzug auf einen anderen Server reicht es nicht, den Installationsordner zu kopieren – das Volume muss mit (siehe Backup).
# Nur die Datenbank sichern
docker compose cp classroom:/app/data/classroom.db ./backup.db
# Ganzes Volume als Archiv sichern (am besten bei gestopptem Container)
docker compose stop
docker run --rm -v classroom_classroom-data:/data -v "$PWD":/backup alpine tar czf /backup/classroom-backup.tgz -C /data .
docker compose up -d
# Archiv wiederherstellen – ersetzt alle aktuellen Daten!
docker compose stop
docker run --rm -v classroom_classroom-data:/data -v "$PWD":/backup alpine sh -c "rm -rf /data/* && tar xzf /backup/classroom-backup.tgz -C /data"
docker compose up -dDaten lieber als normaler Ordner neben der docker-compose.yml?
In der docker-compose.yml statt des Volumes einen Ordner einbinden:
volumes:
- ./data:/app/dataBestehende Daten vorher einmal aus dem Volume nach ./data kopieren – sonst startet classRoom leer.
Aus dem Quellcode bauen, lokal entwickeln, Release erstellen
Technik: SvelteKit (Svelte 5) · SQLite (better-sqlite3) · Docker
# Image lokal bauen – docker compose nimmt dann dieses statt des heruntergeladenen
docker build -t ghcr.io/seals187/classroom:latest .
docker compose up -d
# Ohne Docker (Node.js ab 22)
npm ci
npm run dev # Entwicklung mit Hot-Reload
npm run build && npm start # ProduktionsbuildRelease: Version in package.json anheben, Abschnitt in CHANGELOG.md ergänzen, committen und einen Tag pushen (git tag v0.3.3 && git push origin v0.3.3). GitHub Actions baut dann das Image für amd64/arm64, veröffentlicht es unter ghcr.io/seals187/classroom und legt das GitHub-Release mit dem Text aus dem CHANGELOG an. Dependabot hält npm-Pakete, Docker-Basis-Image und Actions aktuell.
classRoom steht unter der GNU AGPL-3.0 · © 2026 Julien Kühne · Fehler melden
Die Fotos unter Hintergrund → Fotos stammen von Pexels (Pexels-Lizenz): Dominykas (Farn), Evie Shaffer (Blüten auf Dunkel), Peter Olexa (Stadt am Abend), shotbyrain (Lichter warm), Steve (Band lila, Faltwerk rosa, Würfel, Farbflecken), Alexas Fotos (Margeriten), Codioful (Abendverlauf), David Si (Abendhimmel), DS stories (Herzen), Ian Panelo (Sonnenuntergang), Marcin Jozwiak (Glut rot, Glut lila), Pixabay (Wüste), Timothy Paule II (Be Brilliant), Vlah (Gräser im Abendlicht). Muster und Farbverläufe sind selbst gezeichnet.



