Jake Fung

ubseats

Map-first study room finder for UBC Vancouver

  • TypeScript
  • React
  • Supabase
  • Mapbox

UBSeats is a map-first study spot finder for UBC Vancouver. Browse an interactive campus map, check live hours, and see room details before you head out the door, currently there are over 500 rooms across 50+ buildings.

The Origin Story

Last March, I was feeling the pressure of exams. I was frantically looking for a quiet study spot on campus, but everywhere was packed. At that time, I wondered if there was any app that could help me find study spots. Turns out there were none, so I was determined to build my own solution.

The first version of UBSeats, a list with filters

The first version was a list with filters. Lists are easy, and filters are easy, but the result was useless, the question a student actually asks is not "which spots are library, classroom, ...", it is "which spot is available and I can go to in 15 minutes".

What UBSeats Does

Here's what I think makes UBSeats stand out and be generally useful for students:

Map-first search

Search narrowing down the possible buidlings.

Filtering that narrows the map

A combined filter: study mode and room type, narrowing down the results.

Room-level detail

Clicking into a building to see room details.

Live hours

A glanceable view of room hours and availability.

Bookmarking

A bookmark system for favorite rooms.

The Hard Parts

15-minutes pipeline on fetching library bookings

Web-scraping for classroom availability

Full Architecture

The UBSeats architecture diagram
Architecture diagram
LayerChoice
FrontendReact, Tailwind, shadCN/ui
Client statea hand-rolled store
Server stateTanStack Query
MappingMapbox GL
DataSupabase (Postgres)
HostingVercel

What I Learned

  • The primary interaction decides the data model. Once the map was the app, every query had to return something plottable. That constraint made a lot of design decisions for me.
  • Split facts from opinions early. Spots and reviews looked like one table until filtering arrived; separating them cost an hour and saved a rewrite.
  • Perceived speed beats real speed. Diffing markers is not faster than re-rendering them, but it removes the blank frame, and the blank frame was the whole complaint.
  • Honest gaps beat fake data. Real-time occupancy is the most requested feature and the one I refuse to guess at.

Future plans

← back to work