ubseats
full-stack developer · mar 2025 — ongoing · vancouver, bc
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 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
Filtering that narrows the map
Room-level detail
Live hours
Bookmarking
The Hard Parts
15-minutes pipeline on fetching library bookings
Web-scraping for classroom availability
Full Architecture

| Layer | Choice |
|---|---|
| Frontend | React, Tailwind, shadCN/ui |
| Client state | a hand-rolled store |
| Server state | TanStack Query |
| Mapping | Mapbox GL |
| Data | Supabase (Postgres) |
| Hosting | Vercel |
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.
