Full-stack MERN application with AI compatibility scoring, real-time chat, and smart notifications.
| Feature | Description |
|---|---|
| 🤖 AI Matching | Gemini 1.5 Flash computes 0-100 compatibility score for every tenant-listing pair |
| 💬 Real-time Chat | Socket.io powered chat with typing indicators, seen receipts, and presence |
| 📧 Email Notifications | Nodemailer HTML emails for interest, acceptance, and verification |
| 🔐 Auth | JWT + Google OAuth with email verification |
| ☁️ Image Upload | Cloudinary with automatic optimization |
| 👤 3 User Roles | Owner · Tenant · Admin |
| 📱 Responsive | Mobile-first design |
- Node.js 18+
- MongoDB Atlas account
- Cloudinary account
- Google Cloud Console (OAuth)
- Gemini API key
- Gmail SMTP app password
# Install client dependencies
cd client
npm install
# Install server dependencies
cd ../server
npm install --legacy-peer-depsServer — copy server/.env.example to server/.env and fill in:
MONGODB_URI— MongoDB Atlas connection stringJWT_SECRET— any random 32+ char stringJWT_REFRESH_SECRET— another random 32+ char stringGOOGLE_CLIENT_ID+GOOGLE_CLIENT_SECRET— from Google Cloud ConsoleCLOUDINARY_*— from Cloudinary dashboardGEMINI_API_KEY— from Google AI StudioEMAIL_USER+EMAIL_PASS— Gmail + App Password
Client — copy client/.env.example to client/.env (defaults work for local dev)
# Terminal 1 — Backend
cd server
npm run dev
# Terminal 2 — Frontend
cd client
npm run devApp runs at: https://stay-mate-five.vercel.app/
API runs at: https://staymate-backend-vijh.onrender.com
StayMate/
├── client/ # React 18 + Vite frontend
│ └── src/
│ ├── components/ # Reusable UI components
│ ├── pages/ # Route pages (public/auth/owner/tenant/admin)
│ ├── store/ # Zustand global state
│ ├── hooks/ # Custom React hooks
│ ├── services/ # Axios API client
│ └── index.css # Design system (CSS variables + components)
└── server/ # Node.js + Express backend
└── src/
├── models/ # Mongoose schemas
├── controllers/ # Business logic
├── routes/ # Express routes
├── middlewares/ # Auth, role, upload
├── services/ # AI, email, socket
└── config/ # DB, Cloudinary, Passport, Socket.io
| Token | Color | Usage |
|---|---|---|
| Primary | #4C5CE7 |
Buttons, CTAs, active states |
| Secondary | #08B094 |
Match badges, success states |
| Accent | #F7F86F |
Tags, highlights |
| Dark | #0F172A |
Navbar, dark sections |
Frontend: React 18 · Vite · React Router v6 · Zustand · Axios · Socket.io-client · Framer Motion · Lucide React
Backend: Node.js · Express · Mongoose · Socket.io · JWT · Passport.js
Database: MongoDB Atlas
AI: Google Gemini 1.5 Flash
Storage: Cloudinary
Email: Nodemailer (Gmail SMTP)
Auth: JWT + Google OAuth 2.0
| Service | Platform |
|---|---|
| Frontend | Vercel |
| Backend | Render |
| Database | MongoDB Atlas |
| Images | Cloudinary |
Built with ❤️ as part of the Unthinkable full-stack portfolio.