Project case study
RoomHub.
Internal Room Booking System
An internal classroom reservation system for students and administrators, split across separate backend and frontend repositories. The Java 25 backend handles multi-slot bookings, database-level concurrency protection, UTC-safe scheduling, and real-time notifications, and uses a Docker Compose and Nginx deployment setup. The public demo currently opens at the sign-in screen; authenticated workflows require an authorized account.
The problem
Multiple requests can compete for the same room and time range.
My contribution
Implemented reservation APIs, OAuth2/JWT authentication, RabbitMQ notifications, WebSocket updates, migrations, and delivery configuration.
Current scope
Personal software project. A live sign-in screen and source repositories are available; authenticated booking screens require an authorized account.
A decision in context.
Choice
Use database constraints and application-level version checks to help reject overlapping reservations and stale updates.
Verification
A k6 script covers concurrent booking writes and room reads. It is available in the source project, but no verified result report is available to publish.
Limits
No throughput, latency, or zero-error claim is published here without a matching test report and environment description.
Key takeaway
Handling overlapping bookings and local time requires more care than a calendar suggests.
Inside the project.

Project decisions
What went into
the project.
Multi-Slot Booking & Concurrency Protection
Students can request multiple consecutive slots in one transaction. The backend README describes database-level locks and atomic updates to protect availability and prevent two bookings from claiming the same room time.
UTC-Safe Scheduling & Automatic Follow-Up
Booking times are stored and processed in UTC, then presented in Vietnam time (GMT+7). ShedLock-protected background jobs handle missed check-ins and bookings awaiting administrator approval.
RabbitMQ & Real-Time Notifications
Booking status changes trigger notifications delivered to the interface over Spring WebSockets. RabbitMQ provides the message broker for asynchronous delivery.
Authentication & Frontend Foundation
The backend uses Spring Security with OAuth2/JWT. The React 18 and Vite frontend README documents a feature-based structure, typed Axios API client, Zustand auth state, TanStack Query, protected routing, and an implemented login module.
Bilingual UI & Delivery Setup
The system includes English and Vietnamese language support. The backend uses Flyway, Docker Compose, and Nginx, with deployment automation handled by GitHub Actions. Deployment and interface behavior can be explored through the source repositories and the sign-in demo.
Implementation
Tools & systems
- BE · Java 25
- BE · Spring Boot
- BE · PostgreSQL
- BE · Flyway
- BE · Redis
- BE · RabbitMQ
- BE · Spring WebSockets
- BE · Spring Security OAuth2 / JWT
- BE · Mailjet API
- BE · Docker / Compose
- BE · Nginx
- BE · GitHub Actions
- FE · React 18
- FE · Vite 5
- FE · TypeScript 5
- FE · Tailwind CSS 3.4
- FE · Axios
- FE · TanStack Query
- FE · Zustand
- FE · React Hook Form + Zod
- FE · React Router 6