No description
  • TypeScript 48.6%
  • JavaScript 42.6%
  • SCSS 8.2%
  • Shell 0.4%
  • HTML 0.1%
Find a file
Dennis Burgermeister 5243abbf73
Some checks failed
CI / verify (push) Has been cancelled
(c) Version 1.2.1-beta.1
2026-11-04 05:30:44 +00:00
.forgejo/workflows release: Version nur über release:prepare, Lieferung nur aus dem Tag 2026-10-29 20:06:29 +00:00
.github/workflows chore(toolchain): align app and CI with Node 26 2026-10-26 17:54:37 +00:00
.vscode (+) flake setup 2026-10-18 10:43:38 +02:00
backend backend: Login-Benachrichtigung per Gerätetoken statt Netz/Gerät 2026-11-03 09:41:45 +00:00
containers Revert "backend: Zwei-Faktor-Anmeldung mit TOTP" 2026-10-29 20:54:10 +00:00
docs Datenschutz: Anmeldung mit Code und „Gerät merken“ beschreiben 2026-11-03 09:45:18 +00:00
frontend-checks@259e5b8c41 (+) deployment / updated submodule 2026-10-26 21:01:30 +01:00
LICENSES feat(legal): ship license notices and align privacy disclosures 2026-10-26 12:53:26 +00:00
messages MFA per Mail als Schalter mit Ladezustand 2026-10-29 22:44:40 +00:00
old (c) dencla 2026-04-02 20:55:13 +02:00
packages feat(legal): ship license notices and align privacy disclosures 2026-10-26 12:53:26 +00:00
project.inlang Toolchain: Vite 8, TypeScript 6, Paraglide 2, shared frontend checks 2026-10-19 18:42:05 +00:00
scripts (f) missing lang does not crash the app; don't spam new login msgs 2026-11-02 20:25:01 +01:00
src Datenschutz: Anmeldung mit Code und „Gerät merken“ beschreiben 2026-11-03 09:45:18 +00:00
test MFA per Mail als Schalter mit Ladezustand 2026-10-29 22:44:40 +00:00
tools Toolchain: Vite 8, TypeScript 6, Paraglide 2, shared frontend checks 2026-10-19 18:42:05 +00:00
.env.development (+) Backend mit PocketBase: Konten, Gruppen, Freigaben, Katalog, Veröffentlichen, Deployment 2026-10-14 12:00:45 +00:00
.env.template release: Version nur über release:prepare, Lieferung nur aus dem Tag 2026-10-29 20:06:29 +00:00
.gitignore release: Version nur über release:prepare, Lieferung nur aus dem Tag 2026-10-29 20:06:29 +00:00
.gitmodules (+) frontend-checks submodule 2026-10-19 21:20:21 +02:00
AGENTS.md release: Version nur über release:prepare, Lieferung nur aus dem Tag 2026-10-29 20:06:29 +00:00
flake.lock (c) updated flakes 2026-10-28 12:13:40 +01:00
flake.nix (+) flake update 2026-10-21 17:40:50 +02:00
frontend-checks.config.mjs feat(legal): ship license notices and align privacy disclosures 2026-10-26 12:53:26 +00:00
index.html (c) Load jshint on demand, clean up editor instances 2026-09-14 13:33:41 +00:00
LICENSE feat(legal): ship license notices and align privacy disclosures 2026-10-26 12:53:26 +00:00
mise.toml Revert "backend: Zwei-Faktor-Anmeldung mit TOTP" 2026-10-29 20:54:10 +00:00
package.json (c) Version 1.2.1-beta.1 2026-11-04 05:30:44 +00:00
pnpm-lock.yaml (+) deployment / updated submodule 2026-10-26 21:01:30 +01:00
pnpm-workspace.yaml (+) devcontainer setup 2026-09-14 12:57:43 +00:00
README.md backend: Login-Benachrichtigung per Gerätetoken statt Netz/Gerät 2026-11-03 09:41:45 +00:00
renovate.json ci: verify and release d0b bundles on Forgejo 2026-10-26 19:27:34 +00:00
THIRD_PARTY_NOTICES.md feat(legal): ship license notices and align privacy disclosures 2026-10-26 12:53:26 +00:00
tsconfig.json (+) Autorenbereich ersetzt den alten Editor; Lernapp lädt veröffentlichte Pakete 2026-10-14 12:00:51 +00:00
vite-plugin-notices.mts feat(legal): ship license notices and align privacy disclosures 2026-10-26 12:53:26 +00:00
vite-plugin-preview-frame.mts (f) clean preview and app console from spurious warnings and source map errors 2026-10-13 09:25:37 +00:00
vite.config.mts feat(legal): ship license notices and align privacy disclosures 2026-10-26 12:53:26 +00:00

