Backend
Mobile
Nov 2024 – May 2025
Full-Stack · NestJS · React Native · Expo
BookMyBarber is a full-stack online appointment booking platform built for barbershops, hair salons, nail salons, and any service business that operates on a reservation model. I designed and built the entire system end to end - from the database schema and API, to the mobile app running on iOS and Android.
The platform handles real-world booking complexity: role-based access for clients, workers, and admins; automated reminders via push and email; a loyalty points system with tier progression; and recurring appointment scheduling - all running on a background-job architecture that requires zero manual intervention.
Online booking 24/7 up to 30 days ahead. Only available slots shown per worker, per day. Cancellation enforced by configurable cutoff hours.
Clients request repeating schedules (weekly, bi-weekly, monthly). After admin approval, a nightly cron job auto-generates bookings - no manual work.
Points earned per completed appointment. Redeemable for discounts (1 pt = 10%). Four tiers: Bronze, Silver, Gold, Platinum - with push notifications on level-up.
Hourly cron checks upcoming appointments and sends push + email reminders at 12h, 1h, and 30min before. Deduplication prevents double notifications.
Full dashboard with revenue stats, worker management, service configuration, time-off approvals, and complete booking control across all workers.
Admin sets business name, primary color, and logo. All email templates and in-app UI adapt automatically. Bilingual support: English and Serbian.
Built with NestJS 11 and TypeScript following a strict module-per-domain architecture. Each domain (auth, booking, loyalty, review, worker-schedule, etc.) is a self-contained NestJS module with its own controller, service, and repository layer over MySQL via TypeORM.
Email delivery is fully async - jobs are enqueued via Bull Queue (Redis) and processed by a background MailProcessor using Handlebars templates. In development, all mail is caught locally. Push notifications are sent via Expo Push API. The API is documented with Swagger and protected by JWT + Passport with role-based guards.
Two background cron jobs run automatically: an hourly reminder job that scans upcoming bookings and fires push + email notifications at the right intervals, and a nightly recurring-booking generator at 02:00 that creates next-occurrence appointments for all approved recurring schedules.
The mobile app is built with React Native and Expo SDK 54, using Expo Router v4 for file-based routing. State management is split between Zustand (auth, theme, locale) and TanStack Query v5 for all server state, caching, and pagination.
All forms are validated with React Hook Form + Zod. JWT tokens are persisted in expo-secure-store with an Axios interceptor handling automatic refresh on 401. The app routes users to role-specific tab navigators on login - client, worker, and admin each have a distinct interface with the exact capabilities their role requires.
The app supports English and Serbian via react-i18next, and all visual theming (colors, business name) is loaded from the company settings API on boot - making it effectively white-label ready.
Browses workers and services, books appointments, tracks loyalty points, manages recurring schedules, and leaves post-service reviews.
Manages own schedule, breaks, and time-off requests. Views and actions bookings (confirm, complete, no-show). Maintains a portfolio of work images with categories.
Full platform access - manages all workers, services, and bookings. Approves time-off and recurring requests. Configures business branding, booking rules, and financial settings.
Backend
Mobile