Project 12AI engineering

ECTS Ledger

An unofficial semester planner for the University of Vienna MSc Mathematics: a static page with no build step, fed by a Python client for the XML backend behind u:find, with module caps, date-level clash detection and an exam backlog.

Status
Public repo · MIT · live site
Role
Solo: planner, u:find client, tests and deployment
Period
2026
Stack
Vanilla JavaScript · Python · Beautiful Soup · GitHub Actions and Pages · pytest and node:test

The problem

The MSc Mathematics curriculum asks for 120 ECTS: 90 ECTS of coursework spread over four capped modules (ML1 30, ML2 30, MSE 8, MEL 22), the Master’s thesis (27) and the Defensio (3). u:find lists each semester’s courses, but it does not tell you how a selection fills those modules, whether two courses really clash when many slots run only every other week, or which exams are still open.

What I built

  • Planner. A static page with no framework that allocates ECTS into the module caps. Graded courses claim caps first, and overrides are limited to the course’s own module or MEL. Your plan stays in your browser.
  • u:find client. A Python client for the undocumented XML backend behind u:find, using the endpoints found in the web app’s own scripts. No catalogue ECTS value, timetable slot or exam date is typed in by hand.
  • Clash detection. Each slot stores its cadence and its real meeting dates, so fortnightly slots that interleave are not flagged.
  • Self-updating deployment. GitHub Actions rebuilds and validates the catalogue weekly and redeploys GitHub Pages.

Results

operations
137course documents fetched by a full catalogue rebuild, in 3.1–5.3 s (seven local runs; network-bound)
count
71automated tests: 45 pytest and 26 node:test
evidence
90%of course documents must arrive, or the generator refuses to write a catalogue

The catalogue of 8 Nov 2026 has 52 courses for 2026S and 57 for 2026W, and a fresh rebuild reproduced it exactly. The planner is unofficial and not affiliated with the University of Vienna.