A complete real estate platform connecting property owners with buyers and renters. Built as a full-stack monorepo (Node.js API, Next.js web app, Flutter mobile app) for the West African market.
Accounts
- 🔐 Sign up / login with JWT
- 🌐 Google OAuth support
- 👤 Profile management
Listings
- 🏘️ Publish properties with photos, specs (bedrooms, bathrooms, surface, amenities), and precise location
- 📄 Upload ownership documents (ID card, land title / lease) for verification
- ✏️ Full CRUD, restricted to the listing owner or an admin
Search
- 🔍 Advanced filters — city, transaction type (sale/rent), property type, price, amenities
Favorites & Messaging
- ❤️ Save listings for later
- 💬 Real-time in-app chat with unread message notifications, scoped per property
Admin & Moderation
- 🛡️ Dashboard for supervising the platform
- 🚩 Fraud report handling, listing blocking, user management
- Node.js ^18
- MongoDB instance (local or Atlas)
- Flutter SDK (for the mobile app)
- Google Maps API key (for the web app)
Clone the repository
git clone https://github.com/christelle-dehoumon/Real-Estate-Platform.git
cd Real-Estate-PlatformBackend
cd backend
npm install
# create a .env file with MONGO_URI, JWT_SECRET, etc.
npm run devWeb
cd web
npm install
# create a .env.local file with NEXT_PUBLIC_API_URL, NEXT_PUBLIC_GOOGLE_MAPS_KEY, etc.
npm run devMobile
cd mobile
flutter pub get
flutter runbackend/
├── src/
│ ├── models/ # Mongoose schemas
│ ├── controllers/ # Business logic
│ ├── routes/ # Express routes
│ └── middleware/ # Auth, error handling
└── uploads/ # Uploaded images & documents
web/
├── src/
│ └── app/ # Next.js App Router pages
├── components/ # Reusable UI components
└── context/ # State/context providers
mobile/
├── lib/
│ ├── screens/ # UI screens
│ ├── models/ # Data models
│ ├── providers/ # State management
│ └── services/ # API calls
- JWT-based authentication, token sent in request headers
- Only the listing owner or an admin can modify/delete a listing
- Images and documents uploaded as
multipart/form-data, served statically from/uploads helmetmiddleware for HTTP header hardening
Best practices
- Rejected or blocked listings stay accessible to their owner and admins for history, but are hidden from public search
- Messages are scoped to a specific property to preserve conversation context
Fasohabitat follows a decoupled three-tier architecture:
- Backend (REST API) — Node.js, Express, MongoDB via Mongoose
- Web frontend — Next.js (App Router), React, TypeScript
- Mobile app — Flutter, cross-platform (iOS/Android)
Both clients consume the same REST API over HTTP, authenticating with a shared JWT flow.
# Backend, with live reload
cd backend && npm run dev
# Web, dev server
cd web && npm run dev
# Mobile, pick a device
flutter run -d chrome # Web preview
flutter run -d emulator-5554 # Android emulatorWeb
cd web
npm run build
npm run startMobile
flutter build apk --release
flutter build ios --releaseMongoDB connection issues
- Check
MONGO_URIinbackend/.env - Confirm your IP is allow-listed if using MongoDB Atlas
Image upload issues
- Ensure the
backend/uploadsfolder exists and is writable - Check the file size limit configured in the upload middleware
Web map/search not loading
- Confirm
NEXT_PUBLIC_GOOGLE_MAPS_KEYis set and valid inweb/.env.local
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit changes with meaningful messages
- Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
Academic project — Burkina Institute of Technology (BIT)
For issues or questions, open a GitHub issue or contact: dhmchristelle@gmail.com
- Property comparison tool
- Mobile push notifications
- Virtual property tours
- Multi-language support (English)
- Payment integration for booking deposits
Contributors: Christelle Dehoumon · Farida