The Problem
Salon owners need a simple, web‑based system to let customers book appointments, track service usage, and manage staff, locations, and promotions. Existing solutions are either too generic or require costly SaaS subscriptions, leaving small salons without a tailored, self‑hosted option.
What This Does
The repository implements a full‑stack booking and CRM application for the fictional “Salon Bliss”. Core business logic lives in app/Models/ (e.g., Appointment.php, Service.php, Location.php) and the corresponding app/Http/Controllers/ such as CartController.php, UserController.php, and ServicesAPI.php.
User interface is built with the TALL stack: Blade views under resources/views/, Tailwind CSS in resources/css/app.css, Alpine.js in resources/js/app.js, and Livewire components in app/Http/Livewire/ (e.g., ManageAppointments.php, CreateService.php).
Authentication, role‑based access, and email notifications are provided by Laravel Jetstream, Fortify, and queued jobs (app/Jobs/SendAppointmentConfirmationMailJob.php, SendNewServicePromoMailJob.php).
All configuration files (config/*.php, .env.example) and database migrations (database/migrations/) are present, allowing the app to be built from a clean slate.
How To Use It
Setup (local development)
install PHP dependencies composer install
install front‑end assets npm ci
copy environment template and generate key cp .env.example .env php artisan key:generate
run migrations and seed basic data php artisan migrate --seed
Docker alternative (the repo ships a Dockerfile and docker-compose.yml): docker compose up -d --build the container runs php artisan serve on port 8000 by default
Configuration
Environment variables required are defined in .env.example (e.g., DBCONNECTION, MAILMAILER, QUEUECONNECTION). Adjust them before running migrations or the Docker compose file.
Running the app
Start the HTTP server: php artisan serve (or access the Docker‑exposed port). Start the queue worker to process email and analytics jobs: php artisan queue:work.
Testing the email flow (the README mentions Mailtrap) – set MAILHOST, MAILUSERNAME, etc., in .env to the Mailtrap credentials and run the queue worker.
Real‑World Use
A salon could deploy this on a modest VPS, point the domain to the Laravel app, and use the built‑in admin dashboard (app/Http/Controllers/AdminDashboardHomeController.php) to manage locations, services, and staff. When a new service is added via the Livewire component CreateService.php, the SendNewServicePromoMailJob queues an email to all customers, delivering promotion without blocking the request.
// Example: creating a service programmatically Service::create([ 'name' => 'Balayage', 'categoryid' => $categoryId, 'price' => 120, // other fields … ]); dispatch(new SendNewServicePromoMailJob($service));
Code Health & Issues
Medium – No automated tests – phpunit.xml exists but no tests/ directory; untested business logic. Medium – No CI/CD pipeline – No .github/workflows/ or other CI config; quality gates are absent. Medium – No LICENSE file – Legal reuse unclear; repository lacks explicit permission statement. Low – Hard‑coded role strings – Role validation in ValidateRole.php relies on literal names; could benefit from enum (app/Enums/UserRolesEnum.php already defined but not consistently used). Low – Duplicate Livewire file – app/Http/Livewire/ManageServices copy.php appears to be an accidental copy; may cause confusion. Low – Secrets not committed – .env.example is present, but actual credentials are omitted, which is appropriate.
No obvious security‑critical code smells were found; the app uses Laravel’s built‑in CSRF protection and request validation.
The Bottom Line
The repository delivers a complete, Laravel‑based booking and CRM system with a clean TALL‑stack UI and role‑based access. It is ready for deployment via Docker or traditional Laravel setup, but the lack of tests, CI, and a license limits its suitability for production use without additional investment in quality assurance and legal compliance. Ideal for educational purposes or as a starting point for a small‑to‑medium salon looking for a self‑hosted solution.