FixIt is a full-stack, production-grade home services platform that connects consumers with skilled technicians. It supports real-time job scheduling, secure payments via Stripe, email OTP-based authentication, forgot password flow, and dedicated dashboards for both consumers and technicians.
π Live Consumer/Tech Portal: https://fixit-beige.vercel.app
π Live API Endpoint: https://fixit-production-b37f.up.railway.app/api/v1
The application runs on a highly scalable, decoupled cloud infrastructure. The frontend is served via Vercel's Edge Network for global performance and SEO. The backend runs as a containerized NestJS API on Railway, connected to a fully managed PostgreSQL database.
βββββββββββββββββββββββββββ
User Browser βββββββββΊ β Vercel Edge Network β (Next.js 16, SSR + Static)
ββββββββββββββ¬βββββββββββββ
β HTTPS REST API
ββββββββββββββΌβββββββββββββ
β Railway (Docker) β (NestJS 10 API)
ββββββββββββββ¬βββββββββββββ
β
βββββββββββββββββββββββββΌββββββββββββββββββββ
β β β
ββββββββββββββΌβββββββ ββββββββββββββΌβββββββ ββββββββββΌβββββββββ
β Railway PostgreSQL β β Stripe API β β SendGrid API β
β (Database) β β (Payments) β β (Emails) β
βββββββββββββββββββββ βββββββββββββββββββββ βββββββββββββββββββ
| Layer | Technology |
|---|---|
| Frontend | Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS v4 |
| Backend | NestJS 10, TypeScript, Node.js 20 |
| Database | PostgreSQL 15 (Railway managed) |
| ORM | TypeORM |
| Authentication | Email OTP + JWT Access/Refresh Token Rotation |
| Email Service | SendGrid (HTTP API β Railway compatible) |
| Payments | Stripe API (Payment Intents + Webhooks) |
| Frontend Cloud | Vercel Edge Network (Auto-deploy from GitHub) |
| Backend Cloud | Railway PaaS (Docker container) |
| Security | Helmet, bcrypt, throttling, role-based guards |
- Email OTP verification on registration β 6-digit code sent via SendGrid
- Forgot Password flow β request a reset code via email, set a new password
- JWT Access + Refresh Token rotation for session management
- Role-based access control β separate Consumer and Technician experiences
- Passwords hashed with bcrypt; OTP codes expire after 5 minutes
- Browse a rich service catalog (Plumbing, Electrical, AC, Cleaning, etc.)
- Book services with a date, time, and address picker
- Submit custom job requests with descriptions and photos
- Choose payment method β Stripe (credit/debit) or Cash on Delivery
- Consumer dashboard with booking history and real-time status tracking
- Daily job agenda view with full job details
- Accept / reject custom job quotes
- Real-time status updates:
CONFIRMEDβIN_PROGRESSβCOMPLETED - Weekly earnings ledger and payment history
- Stripe Payment Intents for secure, PCI-compliant card processing
- Cash on Delivery option
- Stripe Webhook integration to confirm payments and update booking status server-side
Every git push to main automatically triggers both deployments with zero downtime.
git push β main
β
ββββΊ Vercel (Frontend)
β 1. Detects changes in /frontend
β 2. Builds Next.js optimized static & serverless pages
β 3. Deploys to Vercel Global Edge Network (~30s)
β
ββββΊ Railway (Backend)
1. Detects changes in /Backend
2. Builds Docker container (node:20-alpine, multi-stage)
3. Rolling zero-downtime deployment (~60s)
- Node.js 20+
- PostgreSQL (running locally or via Docker)
- Stripe Account (for test API keys)
- SendGrid Account (free tier, for OTP emails)
git clone https://github.com/abdulhadi-js/Fixit.git
cd FixitCreate a .env file inside /Backend:
# Database
DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=postgres
DB_PASSWORD=your_postgres_password
DB_NAME=fixit
# Auth
JWT_SECRET=your_jwt_secret
JWT_REFRESH_SECRET=your_jwt_refresh_secret
# Email (SendGrid)
SENDGRID_API_KEY=SG.xxxxxxxxxxxxxxxxxxxxxxxx
MAIL_FROM=your-verified-sender@gmail.com
# Payments (Stripe)
STRIPE_SECRET_KEY=sk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
PORT=3001cd Backend
npm install
npm run seed # Seeds the database with default services & categories
npm run start:dev
# β
API running at http://localhost:3001Create a .env.local file inside /frontend:
NEXT_PUBLIC_API_URL=http://localhost:3001/api/v1
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...cd ../frontend
npm install
npm run dev
# β
UI running at http://localhost:3000These environment variables must be set in your Railway backend service:
| Variable | Description |
|---|---|
DATABASE_URL |
Railway PostgreSQL connection string |
JWT_SECRET |
Secret key for signing access tokens |
JWT_REFRESH_SECRET |
Secret key for signing refresh tokens |
SENDGRID_API_KEY |
Your SendGrid API key (SG.xxx...) |
MAIL_FROM |
Email address verified in SendGrid Sender Identity |
STRIPE_SECRET_KEY |
Stripe live/test secret key |
STRIPE_WEBHOOK_SECRET |
Stripe webhook signing secret |
PORT |
3001 |
Fixit/
βββ Backend/ # NestJS API
β βββ src/
β β βββ auth/ # JWT auth, OTP, forgot/reset password
β β βββ mail/ # SendGrid email service
β β βββ bookings/ # Job booking & scheduling module
β β βββ payments/ # Stripe payment integration
β β βββ services/ # Service catalog module
β β βββ users/ # User entity & role management
β βββ Dockerfile # Multi-stage Docker build for Railway
β βββ package.json
β
βββ frontend/ # Next.js 16 Frontend
β βββ src/
β β βββ app/
β β β βββ (public)/ # Auth pages
β β β β βββ login/
β β β β βββ register/
β β β β βββ verify-otp/
β β β β βββ forgot-password/
β β β β βββ reset-password/
β β β βββ dashboard/ # Consumer booking dashboard
β β β βββ checkout/ # Stripe payment page
β β β βββ technician/ # Technician dashboard & earnings
β β βββ components/ # Reusable UI components
β β βββ hooks/ # Custom React hooks (useAuth, etc.)
β β βββ lib/api/ # Typed API client layer
β βββ package.json
β
βββ .gitignore
βββ README.md
Register (email + password)
β
βΌ
OTP sent to email via SendGrid
β
βΌ
User enters 6-digit OTP βββΊ Account Verified
β
βΌ
Login (email + password) βββΊ JWT Access Token + Refresh Token
β
βΌ
Protected routes use Bearer token in Authorization header
Forgot Password Flow:
Enter email βββΊ OTP sent to email βββΊ Enter OTP + new password βββΊ Login
This project is proprietary and confidential. All rights reserved Β© FixIt 2026.