Dubai's easiest move β premium moving & packing services website.
A full-featured, production-ready website for a Dubai-based movers and packers service. Customers can browse services, create bookings with photo uploads, track their order status, and reach out via a contact form. Admins manage all bookings through a dedicated dashboard. No payment gateway β cash on delivery model.
| Category | Details |
|---|---|
| Landing Page | Hero with optional video background, services showcase, process steps, testimonials marquee, trust logos, call-to-action sections |
| Booking System | Multi-step booking form with date, time, addresses, photo uploads, and Auth0 login |
| Order Tracking | Real-time booking status tracker (Pending β Confirmed β In Transit β Delivered) |
| Address Input | Interactive Leaflet map with pin selection + optional Google Places autocomplete |
| Email Notifications | Booking & contact form submissions emailed to admin via Resend |
| Admin Dashboard | Protected panel to view, filter, and manage all bookings with photo gallery & status updates |
| Animations | GSAP-powered animations, Lenis smooth scrolling, split-text reveals, magnetic hover effects, route transitions |
| Contact Page | Contact form with serverless email delivery |
| SEO | React Helmet for per-page meta tags, Open Graph support, semantic HTML |
| Dark/Light Mode | Theme toggle powered by next-themes |
| Responsive | Mobile-first design with sheet navigation on smaller screens |
| Technology | Purpose |
|---|---|
| React 19 | UI library |
| TypeScript 6 | Type safety |
| Vite 8 | Build tool & dev server |
| React Router 7 | Client-side routing with lazy-loaded pages |
| Tailwind CSS 3.4 | Utility-first styling |
| shadcn/ui + Radix UI | Accessible component primitives |
| GSAP 3.15 | Scroll-triggered animations & motion |
| Lenis | Smooth scroll experience |
| Leaflet | Interactive map for address selection |
| React Hook Form + Zod | Form handling & schema validation |
| Lucide React | Icon system |
| Sonner | Toast notifications |
| canvas-confetti | Booking confirmation celebration effect |
| Technology | Purpose |
|---|---|
| Vercel Serverless Functions | API endpoints (/api/send-booking, /api/send-contact) |
| Resend | Transactional email delivery |
| Supabase | Database, auth & storage (admin panel) |
| Auth0 | Customer authentication for bookings |
Movers-main/
βββ api/ # Vercel Serverless Functions
β βββ send-booking.ts # Booking email handler
β βββ send-contact.ts # Contact form email handler
βββ public/ # Static assets
β βββ favicon.svg
β βββ icons.svg
βββ src/
β βββ components/
β β βββ admin/ # Admin components
β β β βββ BookingDetailView.tsx
β β β βββ BookingPhotoGallery.tsx
β β β βββ RequireAdmin.tsx
β β β βββ StatusPicker.tsx
β β βββ forms/ # Form components
β β β βββ AddressMapSelectInput.tsx # Leaflet map picker
β β β βββ GooglePlacesInput.tsx # Google Places autocomplete
β β βββ layout/ # Layout shells
β β β βββ AdminLayout.tsx
β β β βββ Footer.tsx
β β β βββ Navbar.tsx
β β β βββ PublicLayout.tsx
β β βββ motion/ # Animation utilities
β β β βββ Magnetic.tsx # Magnetic hover effect
β β β βββ RouteTransition.tsx
β β β βββ SmoothScroll.tsx # Lenis wrapper
β β β βββ SplitText.tsx # GSAP text reveal
β β βββ sections/home/ # Landing page sections
β β β βββ Hero.tsx
β β β βββ ServicesSection.tsx
β β β βββ ProcessSection.tsx
β β β βββ WhyChooseUsSection.tsx
β β β βββ TestimonialsMarquee.tsx
β β β βββ TrustLogosSection.tsx
β β β βββ FinalCtaSection.tsx
β β βββ seo/ # SEO meta component
β β βββ theme/ # Theme toggle (dark/light)
β β βββ ui/ # shadcn/ui components (16 components)
β βββ hooks/
β β βββ useBookings.ts # Supabase bookings hook
β βββ lib/
β β βββ admin-utils.ts # Admin helper functions
β β βββ booking.ts # Booking utilities
β β βββ gsap.ts # GSAP registration
β β βββ supabase.ts # Supabase client
β β βββ utils.ts # General utilities (cn)
β βββ pages/
β β βββ Home.tsx
β β βββ Services.tsx
β β βββ About.tsx
β β βββ Faq.tsx
β β βββ Contact.tsx
β β βββ Booking.tsx
β β βββ Track.tsx
β β βββ admin/
β β βββ AdminLogin.tsx
β β βββ AdminPanel.tsx
β βββ types/ # TypeScript type definitions
β βββ App.tsx # Root component & routes
β βββ main.tsx # Entry point
β βββ App.css
β βββ index.css
βββ supabase/
β βββ schema.sql # Database schema
βββ .env.example # Environment variable template
βββ vercel.json # Vercel rewrites config
βββ tailwind.config.cjs
βββ vite.config.ts
βββ tsconfig.json
βββ package.json
- Node.js β₯ 18
- npm (comes with Node.js)
git clone https://github.com/your-username/movers-packers-dubai.git
cd movers-packers-dubai
npm installcp .env.example .envFill in the required values (see Environment Variables below).
npm run devThe app will be available at http://localhost:5173.
| Variable | Required | Description |
|---|---|---|
VITE_AUTH0_DOMAIN |
β | Auth0 tenant domain (e.g. your-app.auth0.com) |
VITE_AUTH0_CLIENT_ID |
β | Auth0 application Client ID |
VITE_AUTH0_AUDIENCE |
β | Auth0 API audience identifier |
VITE_SUPABASE_URL |
β | Supabase project URL (admin panel only) |
VITE_SUPABASE_ANON_KEY |
β | Supabase anonymous key (admin panel only) |
VITE_GOOGLE_PLACES_API_KEY |
β | Google Places API key (enables address autocomplete) |
VITE_HERO_VIDEO_SRC |
β | Hero section background video URL |
VITE_HERO_VIDEO_POSTER |
β | Hero section video poster image URL |
| Variable | Required | Description |
|---|---|---|
RESEND_API_KEY |
β | Resend API key for sending emails |
BOOKING_EMAIL_TO |
β | Admin email(s) to receive bookings (comma-separated) |
BOOKING_EMAIL_FROM |
β | Verified sender address in Resend |
Important
Server-side variables (RESEND_*, BOOKING_*) must be set in Vercel β Project β Settings β Environment Variables, not in .env.
The booking and contact forms send emails via Resend through Vercel Serverless Functions.
| API Endpoint | Function File | Purpose |
|---|---|---|
POST /api/send-booking |
api/send-booking.ts |
Sends booking details to admin |
POST /api/send-contact |
api/send-contact.ts |
Sends contact form messages to admin |
- Create a Resend account
- Verify your domain and create a sender address
- Copy your API key
- Add
RESEND_API_KEY,BOOKING_EMAIL_TO, andBOOKING_EMAIL_FROMin Vercel environment variables
Tip
For testing, you can use onboarding@resend.dev as the BOOKING_EMAIL_FROM sender.
Customers must log in before creating a booking. Authentication is handled by Auth0.
- Create an Auth0 application (Single Page Application)
- Set Allowed Callback URLs, Allowed Logout URLs, and Allowed Web Origins to your domain
- Copy the Domain and Client ID to your
.envfile
The admin panel uses Supabase for database, authentication, and file storage. This is optional β the public-facing website works without it.
-
Create a new Supabase project
-
Run the database schema in the SQL editor:
-- Paste contents of supabase/schema.sqlSchema file:
supabase/schema.sql -
(Optional) Create a Storage bucket named
booking-photosfor photo uploads -
Create an admin user:
-- After creating/signing-in a user in Supabase Auth, find their UUID and run: UPDATE public.profiles SET is_admin = true WHERE id = '<USER_UUID>';
-
Add
VITE_SUPABASE_URLandVITE_SUPABASE_ANON_KEYto your.env -
Access the admin panel at
/admin/login
This project is configured for deployment on Vercel.
- Push your code to a Git repository (GitHub / GitLab / Bitbucket)
- Import the project in Vercel
- Add all server-side environment variables in Vercel settings
- Deploy β Vercel will auto-detect the Vite framework
The vercel.json handles:
- API routes β Serverless Functions (
/api/*) - All other routes β
index.html(SPA fallback)
| Command | Description |
|---|---|
npm run dev |
Start Vite dev server |
npm run build |
Type-check & build for production |
npm run preview |
Preview production build locally |
npm run lint |
Run ESLint |
| Path | Page | Auth |
|---|---|---|
/ |
Home (landing page) | Public |
/services |
Services overview | Public |
/about |
About us | Public |
/faq |
Frequently asked questions | Public |
/contact |
Contact form | Public |
/booking |
Booking form | Auth0 login |
/track |
Order tracking | Public |
/admin/login |
Admin login | Supabase Auth |
/admin |
Admin dashboard | Admin only |
This project is private and proprietary.