π https://zenvyra-app.onrender.com
π https://github.com/JEETJM/zenvyra
Zenvyra is a feature-rich full-stack rental listing platform inspired by Airbnb.
It allows users to:
- Discover rental properties π
- Create & manage listings π
- Upload images βοΈ
- Leave reviews β
- Explore locations via interactive maps πΊοΈ
β‘ Built with a scalable MVC architecture, ensuring clean code and maintainability.
- Create new listings with full details
- Update existing listings
- Delete listings securely
- Dynamic rendering of listings
- Server-side validation (Joi)
// Example: Create Listing
router.post("/", isLoggedIn, validateListing, async (req, res) => {
const newListing = new Listing(req.body.listing);
newListing.author = req.user._id;
await newListing.save();
res.redirect("/listings");
});- Add reviews to listings
- Delete reviews by owner
- Rating-based feedback system
- Relational linking (Listing β Reviews)
// Example: Add Review
router.post("/", isLoggedIn, async (req, res) => {
const listing = await Listing.findById(req.params.id);
const review = new Review(req.body.review);
review.author = req.user._id;
listing.reviews.push(review);
await review.save();
await listing.save();
});- Secure login/signup system
- Passport.js Local Strategy
- Session-based authentication
- Protected routes (middleware)
- Role-based access (optional extension)
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());- Upload images from frontend
- Store in Cloudinary
- Save image URL + filename in DB
- Optimized image handling
const storage = new CloudinaryStorage({
cloudinary: cloudinary,
params: {
folder: "Zenvyra/listings",
},
});- Display location on map
- Marker popup with listing details
- Forward & reverse geocoding
mapboxgl.accessToken = MAP_TOKEN;
const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/mapbox/streets-v11",
});-
Search by:
- Title
- Location
- Country
-
Dynamic filtering logic
-
Scalable for categories (future)
- Fully responsive design π±
- Dark / Light mode toggle π
- Animated buttons & cards
- Smooth transitions
- Clean modern layout
- MVC pattern
- Modular routing
- Custom middleware
- Centralized error handling
- Async wrapper (WrapAsync)
module.exports = (fn) => {
return function (req, res, next) {
fn(req, res, next).catch(next);
};
};- Password hashing & salting
- Session management
- Secure cookies
- Input validation (Joi)
- Protection against invalid requests
- HTML5
- CSS3 (Animations)
- JavaScript
- Bootstrap
- EJS
- Node.js
- Express.js
- MongoDB
- Mongoose
- Passport.js
- express-session
- Cloudinary
- Mapbox
- Render
zenvyra/
β
βββ controllers/
β βββ listings.js
β βββ reviews.js
β βββ users.js
β
βββ models/
β βββ listing.js
β βββ review.js
β βββ user.js
β
βββ Routes/
β βββ listings.js
β βββ reviews.js
β βββ users.js
β
βββ views/
β βββ listings/
β β βββ index.ejs
β β βββ show.ejs
β β βββ new.ejs
β β βββ edit.ejs
β β
β βββ reviews/
β βββ users/
β βββ includes/
β β βββ navbar.ejs
β β βββ footer.ejs
β β
β βββ layouts/
β
βββ public/
β βββ css/
β βββ js/
β
βββ uploads/
βββ utils/
βββ init/
β
βββ app.js
βββ middleware.js
βββ cloudConfig.js
βββ Schema.js
βββ .env
βββ package.jsongit clone https://github.com/JEETJM/zenvyra.git
cd zenvyra
npm installMONGO_URL=your_mongodb_url
CLOUD_NAME=your_cloudinary_name
CLOUD_API_KEY=your_key
CLOUD_API_SECRET=your_secret
MAP_TOKEN=your_mapbox_token
SESSION_SECRET=your_secretnpm run devor
node app.js- β€οΈ Wishlist system
- π¨ Booking system
- π³ Payment gateway
- π§βπ» Admin dashboard
- π¬ Real-time chat
- π Analytics dashboard
Jeet Mondal
- GitHub: https://github.com/JEETJM
- Email: jm382118@gmail.com
- Twitter: https://x.com/jm382118
- Telegram: https://t.me/jeetu900
β Star this repo π΄ Fork it π’ Share it
π₯ Built with Passion by JEET MONDAL π₯