Ein simples Tool, für Lehrerinnen und Lehrer entwickelt. Notenschlüssel nimmt dir die Rechnerei ab. Erstelle schnell und unkompliziert Notenskalen für das österreichische Notensystem (1–5), auch wenn sie einen Knick haben.
Kein Login, keine Datenbank, nichts wird gespeichert. Einfach Punkte eingeben, fertig.
- Maximale Punktzahl, Schrittweite und Knickpunkt eingeben
- Optional eine CSV-Datei mit Schülernamen und Punkten hochladen
- Ergebnisse ansehen, als CSV oder Excel runterladen
Das war's schon.
go run main.goBrowser auf http://localhost:8080 – fertig. Oder mit Docker:
docker compose upName,Punkte
Max Mustermann,85.5
Anna Schmidt,76.0
Tom Weber,92.5Punkt als Dezimaltrennzeichen. Semikolon als Spaltentrenner geht auch. Max. 10 MB.
Geschrieben in Go 1.25, keine Frameworks, fast nur Stdlib. Ein einzelner HTTP-Service, der alles macht.
notenschluessel/
├── main.go # Server, Middleware, Routen
├── pkg/
│ ├── calculator/ # Notenberechnung, CSV-Parsing
│ ├── downloads/ # CSV/Excel-Export
│ ├── handlers/ # HTTP-Handler
│ ├── logging/ # Strukturiertes Logging (slog/JSON)
│ ├── models/ # Datentypen
│ ├── security/ # Rate Limiting, IP-Extraktion
│ └── session/ # In-Memory Session Store
├── templates/
├── dockerfile
└── compose.yml
Zwei externe Dependencies:
- excelize für Excel-Export
- golang.org/x/time/rate für Rate Limiting
Auch wenn es nur ein Notenschlüssel ist – wenn man das Ding ins Netz stellt, sollte es ordentlich abgesichert sein:
- CSRF-Schutz über Go 1.25 nativ (
http.NewCrossOriginProtection()) - Rate Limiting pro IP (10 req/min, Burst 20)
- Security Headers (CSP, HSTS, X-Frame-Options, Permissions-Policy)
- Session-Cookies: HttpOnly, SameSite=Strict
- CSV-Injection-Schutz bei Exporten
- Reverse-Proxy-Support (X-Forwarded-For, X-Real-IP)
Keine Datenbank, keine Persistenz. Sessions leben im Memory und laufen nach 24h ab. Schülerdaten werden nur für die Berechnung verwendet und nie gespeichert. DSGVO-konform.
| Variable | Werte | Beschreibung |
|---|---|---|
ENV |
production / development |
Steuert HSTS, CSRF-Origins, Logging |
HOSTNAME |
z.B. noten.example.com |
Trusted Origin für CSRF |
Im Development geht localhost:8080, in Production nur der konfigurierte Hostname über HTTPS.
go test ./... -v # alle Tests
go test ./... -race # mit Race-Detector
go test ./... -cover # mit CoverageMulti-Stage Build nach scratch, ~15 MB Image, non-root User. Health Check über /healthz:
./notenschluessel --health-checkBraucht kein curl im Container – der Binary prüft sich selbst.
- Middleware (Security Headers, CSRF, Rate Limiting) liegt einmal auf dem gesamten Router – neue Endpunkte sind automatisch geschützt
- Logging über das
logging-Package, nichtfmt.Println - Keine CSRF-Tokens in Formulare – Go 1.25 macht das über Browser-Header
Apache 2.0 – siehe LICENSE.