A full-stack real estate marketplace to discover, list, and manage property rentals and sales. Built with the MERN stack, JWT authentication, and a premium amber/orange design system.
UrbanNest is a production-grade real estate marketplace where users can browse properties for sale or rent, post listings with photo galleries, and contact landlords directly. Built to strengthen full-stack development skills β with a focus on secure authentication, RESTful API design, and cloud service integration.
| Feature | Detail |
|---|---|
| π Authentication | JWT (HTTP-only cookies) + Google OAuth via Firebase |
| π Password Reset | 3-step email flow β SHA-256 hashed token, 1-hour expiry |
| ποΈ Listings | Full CRUD with up to 6 Cloudinary-hosted photos per listing |
| π Search & Filter | Filter by type, offer, parking, furnished Β· sort Β· pagination |
| π± Responsive | Mobile, tablet, and desktop |
| Sign In | Sign Up |
|---|---|
![]() |
![]() |
| Step 1 β Enter Email | Step 2 β Check Inbox | Step 3 β Set New Password |
|---|---|---|
![]() |
![]() |
![]() |
| Search
|--------|---------------|
|
|
| Create | Update |
|---|---|
![]() |
![]() |
| Profile | About |
|---|---|
![]() |
![]() |
| Layer | Technologies |
|---|---|
| Frontend | React 19, Vite, Tailwind CSS 4, Redux Toolkit + Persist, React Router v7, Swiper.js, Axios |
| Backend | Node.js, Express, MongoDB, Mongoose, JWT, bcryptjs |
| Services | Firebase (Google OAuth) Β· Cloudinary (image CDN) Β· Nodemailer (emails) |
| Deployment | Vercel (frontend + backend) |
- Node.js v18+ and npm v9+
- Accounts at MongoDB Atlas, Firebase, and Cloudinary
# 1. Clone the repo
git clone https://github.com/AqibNiazi/urban-nest.git
cd urban-nest
# 2. Install backend dependencies
cd server && npm install
# 3. Install frontend dependencies
cd ../client && npm install
# 4. Add .env files (see Environment Variables below)
# 5. Run backend β http://localhost:3000
cd server && npm run dev
# 6. Run frontend β http://localhost:5173
cd ../client && npm run devAdd
resetPasswordTokenandresetPasswordExpiresfields to your User schema β seeuser.model.js.
MONGO_URI=mongodb+srv://<user>:<pass>@cluster.mongodb.net/urban-nest
JWT_SECRET=your_jwt_secret
NODE_ENV=development
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USER=your@gmail.com
EMAIL_PASS=your-gmail-app-password
CLIENT_URL=http://localhost:5173For Gmail, generate an App Password at myaccount.google.com β Security β App Passwords.
VITE_WEBSITE_BASE_URL=http://localhost:3000
VITE_FIREBASE_API_KEY=AIza...
VITE_FIREBASE_AUTH_DOMAIN=your-project.firebaseapp.com
VITE_FIREBASE_PROJECT_ID=your-project
VITE_FIREBASE_STORAGE_BUCKET=your-project.appspot.com
VITE_FIREBASE_MESSAGING_SENDER_ID=123456789
VITE_FIREBASE_APP_ID=1:123456789:web:abc123| Method | Endpoint | Auth | Description |
|---|---|---|---|
POST |
/signup |
β | Register new user |
POST |
/signin |
β | Sign in, sets JWT cookie |
POST |
/google |
β | Google OAuth |
POST |
/signout |
β | Clear auth cookie |
POST |
/forgot-password |
β | Send reset email |
POST |
/reset-password |
β | Set new password via token |
| Method | Endpoint | Auth | Description |
|---|---|---|---|
GET |
/get-user/:id |
β | Get user profile |
POST |
/upload-avatar |
β | Upload profile photo |
PUT |
/update-user/:id |
β | Update account |
DELETE |
/delete-user/:id |
β | Delete account |
GET |
/user-listings/:id |
β | Get user's listings |
| Method | Endpoint | Auth | Description |
|---|---|---|---|
POST |
/create-listing |
β | Create listing |
GET |
/get-listing/:id |
β | Get single listing |
PUT |
/update-listing/:id |
β | Update (owner only) |
DELETE |
/delete-listing/:id |
β | Delete (owner only) |
GET |
/get-listings |
β | Search with filters |
Search params: searchTerm Β· type Β· offer Β· parking Β· furnished Β· sort Β· order Β· startIndex Β· limit
Both services are deployed on Vercel as separate projects.
| Service | Root Directory | Framework |
|---|---|---|
| Frontend | client/ |
Vite |
| Backend | server/ |
Node.js |
Production checklist:
- Set
NODE_ENV=productionon backend - Update
CLIENT_URLto your frontend Vercel URL - Add Vercel domain to Firebase Authorized Domains
- Set JWT cookie
secure: true,sameSite: 'none' - Add
vercel.jsoninclient/to fix React Router on direct URL visits
{ "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] }Aqib Niazi β Full Stack Engineer
MIT β see LICENSE for details.
If this project helped you, consider giving it a β









