Skip to content
JNP
All projects

Case study · 2026

LibSpace

Library Discussion Room Reservation System

A room-reservation app for the Holy Angel University library. Students check real-time availability of the discussion rooms and request one remotely; front-desk staff approve requests, check groups in and manage rooms and opening hours.

libspace-flax.vercel.app
LibSpace sign-in screen with the sign-in form centred over a green-tinted photograph of the Holy Angel University library.

The problem

Discussion rooms were reserved through a physical logbook at the library, so students couldn't see what was free without going there. LibSpace replaces the logbook with a live availability grid and a request-and-approve flow.

What it does

  • Rooms-by-half-hour availability grid for the chosen day, updated in real time.
  • Booking requests with group size and a photo of each member's student ID; staff approve or decline and the student is notified in the app.
  • Front-desk check-in and check-out, with rooms nobody claims within the grace period released to other students.
  • Staff tools to add, edit and retire rooms, set opening hours per room and weekday, and block time for maintenance.
  • Library rules — grace period, booking limits, hours per day, how far ahead booking opens — editable by staff.
  • One layout for phone and desktop: a tab bar on small screens, a side rail on large ones.

Engineering decisions

Double-booking is rejected by the database
A GiST exclusion constraint in Postgres refuses overlapping reservations for the same room. Two requests racing for a slot can't both win, which the UI alone could not guarantee.
Rules live in triggers, not the client
The library's booking rules are enforced by a database trigger, and the student email restriction is a check constraint, so a forged client can't skip them.
ID photos stay private
Student ID photos go to a private storage bucket where each user can only write to their own folder, and they are shown through short-lived signed URLs rather than public links.
Staff accounts can't be self-assigned
Everyone signs up as a student. An account becomes staff only when the role is changed directly in the database.
One declared list drives both navigations
Every view is declared once and rendered as a side rail on desktop and a tab bar on phones, so a view can't appear in one and go missing in the other.

My contribution

I developed the reservation system for the library's 10 discussion rooms, including live availability, student bookings and staff approvals. I prevented overlapping bookings with a PostgreSQL exclusion constraint, automated booking limits, notifications, check-in/check-out and no-show releases, and protected student ID photos with private storage, per-user access policies and signed URLs.

Technologies

  • React 19
  • Vite
  • Tailwind CSS 4
  • Supabase (Postgres, Auth, Realtime, Storage)
  • Row Level Security
  • Vercel