Unofficial University of Basel MSc Data Science curriculum planner.
Short handle: BaselCal (baselcal.vercel.app). The longer name is for search — people looking for Uni Basel, MSc Data Science, ECTS, or Vorlesungsverzeichnis.
Plan four semesters, check official 2026 credit rules, spot timetable clashes, and export ICS / JSON. This is not an official University of Basel tool. Always verify CP rules, module membership, and offerings in the Vorlesungsverzeichnis before you enrol.
Live demo: baselcal.vercel.app
BaselCal is evolving from a single-programme DS planner into a degree-pack architecture. Phase 1 ships the foundation without changing Data Science validation behaviour.
- Header programme switcher — pick MSc Data Science, Computer Science, or Mathematics. Only Data Science is fully enabled today.
- Computer Science & Mathematics — visible in the switcher as Coming soon (pack manifests registered; rules and VV data land in Phase 2/3).
- Pack layout — each programme has
degrees/<id>/manifest.jsonandrules.json; the app loads packs viasrc/degrees/. Plans are stored per programme (basel-plan-v7:<id>). degree_rules.json— mirrors DS pack CP targets fornpm run validate(Node). Source of truth:degrees/data-science/rules.json.
The public demo is a sandbox. Anyone can drag courses, load the example outline, and export a plan. Owner login (no signup) unlocks a private overlay stored in Vercel env vars — that JSON is not shipped in the client bundle.
| Board with example outline | Timetable |
|---|---|
![]() |
![]() |
| Course discovery | Owner login |
|---|---|
![]() |
![]() |
Refresh screenshots with DOCS_SHOTS=1 npx playwright test tests/docs-shots.spec.ts.
npm install
npm run devDev server: http://localhost:5179
The board starts empty. Drag courses from the catalog, or click Load example outline for a sample 120 CP Master’s plan (no admission / Auflagen courses).
Admission conditions (Auflagen), your real plan, and an optional home pin are not part of the public default.
-
Copy the example config:
cp config/student.example.json config/student.local.json
-
Edit
config/student.local.json:admissionTarget— integer CP from your Zulassungsbescheid (0if none; official ceiling 30, above excluded)seedPlan—trueto fill the board on first visitplan/allocations— course IDs per semesterhome— optional map pin (lat/lng); leave null to set it in the browser
-
Restart
npm run dev. The file is gitignored.
Optional: set UNICAL_URL in a local .env (see .env.example) to your UniCal calendar link. With seedPlan: true, Sem 1 is filled from that link’s event ids. On Vercel, set UNICAL_URL as a server env var (returned only after owner unlock — never VITE_*).
Anyone can also use Import UniCal in the header: paste a UniCal ?e=… link to replace Sem 1. The timetable week picker hides sessions outside each course’s first/last meeting dates.
On Vercel, keep STUDENT_CONFIG as a server env var (used only by /api/unlock). Also set PLANNER_USER and PLANNER_PASSWORD. Do not commit them. Public builds never bake that JSON into JavaScript.
You can also change Auflagen CP in the header at any time; that value is stored only in this browser.
npm run validate # catalog CP rules + example outline + time/room vs VV snapshot
npm run validate:details # title, CP, times, rooms vs saved VV snapshots
npm run validate:details:live # same checks against live Vorlesungsverzeichnis
npm run validate:details:plan # only example outline + local student plan
npm run audit:modules # refresh the Fall 2026 module-tree snapshot
npm run refresh:catalog # scrape every catalog VV page and apply times/rooms
npm run audit:catalog # scrape every catalog VV page, snapshot only
npm test
npm run buildOfficial MSc Data Science 2026 targets (pack: degrees/data-science/rules.json; mirrored in degree_rules.json for validate):
| Bucket | Rule |
|---|---|
| Mathematical Foundations | min 18 CP |
| Machine Learning Foundations | min 18 CP |
| Systems Foundations | min 18 CP |
| Foundations combined | min 64 CP |
| Electives in Data Science | exactly 20 CP |
| Thesis block | exactly 36 CP |
| Master's total | exactly 120 CP |
| Admission (Auflagen) | your letter (integer 0–30, default 0; above 30 excluded) |
Grand total = 120 + Auflagen only. Admission CP never fills Math / ML / Systems / Electives / Thesis. Exact buckets fail on overshoot.
- CONTRIBUTING.md
- DATA.md — catalog and VV sources
- agent.md — domain rules for contributors




