a765d2d088d80132eadd56009a0750cc668fce66
- iCal feed at /api/ical/:token.ics — timetable (recurring), homework, class events, countdowns; subscribe in Google/Apple/Outlook Calendar - POST /api/ical-token + /api/ical-token/regenerate for token management - Grade calculator panel in Noten overlay: per-subject weighted average + "what score do I need?" solver (picks correct GRADE_WEIGHTS per type) - Countdown urgency: items ≤2 days pulse red via CSS animation - POST /api/me/logout-other — invalidates all other sessions by bumping token_version, re-issues JWT for current session - Settings: iCal URL section + copy button; session management section - Migration: users.ical_token, grades.created_at
Klassenportal
Privates Dashboard für Schulklassen. Stundenplan, Hausaufgaben, Noten, Fehlzeiten, Klassenkalender und Chat an einem Ort.
Läuft unter ifb.lol.
Stack
Node.js 20, Express 5, SQLite über better-sqlite3, Vanilla JS im Frontend. Kein Buildschritt. Auth per JWT im HttpOnly-Cookie, bcrypt, TOTP-2FA. Mail über Resend.
Lokal starten
npm install
cp .env.example .env # JWT_SECRET und RESEND_API_KEY setzen
node index.js
Bindet an 127.0.0.1:3010.
Registrierung
Beschränkt auf @ifb-schulen.com-Adressen (Regex IFB_EMAIL_RE in src/routes.js). Jeder neue Account muss per Mail bestätigt werden. Neue Lehrerkonten landen in einer Admin-Warteschlange.
Layout
index.js Express-Bootstrap
src/auth.js JWT-Sign/-Verify, requireAuth-Middleware
src/db.js SQLite, Schema, Migrationen
src/routes.js Auth, Admin, Chat, Kalender, Tickets, Health
src/teacher.js Lehrerendpoints
src/files.js Dateiablage mit Quota
src/mailer.js Resend-Wrapper
public/ HTML-Seiten (Vanilla JS)
Lizenz
MIT. Siehe LICENSE.
Description
Languages
HTML
74.8%
JavaScript
25.2%