ANU Library room booking

A cross-library group study room booking prototype. Right now, checking room availability at ANU Library means visiting four separate LibCal pages (one per library); you have to log in with ANU SSO before you can see availability, and room details sit behind a per-room “Info” button. The booking rules — LibCal’s page says you can book “up to two hours a day” and “up to two weeks in advance” — exist only as text on the page: nothing tells you a booking would break them until you try. This app puts every room from all four libraries — Chifley, Hancock, Menzies, Law — in one filterable grid, greys out anything you can’t book, lets you book a free slot with just a name and email, and takes you straight to your bookings afterwards, where you can cancel. No login is required to browse or to book.

What good looks like here

Good, here, means the booking rules are enforced by the server and the database — not just by the UI — and that they hold under HTTP requests made directly against the API, not only through the rendered forms:

These rules, and the tests that hold them to it end-to-end over HTTP (booking, rejecting a double-booking, rejecting a third hour, rejecting an out-of-window or already-started slot, and cancelling), live in src/lib/bookings.ts and spec/bookings.test.ts. The invariants in spec/invariants.test.ts (one heading, a nav landmark, a real title, an accessibility floor) are the supplied baseline and apply to every page, including the new ones.

What I chose not to build: no SSE/live updates across tabs (the spec only needed reload-persistence, not multi-client sync); no admin view of all bookings; no email confirmation. All out of scope for a one-week prototype.

Known limitations