code.dencla.de

Lernplattform für HTML, CSS und JavaScript. Lernende bearbeiten Aufgaben im Browser, die Vorschau prüft ihren Code Schritt für Schritt. Lehrkräfte schreiben Aufgaben im Autorenbereich, stellen sie zu Paketen zusammen und veröffentlichen sie.

Teil Wo Wer
Lernapp /, /p/<paket>, /<paket>/<aufgabe> Lernende, ohne Konto; Fortschritt bleibt im Browser
Autorenbereich /autor Lehrkräfte mit Konto
Backend PocketBase, im Browser unter /api –

Einblicke in die App

Lernende schreiben HTML, CSS und JavaScript direkt neben der Aufgabenstellung. Die Live-Vorschau zeigt das Ergebnis; bestandene Schritte werden automatisch abgehakt.

Teilweise gelöste Aufgabe: HTML-Editor, Live-Vorschau, offene Schritte und aufgeklapptes Infovideo

Ungelöster Stand und Fehlerhinweis ansehen

Ungelöste Aufgabe mit formatiertem HTML-Grundgerüst und drei offenen Schritten

Ein Prüfhinweis erklärt den falschen Überschriftentext direkt am Code

Die Demo beginnt mit einer ungelösten Aufgabe: Code schreiben, einen Fehlerhinweis lesen, die Überschrift korrigieren und die Video-Info öffnen. Ein weiterer Schritt bleibt bewusst offen.

Lernablauf: HTML bearbeiten, Fehlerhinweis lesen und die Aufgabe schrittweise lösen

Lehrkräfte stellen Aufgaben zu Paketen zusammen und veröffentlichen sie über einen Link für ihre Klasse.

Paketverwaltung für Lehrkräfte mit Aufgabenliste und Veröffentlichung

Im Aufgaben-Editor bearbeiten Lehrkräfte Texte, Startdateien, Musterlösungen und Prüfungen. Die Lernansicht lässt sich dabei direkt daneben ansehen.

Aufgaben-Editor mit Schritten, Prüfregeln und Lernansicht

Textbearbeitung, Startcode und Aufgabenoptionen ansehen

Einführungstext bearbeiten und das Ergebnis in der Lernansicht ansehen

Startdateien mit formatiertem HTML und direkter Vorschau bearbeiten

Aufgabenoptionen: Titel, Schwierigkeit, Lizenz, Katalog und Schlagwörter

Lehrkräfte bearbeiten den Einführungstext, ergänzen Prüfbedingungen und ändern Startdateien und Einstellungen

Beide Abläufe gibt es auch als Video mit Abspielsteuerung. Alle Aufnahmen stammen aus einem isolierten Testserver mit lokalen Fixtures. Weitere Motive und Hinweise zur Wiederverwendung stehen in docs/media/README.md.

Dev Setup (microVM)

Die Entwicklungsumgebung läuft in einer isolierten KVM-MicroVM (qemu, aus dem gemeinsamen nix-dev-sandbox), um vollständige Isolation für Shell- und Agenten-Execution sicherzustellen, ohne Host-Secrets oder Host-ENVs zu exponieren.

1. Host-Voraussetzungen (Arch Linux / Linux)

KVM-Zugriff und Nix mit Flake-Support bereitstellen:

# Benutzer zur KVM-Gruppe hinzufügen (einmalig, danach neu einloggen)
sudo usermod -aG kvm $USER

# Sicherstellen, dass Nix Flakes aktiv sind (~/.config/nix/nix.conf)
mkdir -p ~/.config/nix
echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf

# Copy project config and set your data, especially DEV_SSH_PUBKEY
cp .env.template .env

Add to your ~/.ssh/config:

Host dencla-vm
    HostName 127.0.0.1
    Port 2200
    User dev
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
    IdentityFile ~/.ssh/id_ed25519
    ConnectTimeout 5

Start MicroVM

mkdir .microvm-state
nix run --impure # impure to allow reading untracked .env

