ANU Room Booking
Sign in

ANU Room Booking

Find a free room or study desk at ANU Acton on a 3D map of the real campus, and book it without leaving the map. Your booking is still there after a reload, a redeploy, and everyone else’s bookings.

This is a COMP4020 prototype, not an ANU service. Nothing in it books a real room.

Try it

  1. Sign in as u1000001 with the password anu-acton. Any uni ID shaped like u1234567 works too: the first time one is used, it keeps whatever password you type.
  2. Pick a building. Its storeys fan apart.
  3. Pick a level. The camera swings overhead onto the floor: a run of meeting rooms and a lab or two with their numbers on, grey stair and lift cores, and open study space with pods of desks.
  4. Pick a room or a desk. Its day opens in a dialog in front of the map. Choose a start and end time, and book.
  5. Reload, or open My bookings. It’s still there, and you can cancel it from either place.

The sign-in page lists three more demo people, u1000002 to u1000004, on the same password. Their roles (student, tutor, facilities) are labels only; everyone books the same way.

A panel floats on the map, as a sidebar on a desktop and a sheet along the bottom of a phone. It lists the same buildings, levels and rooms, and filters the campus by seats and by what a room needs: a whiteboard, a projector, video conferencing, quiet, or accessibility. Asking for 2 seats or more leaves the desks out. On a level, each room has a row with its day drawn out. Desks are grouped by study area: each area folds to one line saying how many are free, and opens to a grid of desk numbers. Point at a row or a desk and the thing it names lights up on the map. Everything opens 08:00 to 20:00 in half hours, and a booking runs up to three hours, up to two weeks ahead.

Why a map

The hard part of booking a room isn’t the form. It’s the question before it: where is there a free room near me, right now? The systems I’ve used answer that with a dropdown of building names and a table of results, so you already have to know that Marie Reay has small rooms and Chifley doesn’t, and nothing shows you that Hancock is packed this afternoon.

So the map is the whole window, and you drill down inside it instead of scrolling to a second copy of the page: campus, building, level, room. Each step is a real URL, so the back button, a reload and a shared link all land where you were.

Every building has its own colour, the same on the map, down the edge of its rows and across its floor plan. Saturation, a filled bar and a percentage show how free it is on the day you’re looking at. Hue says which building; fill says how free, so finding a room never depends on telling ten colours apart.

There’s a dark mode. It follows your device until you pick one with the sun or moon in the top bar, and then remembers. At night each building keeps its colour, lifted so it still stands out on a dark map.

What’s real and what isn’t

What good looks like here

Left out on purpose

How it’s checked

pnpm check runs a typecheck and the spec suite against the built server. The course template supplies spec/invariants.test.ts and spec/readme.test.ts: landmarks, headings, an axe-core accessibility floor on every route in spec/routes.ts, and this file served whole at /readme/. Mine:

What no test can tell me is whether the map is actually easier than a dropdown, or whether a camera flight reads as “one step further in” rather than motion for its own sake. That’s the crit’s call.

Running it

pnpm install
pnpm dev           # localhost:4321
pnpm check         # typecheck + the spec suite, against the built server

The database is one SQLite file: .data/app.db locally, a Fly volume in production. Migrations and the campus seed run at boot, so a fresh clone comes up as a working campus. To refresh the map from OpenStreetMap, run node scripts/fetch-campus.ts and commit what it writes to src/data/campus.ts.

Credits

Building footprints © OpenStreetMap contributors, licensed ODbL. 3D by three.js.