Production-ready, responsive site for a fictional local tech repair shop.
- Framework: Next.js 14 (App Router) + TypeScript
- Styling: Tailwind CSS + shadcn/ui components
- Forms: React Hook Form + Zod validation
- Icons: lucide-react
- Email: Nodemailer with Gmail SMTP
- Authentication: JWT-based admin authentication
- SEO: JSON-LD structured data, sitemap, robots.txt
- ✅ Responsive design with mobile-first approach
- ✅ Contact and service request forms with email notifications
- ✅ Admin panel for content management
- ✅ SEO optimized with metadata and structured data
- ✅ Security hardened (XSS protection, rate limiting, secure headers)
- ✅ Performance optimized (image optimization, caching headers)
- Node.js 18+
- pnpm (recommended) or npm
# Install dependencies
pnpm install
# Set up environment variables
# Create .env.local with:
# [email protected]
# EMAIL_PASS=your-gmail-app-password
# ADMIN_USERNAME=admin
# ADMIN_PASSWORD=your-secure-password
# ADMIN_SESSION_TOKEN=your-random-secret-key
# NEXT_PUBLIC_SITE_URL=http://localhost:3000
# Run development server
pnpm dev
# Open http://localhost:3000# Build the application
pnpm build
# Start production server
pnpm start├── app/ # Next.js app router pages
│ ├── api/ # API routes
│ ├── admin/ # Admin panel
│ └── [pages]/ # Public pages
├── components/ # React components
│ └── ui/ # Reusable UI components
├── content/ # Content management (TypeScript)
├── lib/ # Utility functions
│ ├── admin-auth.ts # Admin authentication
│ ├── email.ts # Email functionality
│ └── html-escape.ts # Security utilities
└── public/ # Static assets
- Contact form sends emails via Gmail SMTP
- Service request form with ticket ID generation
- HTML escaping prevents email injection attacks
- JWT-based admin authentication
- Rate limiting on form submissions
- XSS protection with HTML escaping
- Security headers (CSP, X-Frame-Options, etc.)
- Content management system
- Protected routes with authentication
- Real-time content updates
Required environment variables:
# Email Configuration
EMAIL_USER=[email protected]
EMAIL_PASS=your-gmail-app-password
EMAIL_TO=[email protected] # Optional
# Admin Authentication
ADMIN_USERNAME=admin
ADMIN_PASSWORD=your-secure-password
ADMIN_SESSION_TOKEN=your-random-secret-key # Required!
# Site Configuration
NEXT_PUBLIC_SITE_URL=https://yourdomain.comThis project is configured for deployment on Vercel:
- Push code to GitHub
- Import project in Vercel
- Set environment variables in Vercel dashboard
- Deploy!
This project is a portfolio demonstration project.