Setup VS Code integration:

code --remote ssh-remote+dencla-vm /workspaces/code.dencla.de

Starten

In der MicroVM sind Node, pnpm, mise, PocketBase und Chromium bereits vorinstalliert (auf dem Host genügt mise install).

mise run backend:install    # PocketBase nach backend/ holen (einmalig, Prüfsumme wird geprüft)
mise run dev                # PocketBase :8090 + Vite :3000

Dann http://127.0.0.1:3000 öffnen. Vite reicht /api an PocketBase durch; im Browser braucht es nur Port 3000.

Beim ersten mise run dev (noch keine backend/pb_data/data.db) legt scripts/dev.sh die Datenbank aus den Migrationen an, erzeugt den Superuser und spielt den Seed ein: ein Lehrkraft-Konto mit Admin-Rolle, die Kategorien und die drei Pakete aus packages/, veröffentlicht und auf der Startseite. In der MicroVM wird backend/pb_data dabei automatisch auf das schnelle ext4-Volume /persist/pb_data gemountet.

Zugänge in der Entwicklung

Nur lokal, nie auf dem Server verwenden. Alle Werte lassen sich in .env überschreiben (Vorlage: .env.template).

Wofür Wo Anmeldung
Autorenbereich (Lehrkraft, Admin) http://127.0.0.1:3000/autor lehrkraft@code.dencla.local / testtest1234
PocketBase-Dashboard (Superuser) http://127.0.0.1:8090/_/ dev@code.dencla.local / devdevdev123
Kollegin, teilt ein Paket zum Bearbeiten /autor kollegin@code.dencla.local / testtest1234
Andere Schule, Katalog, Entwurf zum Lesen geteilt /autor fremd@code.dencla.local / testtest1234
Referendar, Fachschaftsgruppe, Review-Anfrage /autor referendar@code.dencla.local / testtest1234

Die Demo-Daten (backend/seed-demo.mjs) bringen dazu eine Gruppe „Fachschaft Informatik“, veröffentlichte und auffindbare Pakete (auf der Startseite nach „CSS“ oder „Spiele“ suchen), Katalog-Aufgaben und einen Entwurf. Sie gehen nur in eine lokale Datenbank.

Konten gibt es nur auf Einladung (docs/registration.md). Lokal verschickt PocketBase keine Mails; ein weiteres Konto legt man am einfachsten im Dashboard an (Collection users, verified setzen). Um den Ablauf selbst zu durchlaufen, mit Testpostfach starten, eine Einladung erzeugen und den Link aus dem Postfach holen (Mailwiederholung ruht dabei):

DENCLA_TEST_MAILBOX=1 mise run dev
(cd backend && ./pocketbase invite create --email neu@code.dencla.local)
# nach „Einladung prüfen“: GET /api/test-mailbox/neu@code.dencla.local als Superuser

Häufige Aufgaben

mise tasks                  # alle Tasks mit Beschreibung
mise run backend:reset      # Dev-Datenbank neu aus den Migrationen (löscht alles, legt den Superuser an)
mise run backend:seed       # danach: Konto, Kategorien, Pakete und Demo-Daten wieder einspielen
mise run backend:assets     # Bilder aller Aufgaben auf den Server holen (ohne --apply nur anzeigen)
mise run backend:serve      # nur PocketBase
mise run build              # Produktions-Build nach dist/ (mit allen statischen Prüfungen)
mise run preview            # dist/ auf :4173 ausliefern

Tests und Prüfungen

mise run test               # Unit-Tests (node:test)
mise run test:backend       # Regeln und Hooks gegen ein Wegwerf-PocketBase (:8099)
mise run test:browser       # Musterlösungen und Oberfläche im echten Browser
mise run check:all          # Kontrast, Barrierefreiheit, Übersetzungen, Styles, Typen

Die Browsertests starten Vite und ein temporäres PocketBase auf freien Loopback-Ports. Sie importieren ausschließlich lokale Aufgaben-Fixtures und löschen die Testdaten nach dem Lauf. Die Entwicklungsdatenbank bleibt unberührt. Chromium bei Bedarf mit mise run browser:install installieren. Das Browser-Fixture-Konto ist author@code.dencla.local / browser-test-password; es existiert nur im Wegwerf-Backend. DENCLA_BASE_URL erlaubt einen bereits eingerichteten Testserver.

