Study room finderPrototype

Study room finder

A study room finder for the ANU Library. When I book a room on LibCal, it shows a library’s rooms against the day’s hours and I scan the grid for a gap. Here you say how many of you there are, how long you need and when you’re free, and it lists the spaces that fit. You book with your ANU email and cancel from the Your bookings page.

This is a student prototype. The 81 spaces (mostly study rooms, booths and computer desks) and their usual hours were copied from anu.libcal.com in September 2026, but nothing here books a real room, and a space free here may be taken there. To book one, use LibCal. There’s no sign-in: anyone who types your email can see and cancel your bookings.

What good looks like here

It answers the question I walk in with: three of us, an hour, free after lunch, where can we go? The answer is a short list, earliest first. For each start time it shows the smallest space that fits, so two people don’t get Chifley’s eight-seat Deck, and says how many others are free then.

The Library’s rules hold. LibCal publishes four: two hours a day, up to two weeks ahead, an ANU email, and only while the library is open. I added three: half-hour slots, no overlaps, and no more people than the room holds. Here one two-hour limit covers rooms, desks and booths together. The Library limits them separately. The date rules, nothing in the past and nothing past 14 days, need today’s date in Canberra, so they live in the app. The database refuses the rest itself, as CHECKs in src/lib/schema.ts and triggers in drizzle/0002_booking_rules.sql, so no page can skip them. A refused booking says why.

The finder checks the same things. It leaves out anything that overlaps, doesn’t fit, falls outside opening hours or the dates you can book, or goes past what’s left of your two hours that day. It doesn’t check that the email is an ANU one. Booking does.

What I looked at

LibCal for the spaces, the hours and its published limits. Airbnb and OpenTable for a search bar that asks a few questions at once.

What I didn’t build

What’s checked, and what’s judged

My tests, spec/booking.test.ts and spec/finder.test.ts, drive the running app over HTTP: six of the refusals (overlap, daily limit, capacity, opening hours, too far ahead, non-ANU email), cancelling, cancelling with someone else’s email, the finder’s order, one space per start time, a booked slot disappearing, and the minutes left that day. Half-hour slots, a single booking over two hours and times in the past have no test yet. The course template’s tests check each page’s structure and run a basic accessibility scan.

Whether the space it picks is the one you’d pick, and whether the pages read clearly on a phone, are judgement calls. I checked those by booking and cancelling in a browser at phone and desktop widths.