A fully production-ready, modern, responsive website for KTOUR Media Production, specializing in Google 360Β° virtual tours, 360Β° photos, 360Β° videos, and media creation services.
- Home Page with 360Β° video hero background
- About Page with company story, mission, vision, and timeline
- Services Page with detailed service offerings
- Portfolio/Albums Gallery with 360Β° media viewer
- Contact Page with working contact form
- Get a Quote Modal accessible throughout the site
- Fully responsive design (mobile, tablet, desktop)
- Smooth animations with Framer Motion
- Glassmorphism UI effects
- Secure Firebase Authentication (Email: ktour@world.com, Password: ktour@58575)
- Dashboard Overview with statistics
- Album Management:
- Create albums with title and thumbnail
- Edit album details
- Delete albums
- Upload multiple 360Β° images and videos to albums
- View and manage all media in albums
- Contact Requests Management with status tracking
- Quote Requests Management with status tracking
- Modern, intuitive admin interface
- Automatic email notifications to ktour58575@gmail.com for:
- Contact form submissions
- Quote requests
- Professional HTML email templates
- Interactive 360Β° image viewer using PhotoSphere Viewer
- 360Β° video playback support
- Fullscreen viewer with navigation
- Drag and gyroscope support
- Frontend: Next.js 15 (App Router)
- Styling: Tailwind CSS v4
- Animations: Framer Motion
- UI Components: Shadcn/UI
- Backend: Firebase
- Authentication
- Firestore Database
- Storage
- Email: Nodemailer
- 360Β° Viewer: Photo Sphere Viewer
- Form Validation: React Hook Form + Zod
-
Clone the repository
git clone <repository-url> cd ktour-website
-
Install dependencies
npm install
-
Configure environment variables
The
.env.localfile has been created with placeholders. Update it with your Firebase and email credentials:# Firebase Configuration NEXT_PUBLIC_FIREBASE_API_KEY=your_api_key_here NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=your_project_id.firebaseapp.com NEXT_PUBLIC_FIREBASE_PROJECT_ID=your_project_id NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=your_project_id.appspot.com NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=your_messaging_sender_id NEXT_PUBLIC_FIREBASE_APP_ID=your_app_id # Email Configuration EMAIL_USER=ktour58575@gmail.com EMAIL_PASS=your_gmail_app_password_here # Admin Email for Notifications ADMIN_EMAIL=ktour58575@gmail.com
- Go to Firebase Console
- Click "Add Project"
- Follow the setup wizard
- In Firebase Console, go to Authentication
- Click "Get Started"
- Enable Email/Password sign-in method
- Create an admin user:
- Email:
ktour@world.com - Password:
ktour@58575
- Email:
- Go to Firestore Database
- Click "Create Database"
- Choose Production mode (or Test mode for development)
- Select your region
The following collections will be created automatically:
albums- Stores album informationmedia- Stores 360Β° images and videoscontactRequests- Stores contact form submissionsquoteRequests- Stores quote form submissions
- Go to Storage
- Click "Get Started"
- Choose security rules (start in test mode for development)
The app will create these folders automatically:
thumbnails/- Album thumbnailsimages/- 360Β° imagesvideos/- 360Β° videos
- Go to Project Settings (gear icon)
- Scroll down to "Your apps"
- Click the web icon (
</>) - Register your app
- Copy the configuration values to your
.env.localfile
- Go to your Google Account settings
- Enable 2-Factor Authentication
- Go to Google App Passwords
- Select "Mail" and "Other (Custom name)"
- Name it "KTOUR Website"
- Copy the generated 16-character password
- Add it to
.env.localasEMAIL_PASS
npm run devOpen http://localhost:3000 in your browser.
npm run build
npm startktour-website/
βββ src/
β βββ app/
β β βββ page.tsx # Home page
β β βββ about/page.tsx # About page
β β βββ services/page.tsx # Services page
β β βββ portfolio/
β β β βββ page.tsx # Portfolio gallery
β β β βββ [id]/page.tsx # Single album viewer
β β βββ contact/page.tsx # Contact page
β β βββ admin/
β β β βββ page.tsx # Admin dashboard
β β β βββ login/page.tsx # Admin login
β β β βββ albums/page.tsx # Album management
β β β βββ contacts/page.tsx # Contact requests
β β β βββ quotes/page.tsx # Quote requests
β β βββ api/
β β β βββ send-contact-email/ # Contact email API
β β β βββ send-quote-email/ # Quote email API
β β βββ layout.tsx # Root layout
β β βββ globals.css # Global styles
β βββ components/
β β βββ Navigation.tsx # Main navigation
β β βββ Footer.tsx # Footer component
β β βββ GetQuoteModal.tsx # Quote modal
β β βββ Viewer360.tsx # 360Β° viewer
β β βββ ui/ # Shadcn UI components
β βββ contexts/
β β βββ AuthContext.tsx # Firebase auth context
β βββ lib/
β βββ firebase.ts # Firebase configuration
βββ .env.local # Environment variables
βββ package.json
-
Login: Navigate to
/admin/login- Email:
ktour@world.com - Password:
ktour@58575
- Email:
-
Create Album:
- Go to Albums page
- Click "Add Album"
- Enter title and select thumbnail
- Click "Create Album"
-
Upload Media to Album:
- Click "Media" button on any album
- Select multiple 360Β° images or videos
- Click "Upload Files"
-
Manage Requests:
- View contact requests in Contacts page
- View quote requests in Quotes page
- Update status: New β In Progress β Closed
- Browse portfolio at
/portfolio - Click any album to view 360Β° media
- Click individual media items for fullscreen 360Β° viewer
- Use "Get a Quote" button to request services
- Fill contact form on
/contactpage
- Admin routes are protected with Firebase Authentication
- All form submissions are validated with Zod schemas
- Email credentials are stored in environment variables
- Firebase Security Rules should be configured appropriately
- Push your code to GitHub
- Connect your repository to Vercel
- Add environment variables in Vercel dashboard
- Deploy!
The app can be deployed to any platform that supports Next.js:
- Netlify
- AWS Amplify
- Google Cloud
- Azure
Remember to set all environment variables on your hosting platform.
| Variable | Description | Example |
|---|---|---|
NEXT_PUBLIC_FIREBASE_API_KEY |
Firebase API Key | AIza... |
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN |
Firebase Auth Domain | project.firebaseapp.com |
NEXT_PUBLIC_FIREBASE_PROJECT_ID |
Firebase Project ID | my-project |
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET |
Firebase Storage Bucket | project.appspot.com |
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID |
Firebase Messaging Sender ID | 123456789 |
NEXT_PUBLIC_FIREBASE_APP_ID |
Firebase App ID | 1:123... |
EMAIL_USER |
Gmail address for sending emails | ktour58575@gmail.com |
EMAIL_PASS |
Gmail app password | abcd efgh ijkl mnop |
ADMIN_EMAIL |
Email to receive notifications | ktour58575@gmail.com |
- Verify all Firebase environment variables are correct
- Check Firebase project settings
- Ensure Firestore and Storage are enabled
- Verify Gmail app password is correct
- Check Gmail 2FA is enabled
- Verify EMAIL_USER and EMAIL_PASS in .env.local
- Check media URL is accessible
- Verify file format (JPEG/PNG for images, MP4 for videos)
- Check browser console for errors
- Verify admin user exists in Firebase Authentication
- Check credentials:
ktour@world.com/ktour@58575 - Clear browser cache and try again
For support or questions:
- Email: ktour58575@gmail.com
- Admin Login: ktour@world.com
All rights reserved Β© 2024 KTOUR - Kosmos Media Production
Built with β€οΈ for KTOUR Media Production

