ANU Badminton Court Booking

A redesigned booking flow for ANU Sport’s badminton courts. A demo ANU student picks a date, time and hall, sees exactly which of the eight courts in that hall are free right now, taps one on a visual court map, and confirms a booking that’s checked and written straight to SQLite — with eligible weekday mornings automatically claiming the ANU Free Student Hour. My Bookings lists everything the student has on, and cancelling one immediately frees the court again.

What good looks like here

The brief in CLAUDE.md names one narrow slice of ANU Sport’s booking system — badminton courts only, one fixed demo student, no login, no payments — and asks for it to work end to end against a real database rather than being a static mockup. Good, for this prototype, means:

What I judged rather than had handed to me: the exact one-hour time slots (09:00–16:00, per CLAUDE.md’s example), the specific wording of the eligibility/pricing states (Free Student Hour / $0.00 vs. Student rate applies), and the decision to keep booking creation and cancellation as plain POST forms rather than adding a JSON API. spec/booking.test.ts is what’s enforced by CI: it drives the running app through creating a booking, rejecting a duplicate, granting the free hour once per week, and releasing a court on cancellation. Everything else — layout, colour, copy — is judgement that stayed inside the brief’s “no excessive animation” and “resemble a simple modern university sports booking system” guidance.