Geprüft werden Musterlösungen, Lernoberfläche und das Speichern im Autorenbereich.

Betrieb

Produktiv läuft code.dencla.de auf dem Server d0b als Dienst zumcode: rootless Podman-Pod mit den Rollen web (Caddy mit der App) und pb (PocketBase), beschrieben durch die Quadlets in containers/.

cp src/legal/impressum.example.md src/legal/impressum.md  # einmalig; echte Rechtstexte (gitignored)
cp src/legal/datenschutz.example.md src/legal/datenschutz.md
mise run release:prepare 1.0.0-beta.2  # Version setzen, Commit + Tag v1.0.0-beta.2 (pusht nicht)
mise run release:deploy v1.0.0-beta.2  # getaggten Stand prüfen und bauen: deploy/ + dist/zumcode-<tag>.tar.zst
mise run test:containers              # Rollen rootless, read-only, Health, Smoke, Browsertests
git push --follow-tags                # erst jetzt nach außen

Die Version steht nur in package.json. Releases baut die Forgejo-CI aus dem Tag v<version>; auf d0b genügt dann app deploy zumcode <tag>. Einrichtung, Umzug, Dashboard per SSH-Tunnel und Backups: docs/deployment.md.

Dokumentation

  • AGENTS.md – kompakter Einstieg für Agenten
  • docs/qualitaet-und-coding-standards.md – Architektur und Qualitätsregeln
  • docs/backend-concept.md – Konzept und Entscheidungen: warum PocketBase, Rechte, Veröffentlichen, Updates in der Lernapp
  • docs/mfa.md – Anmeldung mit Code per Mail (eingebaute MFA): Ein/Aus im Konto, Gerät 30 Tage merken, Code nur nach Passwort
  • docs/login-alerts.md – Mail bei Anmeldung auf einem unbekannten Gerät (Gerätetoken im HttpOnly-Cookie) statt des eingebauten Alerts
  • docs/totp.md – Konzept, geparkt: eigene Zwei-Faktor-Anmeldung mit TOTP; vorerst gilt die eingebaute Mail-MFA von PocketBase
  • docs/backend.md – Schema, Rechte, Routen, Prüfungen vor dem Veröffentlichen
  • docs/deployment.md – Betrieb auf d0b: Podman-Quadlets, Release, Dashboard, Backups
  • docs/checks.md – Überprüfungen: Aufbau, Register, eigene Prüfung, neue Prüffunktion anlegen
  • docs/legal-standard.md – Standard für Impressum & Datenschutz (src/legal/, Darstellung, Release-Prüfung, Git-Audit) in allen SolidJS-Apps der Familie

Aufbau

src/                 Lernapp (SolidJS)
  routes/author/     Autorenrouten – werden bei Bedarf geladen
  components/author/ Fachkomponenten des Autorenbereichs
  hooks/             Zustand und Abläufe der Ansichten
  checks/            Prüffunktionen als Register (docs/checks.md)
  utils/validator.ts führt Überprüfungen im Sandbox-Frame aus
  preview/           Vorschau-Frame und Protokoll dorthin
backend/
  pb_migrations/     Schema als Code
  pb_hooks/          Routen und Regeln (lib/ = geteilter Code)
  seed.mjs           Dev-Daten
messages/            Texte Deutsch/Englisch (paraglide)
packages/            Ausgangsstand der Pakete für den Seed

Lizenzen und Veröffentlichung

Anwendungscode und Entwicklerdokumentation: MIT. Beispielaufgaben und zugehörige Bilder: CC BY-SA 4.0, Attribution „code.dencla.de“. Details und Drittkomponenten: THIRD_PARTY_NOTICES.md.

Vor öffentlichem Push: pnpm check:secrets und pnpm audit:history. Das Audit ist eine ergänzende Musterprüfung, keine vollständige Secret-Prüfung. Produktive Rechtstexte bleiben lokal; Release und Deployment lehnen unvollständige Vorlagen ab. Der Build liefert Lizenztexte mit aus. Betrieb und Löschfristen: docs/privacy-operations.md.

Bei knappen VM-Ressourcen Build und Browserprüfungen nacheinander ausführen. Unit-Tests laufen sequenziell; unter 6 GB RAM begrenzt der Browser-Runner auch ausdrücklich angeforderte Parallelität auf einen Chromium-Prozess.