Badr

Hairsalon booking

Reservation system with email confirmations and a protected barber dashboard.

The Blade barbershop homepage with a Book your appointment button

Problem

Many barbers handle appointments manually through WhatsApp or phone calls. This works for a small number of clients, but becomes difficult to manage as bookings grow. It's also inconvenient for the customer, who has to call during opening hours and wait for a confirmation. A reservation system solves both problems.

Approach

Just like my previous project, I took a documentation-first approach, writing a project description and determining the MVP before touching any code. This time I also introduced feature spec files: documents that describe each feature with a user story and acceptance criteria. This made it easy to know exactly when a feature was finished without adding unnecessary extras.

For the stack I used Supabase as my Postgres database, storing reservations and a rate limits table to prevent spam. For email notifications I used Resend, which allowed me to send templated emails to both the customer and barber whenever a booking was made.

Challenge

I spent a lot of time debugging an issue with Row-Level Security (RLS) in Supabase. After enabling it, my queries stopped working, but instead of throwing an error, they just returned an empty array. The lesson: always plan your RLS policies before building the database layer.

Result

The end result is a fully working reservation system with an intuitive protected dashboard. Customers can book their preferred timeslot, and the barber receives a notification with the details. From the dashboard, the barber can view all reservations, filter by status or date, and cancel bookings when necessary.

Reservation form with name, phone, email, service, date and timeslot fields
Barber dashboard listing reservations by date and timeslot, with status and date filters