ANU timetable planner (prototype)

What this is

ANU’s course-selection and timetable views are normally separate: you pick courses somewhere, then switch to a different view to see your week. This prototype removes that switch for one narrow interaction: choosing which courses you’re taking, and seeing your weekly timetable, live on the same page. Adding or removing a course from the selection updates the visible timetable immediately, without navigating anywhere else.

This is not ANU MyTimetable, and it does not integrate with ANU enrolment, ANU authentication, or Wattle. The course/activity catalogue it offers is controlled demo data invented for this prototype — it does not claim to reflect any actual current ANU course or session.

Activities and time choices

A selected course isn’t one block — it’s one or more activities (a Lecture, Tutorial, Lab, or Drop-in), and each activity is either:

An activity may offer more than one time. If it offers only one, there’s nothing meaningful to choose between, but selecting its course does not put it on your timetable by itself — it’s marked in the catalogue as a fixed activity that isn’t yet included, and stays that way until you press “Fill fixed activities”. That button persists every such activity, for every course you’ve selected, in one action, and tells you how many it just filled (or that there was nothing left to fill). If an activity offers several times, you pick one from an accessible set of choices next to the course in the catalogue instead — only the option you pick appears on the timetable, and picking a different one swaps it out immediately. Every choice, fixed or chosen, is saved through the server into SQLite, so it survives a reload exactly like the course selection itself.

Each course keeps one fixed colour, defined in the catalogue rather than generated in the browser, so it looks the same after every reload; every block for that course carries it, always alongside a text label such as DEMO1001 / Lecture / 10:00–11:00 — colour is a cue, never the only one.

Some activities are explicitly marked as allowed to overlap with others (a casual drop-in, say); most aren’t. If two blocks land in the same timetable slot and at least one of them isn’t allowed to overlap, both stay visible and the slot is labelled a clash rather than silently hiding either one.

What good looks like here

These are the contracts this prototype is judged against. Some are checked automatically by spec/; others are judgement calls a reader has to assess by using the app.

Mechanically enforced (checked by the test suite in spec/):

Judgement calls (not mechanically checked, assessed by looking):

Cross-tab updates may use this app’s existing server-sent-events channel, so that a change made in one open tab can appear in another. That behaviour is supporting, not the product’s main purpose — the primary contract is same-page feedback plus SQLite persistence, which works with only one tab open.

Out of scope

This prototype deliberately does not attempt: