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.

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