Doel
Bouw een lokale webinterface bovenop de bestaande CLI zodat data-analisten de studentprognose-pipeline kunnen bedienen zonder terminal-kennis. De GUI omhult de CLI volledig — geen duplicatie van logica, alleen een schil die argumenten samenstelt en subprocessen aanstuurt.
Aanleiding
De pipeline heeft ~40 configuratieparameters verspreid over twee JSON-bestanden, meerdere inputbestanden en drie uitvoercommando's (standaard, benchmark, tune). Nieuwe gebruikers lopen vast op het instellen van paden, het begrijpen van weeknummer-ranges en het interpreteren van Excel-output. Een GUI verlaagt de drempel zonder de CLI-workflow te breken.
Gekozen framework: NiceGUI
| Criterium |
Reden |
| Pure Python |
Past in bestaande uv-workflow, geen JS-kennis nodig |
| Lokale bestandskiezer |
Vereist voor input-bestanden en configuratie-JSON |
| Live stdout streaming |
Pipeline-runs duren minuten; voortgang moet zichtbaar zijn |
| Plotly-integratie |
Bestaande HTML-dashboards direct inlaadbaar via ui.html |
| Distributie |
uv run --extra gui python gui/app.py — één commando |
Architectuur
gui/
├── app.py # NiceGUI entry point + routing
├── pages/
│ ├── wizard.py # Init-wizard (stap 1: nieuw project)
│ ├── run.py # Pipeline-runner (stap 2: uitvoeren)
│ ├── config.py # Configuratie-editor (stap 3: instellen)
│ ├── output.py # Resultatenpagina (stap 4: resultaten)
│ └── benchmark.py # Benchmark & tune tab
└── components/
├── file_picker.py # Herbruikbare bestandskiezer
├── log_stream.py # Live stdout → ui.log component
└── param_form.py # Dynamisch formulier uit config-schema
De GUI roept subprocess.Popen aan op de bestaande studentprognose-CLI. Geen import van interne modules — de CLI is het contract.
Gebruikersflow
[1: Init] → [2: Configuratie] → [3: Filteren] → [4: Uitvoeren] → [5: Resultaten]
Nieuwe gebruikers volgen de wizard lineair. Terugkerende gebruikers navigeren vrij via de zijbalk.
Branch-strategie
Al het GUI-werk verzamelt zich op feat/gui — niet op main. Pas als de volledige GUI werkend en getest is, gaat feat/gui → main in één PR.
main
└── feat/gui ← integratiebranch (deze epic)
├── feat/gui-265-setup → PR naar feat/gui
├── feat/gui-272-ux-design → PR naar feat/gui
├── feat/gui-266-init-wizard → PR naar feat/gui
├── feat/gui-267-config-editor → PR naar feat/gui
├── feat/gui-271-filtering → PR naar feat/gui
├── feat/gui-268-runner → PR naar feat/gui
├── feat/gui-269-resultaten → PR naar feat/gui
└── feat/gui-270-benchmark → PR naar feat/gui
Conventie per sub-issue:
- Branch aftakken van:
feat/gui
- Branch naam:
feat/gui-{issuenr}-{korte-naam}
- PR base:
feat/gui (niet main)
Sub-issues
Fundament (eerst)
Wizard-stappen
Uitvoeren & resultaten
Geavanceerd (later)
Later toegevoegd
Afronden
Wanneer alle sub-issues afgevinkt zijn en de GUI lokaal end-to-end werkt:
feat/gui rebasen op de nieuwste main
- PR aanmaken:
feat/gui → main
- Smoke test draaien via de GUI (niet alleen CLI)
- Milestone GUI v1 sluiten
Buiten scope
- Eigen modellogica in de GUI (pipeline blijft in CLI)
- Hosting / multi-user server (lokaal gebruik, één sessie)
- Authenticatie
- Migratie van bestaande CLI-gebruikers (GUI is additioneel)
Doel
Bouw een lokale webinterface bovenop de bestaande CLI zodat data-analisten de studentprognose-pipeline kunnen bedienen zonder terminal-kennis. De GUI omhult de CLI volledig — geen duplicatie van logica, alleen een schil die argumenten samenstelt en subprocessen aanstuurt.
Aanleiding
De pipeline heeft ~40 configuratieparameters verspreid over twee JSON-bestanden, meerdere inputbestanden en drie uitvoercommando's (standaard, benchmark, tune). Nieuwe gebruikers lopen vast op het instellen van paden, het begrijpen van weeknummer-ranges en het interpreteren van Excel-output. Een GUI verlaagt de drempel zonder de CLI-workflow te breken.
Gekozen framework: NiceGUI
uv-workflow, geen JS-kennis nodigui.htmluv run --extra gui python gui/app.py— één commandoArchitectuur
De GUI roept
subprocess.Popenaan op de bestaandestudentprognose-CLI. Geen import van interne modules — de CLI is het contract.Gebruikersflow
Nieuwe gebruikers volgen de wizard lineair. Terugkerende gebruikers navigeren vrij via de zijbalk.
Branch-strategie
Al het GUI-werk verzamelt zich op
feat/gui— niet opmain. Pas als de volledige GUI werkend en getest is, gaatfeat/gui → mainin één PR.Conventie per sub-issue:
feat/guifeat/gui-{issuenr}-{korte-naam}feat/gui(nietmain)Sub-issues
Fundament (eerst)
Wizard-stappen
studentprognose initvia stappenplanconfiguration.jsonbewerkbaarUitvoeren & resultaten
Geavanceerd (later)
Later toegevoegd
Afronden
Wanneer alle sub-issues afgevinkt zijn en de GUI lokaal end-to-end werkt:
feat/guirebasen op de nieuwstemainfeat/gui → mainBuiten scope