Production-ready healthcare platform with video consultations, appointment booking, prescriptions, payments, and more. Built with Node.js, Express, MongoDB, and React.
| Feature | Details |
|---|---|
| 🔐 Authentication | JWT auth, email verification, password reset, role-based access (patient / doctor / admin) |
| 📅 Appointment Booking | Real-time slot availability, date/time picker, reschedule & cancel |
| 📹 Video Consultations | HD video calls via Daily.co, full in-browser experience |
| 💊 Prescriptions | Digital prescriptions with medication tracking and refill management |
| 💳 Payments | Stripe integration, webhooks, refunds, payment history |
| ⭐ Reviews & Ratings | Star ratings with category breakdowns, doctor responses |
| 🔍 Doctor Search | Full-text search, filter by specialty, fee, rating, availability |
| 🛡️ Admin Panel | User management, doctor verification, platform analytics |
| 📧 Email Notifications | Appointment confirmations, reminders, password resets |
| 📊 Analytics | Revenue charts, appointment trends, platform stats |
| 🧪 Tests | Backend API tests (Jest + Supertest) + Frontend component tests (Vitest + RTL) |
healing-platform/
├── backend/ # Node.js + Express + MongoDB API
│ ├── src/
│ │ ├── controllers/ # Business logic
│ │ ├── models/ # Mongoose schemas
│ │ ├── routes/ # Express routers
│ │ ├── middleware/ # Auth, error handling
│ │ └── utils/ # Logger, email, AppError
│ └── tests/ # Jest + Supertest
├── frontend/ # React 18 + TypeScript + Vite
│ ├── src/
│ │ ├── pages/ # Route-level components
│ │ ├── components/ # Shared UI components
│ │ ├── store/ # Zustand state management
│ │ ├── utils/ # API client (Axios)
│ │ ├── styles/ # Global CSS design system
│ │ └── tests/ # Vitest + Testing Library
│ └── index.html
├── api/ # Vercel serverless entry
├── vercel.json # Deployment config
└── package.json # Root monorepo scripts
- Node.js 18+
- MongoDB Atlas account (free tier works)
- Stripe account (test mode)
- Daily.co account (free tier)
- Cloudinary account (free tier)
git clone https://github.com/your-username/healing-platform.git
cd healing-platform
npm run install:allcd backend
cp .env.example .env
# Edit .env with your credentialsRequired environment variables:
MONGODB_URI=mongodb+srv://...
JWT_SECRET=your_super_secret_32_char_key
STRIPE_SECRET_KEY=sk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
SMTP_HOST=smtp.gmail.com
SMTP_EMAIL=your@gmail.com
SMTP_PASSWORD=your_app_password
CLOUDINARY_CLOUD_NAME=...
CLOUDINARY_API_KEY=...
CLOUDINARY_API_SECRET=...
DAILY_API_KEY=...
CLIENT_URL=http://localhost:3000
cd frontend
cp .env.example .env
# Add your Stripe publishable keyVITE_STRIPE_PUBLISHABLE_KEY=pk_test_...
# From root — starts both backend (port 5000) and frontend (port 3000)
npm run devOr separately:
npm run dev:backend # http://localhost:5000
npm run dev:frontend # http://localhost:3000After registering via the UI, update your user role directly in MongoDB:
db.users.updateOne({ email: "your@email.com" }, { $set: { role: "admin" } })# Run all tests
npm test
# Backend only
npm run test:backend
# Frontend only
npm run test:frontend
# Watch mode
cd backend && npm run test:watch
cd frontend && npm run test:watchBackend test coverage includes:
- Auth: register, login, token validation, unauthorized access
- Doctors: listing, filtering, pagination, 404 handling
- Appointments: booking, double-booking prevention, role access
- Security: CORS headers, rate limiting
Frontend test coverage includes:
- Login form: validation, submission, loading states
- Register form: role switching, password validation
- Doctors page: rendering, filtering, skeleton loading
- Dashboard layout: role-based navigation
npm install -g vercel
vercel login
vercel --prod- Push to GitHub
- Import project at vercel.com/new
- Set Root Directory to
/(leave default) - Add all environment variables from
backend/.env.example - Add
VITE_STRIPE_PUBLISHABLE_KEYas a frontend env var - Deploy!
After deploying, configure Stripe webhook:
- Go to Stripe Dashboard → Webhooks
- Add endpoint:
https://your-domain.vercel.app/api/payments/webhook - Select events:
payment_intent.succeeded,payment_intent.payment_failed,charge.refunded - Copy webhook secret → add as
STRIPE_WEBHOOK_SECRETin Vercel env
- Register → verify email
- Browse doctors (search, filter by specialty/fee/availability)
- View doctor profile + reviews
- Book appointment → select date/time → fill reason → pay via Stripe
- Join video call at appointment time
- View prescriptions issued by doctor
- Leave review after completed appointment
- Manage payments + refunds history
- Register → create doctor profile (specialization, license, availability)
- Wait for admin verification
- View upcoming appointments dashboard
- Confirm/cancel/complete appointments
- Add diagnosis notes + issue prescriptions
- Respond to patient reviews
- View platform analytics (users, revenue, appointments)
- Verify doctor applications
- Activate/deactivate users
- Monitor all appointments
- JWT tokens with HTTP-only cookies
- bcrypt password hashing (12 rounds)
- Rate limiting (100 req/15min global, 10 req/15min auth)
- Helmet.js security headers
- MongoDB injection sanitization
- CORS with explicit origin whitelist
- Input validation on all routes
- Role-based access control (RBAC)
- Stripe webhook signature verification
The UI uses a 2026 dark luxury healthcare aesthetic:
- Primary:
#00f5a0(mint green) → trust, health - Secondary:
#00d4ff(cyan) → technology, clarity - Background:
#050508(near-black) → premium, focused - Typography: Sora (headings) + DM Sans (body) + JetBrains Mono (code)
- Animations: Framer Motion with spring physics
- Components: Fully custom CSS Modules (no UI library dependency)
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, Vite, React Router 6 |
| State | Zustand (auth), TanStack Query (server state) |
| Forms | React Hook Form + Zod validation |
| Animations | Framer Motion |
| Charts | Recharts |
| Backend | Node.js, Express 4 |
| Database | MongoDB + Mongoose |
| Auth | JWT + bcrypt |
| Payments | Stripe |
| Video | Daily.co |
| Nodemailer | |
| Images | Cloudinary |
| Tests (BE) | Jest, Supertest, mongodb-memory-server |
| Tests (FE) | Vitest, Testing Library |
| Deploy | Vercel |
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/auth/register |
Register new user |
| POST | /api/auth/login |
Login |
| POST | /api/auth/logout |
Logout |
| GET | /api/auth/me |
Get current user |
| POST | /api/auth/forgot-password |
Send reset email |
| PUT | /api/auth/reset-password/:token |
Reset password |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/doctors |
List all (filter, sort, paginate) |
| GET | /api/doctors/featured |
Featured doctors |
| GET | /api/doctors/:id |
Doctor profile |
| GET | /api/doctors/:id/availability |
Available slots |
| POST | /api/doctors |
Create profile (doctor) |
| PUT | /api/doctors/:id |
Update profile |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/appointments |
List appointments |
| POST | /api/appointments |
Book appointment |
| GET | /api/appointments/:id |
Get appointment |
| PATCH | /api/appointments/:id/status |
Update status |
| PUT | /api/appointments/:id/reschedule |
Reschedule |
| PATCH | /api/appointments/:id/notes |
Add doctor notes |
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/payments/create-intent |
Stripe payment intent |
| POST | /api/payments/webhook |
Stripe webhook handler |
| GET | /api/payments/history |
Payment history |
- Video (Daily.co) requires a paid plan for production rooms beyond free tier
- Email sending requires a proper SMTP setup (Gmail app password or SendGrid)
- Stripe is in test mode by default — use test card
4242 4242 4242 4242
MIT © 2026 Healing Platform