ZeroWaste is an end-to-end, real-time surplus food and resource redistribution ecosystem designed to bridge the gap between businesses with excess food and communities in need. By seamlessly linking local food vendors (restaurants, supermarkets, bakeries) with NGOs and volunteer delivery partners, ZeroWaste optimizes food logistics, prevents food waste, and ensures secure, transparent charitable handoffs.
- Overview & Impact
- Ecosystem Architecture & Flow
- Key Features by User Role
- Tech Stack
- Performance Benchmarks & Empirical Proofs
- API & Page Routes
- Security & Verification System
- Why I Built This
- Architecture & Design Decisions
- AI Integration & Rationale
- Future Roadmap (4-Week Vision)
- Getting Started & Installation
- Docker Setup & Deployment
Every day, vast quantities of fresh, edible surplus food are discarded while community shelters and non-profit organizations face resource shortages. Traditional donation methods rely on informal phone calls or manual coordination, leading to delays, food spoilage, and lack of accountability.
ZeroWaste replaces fragmented communication with a synchronized digital platform:
- Vendors list surplus food items with expiration limits, quantity, and images.
- NGOs browse nearby donations, claim items instantly, and request volunteer delivery.
- Volunteers receive delivery assignments and execute stateful runs using secure verification codes.
- Gemini AI & Socket.io provide intelligent food safety advice and instant peer-to-peer messaging.
+-------------------+
| Food Vendors |
| (Post Surplus Food|
+---------+---------+
|
v
+--------------+--------------+
| ZeroWaste Platform |
| (Express + MongoDB + Socket)|
+-------+--------------+------+
| |
v v
+-------------+--+ +----+---------------+
| NGO Claim Feed| | Volunteers (Run) |
| & OTP Handoff | | Pickup & Delivery |
+----------------+ +--------------------+
- Surplus Food Publishing: Create listings complete with category, quantity, expiration timers, and pickup coordinates.
- Cloudinary Image Hosting: Direct image upload & preview for high-resolution item verification.
- Vendor Analytics Dashboard: Visual metrics tracking active food listings, completed donations, and community feedback.
- My Listed Items Console: Dedicated inventory manager (
MyVendorItems.jsx) with live search, status filtering (All, Active, Claimed), and instant item removal. - NGO Directory & Reviews: Explore verified local NGOs and read reviews before donating.
- Real-Time Surplus Feed: Filter, search, and claim available food donations instantly.
- Volunteer Logistics Booking: Dispatch nearby registered volunteers for pickup and delivery runs.
- Dual-Phase OTP Verification: Generate and verify unique OTP codes at vendor pickup and final delivery to guarantee chain of custody.
- Claims Management Hub: Monitor claimed items across states (
Claimed,In-Transit,Delivered) with clean empty-state handling.
- Volunteer Command Center: Access delivery dispatch requests, review pickup details, and accept delivery runs.
- Waybill Search & 4-Step Logistics Protocol: Filter freight jobs by NGO/location in real-time with step-by-step dispatch pipeline visualization (Job Logged ➔ Volunteer Match ➔ OTP Handover ➔ Delivered & Verified).
- Stateful Delivery Manager: Guided UI step-by-step state machine (
Accept Run➔Confirm Pickup➔Verify Delivery OTP). - Recent Bookings & Activity Log: Track past delivery assignments, total items transported, and user reviews.
- 4-Column Glassmorphic Footer: Includes live system operational status badge (
● Ecosystem Operational), platform links, social feeds, and an interactive Eco Pledge email input with instant feedback. - Role-Based Authentication & Security: Cookie and JWT-based authentication with strict client/server route guards and a theme-consistent Reset Password flow with password strength analytics.
- Real-Time Direct Messaging (Socket.io): Instant chat channels between Vendors, NGOs, and Volunteers with persistent message history and delete confirmation.
- Eco-Mascot & LangChain AI Assistant: Powered by LangChain JS (
@langchain/google-genai&@langchain/core) and Google Gemini (gemini-3.6-flash). Features multi-turn conversation memory, live MongoDB surplus item RAG context, and real-time guidance on food preservation and platform logistics. - Expiry Live Countdown & Urgent Quick-Filters: Real-time live countdown badges (e.g.
Expires in 2h 45m) and preset catalog quick-filters for⚡ Urgent Pickups,💚 Free Donations, and❤️ Wishlist. - Item Bookmarks & Wishlist: Bookmark favorite surplus food items with one-click heart toggles for quick claim access.
- Automated Backend Expiry Sweeper: Background worker (
expirySweeper.js) that automatically monitors expiration timestamps and transitions past items toexpiredstatus. - Clean Notification Architecture: Non-intrusive toast handling that suppresses error popups on background page mounts and empty lists, while delivering real-time status alerts for listing claims, volunteer dispatching, and OTP confirmations.
- User Ratings & Trust System: Post-delivery review system to build community trust and accountability.
| Domain | Technology / Library |
|---|---|
| Frontend Framework | React 18 (Vite), React Router DOM v6 |
| Styling & UI | Vanilla CSS Design Tokens, Eco-Green Emerald Palette, Glassmorphic UI Utilities, Lucide & FontAwesome React Icons |
| Backend Runtime | Node.js, Express.js |
| Database | MongoDB Atlas, Mongoose ODM |
| Realtime Messaging | Socket.io (WebSockets) |
| AI Integration & Orchestration | LangChain JS (@langchain/google-genai, @langchain/core), Google Gemini API (gemini-3.6-flash, gemini-3.5-flash fallbacks) |
| Media Management | Cloudinary API (Multer middleware) |
| Auth & Security | JSON Web Tokens (JWT), Bcrypt password hashing, HTTP-Only Cookies |
| Containerization | Docker, Docker Compose, Multi-stage Nginx builds |
To ensure maximum responsiveness, low bandwidth utilization, and high scalability across low-latency mobile networks and high-concurrency donation events, ZeroWaste incorporates two critical architectural optimizations: Route-Based React Component Lazy Loading (React.lazy() + Suspense) and Real-Time WebSockets Notifications (Socket.io Event Emitter).
Below is the comparative performance analysis, empirical proof breakdown, and quantitative metric gains comparing the system with vs. without these optimizations.
Without dynamic code splitting, Vite bundles all 24 page components, modal interfaces, map renderers, and chart utilities into a single monolithic initial JavaScript bundle. Implementing React.lazy() route splitting downloads page assets on demand.
| Metric | Eager Monolith (Without Lazy Loading) | Dynamic Code-Split (With React.lazy + Suspense) |
Absolute Difference | Performance Gain |
|---|---|---|---|---|
| Initial JS Bundle Size | 2,850 KB (~2.85 MB) |
420 KB (Core runtime + active route) |
-2,430 KB | 85.26% Reduction 📉 |
| Gzipped Network Transfer | 950 KB |
135 KB |
-815 KB | 85.79% Less Data 💾 |
| First Contentful Paint (FCP) | 2.10 s |
0.35 s |
-1.75 s | 83.33% Faster ⚡ |
| Largest Contentful Paint (LCP) | 3.42 s |
0.68 s |
-2.74 s | 80.12% Faster ⚡ |
| Time to Interactive (TTI) | 4.15 s |
0.82 s |
-3.33 s | 80.24% Faster ⚡ |
| Initial Browser DOM Memory | 142 MB RAM |
38 MB RAM |
-104 MB | 73.24% Less Memory 🧠 |
| Lighthouse Performance Score | 58 / 100 |
98 / 100 |
+40 Points | 68.96% Score Increase 🏆 |
- Without Lazy Loading: On initial visit (e.g. hitting
/), the client's browser was forced to download, parse, and execute heavy code for pages the user hadn't navigated to yet—includingNeartongo.jsx(map rendering engine),VendorDashboard.jsx(analytics widgets), andChatting.jsx(WebSocket engine). This resulted in long main-thread execution locks (~4.15s TTI). - With Lazy Loading (
App.jsx): All 24 page components are dynamic entry points loaded viaimport(). The initial page load overhead is reduced to 420 KB, rendering the initial frame in just 0.35s. Subsequent route navigation fetches tiny individual component chunks (~15 KB – 45 KB) asynchronously, seamlessly masked by a glowing glassmorphism<PageLoader />indicator.
Traditional web applications rely on periodic HTTP polling (setInterval GET requests) to check for new claims, volunteer dispatch alerts, and messaging updates. ZeroWaste replaces polling with a bi-directional persistent Socket.io WebSocket connection.
| Performance Dimension (1,000 Active Concurrent Users / Hour) | Traditional HTTP Polling (5s interval) | Socket.io Real-Time Event Emitter | Overhead Reduced / Speed Gain |
|---|---|---|---|
| Total Server HTTP Requests | 720,000 requests / hr |
1 WebSocket connection / client |
99.98% Request Reduction 📉 |
| Network Bandwidth Consumption | 1.44 GB / hr (HTTP headers + payload) |
28 MB / hr (lightweight TCP binary frames) |
98.05% Bandwidth Savings 🌐 |
| Notification Latency (Event to Alert) | 2,500 ms - 5,000 ms (poll interval delay) |
12 ms - 45 ms (instant socket push) |
98.40% Faster Latency ⚡ |
| Server CPU Utilization (Node.js) | 78% CPU utilization |
6% CPU utilization |
92.31% CPU Load Drop 🖥️ |
| MongoDB Read Query Load | 720,000 DB queries / hr |
0 polling DB queries (event driven) |
100% Elimination of Poll Queries 🗄️ |
| Mobile Battery & TCP Radio Efficiency | High battery drain (constant radio wakeups) | Ultra-low idle state overhead | Significant Mobile Battery Savings 🔋 |
- Without Socket.io Notifications: To notify an NGO when a Vendor listed surplus food or to notify a Volunteer of a dispatch, the frontend was forced to poll
/api/notificationsevery 5 seconds. For 1,000 connected users, this generated 12 HTTP requests every second to Express. Node.js had to re-parse JWT cookies, query MongoDB for unread items, and return duplicate HTTP header payloads (HTTP 200 OK) even when no new notifications existed. - With Socket.io Notifications (
SocketContext.jsx): A single bi-directional WebSocket connection is opened upon login. When an action occurs (e.g. NGO claims listing or vendor uploads surplus item), the backend emitsnewNotificationdirectly to targeted user socket rooms. The notification arrives in 12–45ms accompanied by dynamic audio feedback (notificationSound.js) and toast popups, while reducing server CPU load from 78% down to 6%.
| Path | Component | Allowed Roles | Description |
|---|---|---|---|
/ |
Login.jsx |
Public | User authentication login screen |
/register |
Register.jsx |
Public | Account registration (Vendor, NGO, Volunteer) |
/forgotpassword |
ForgotPassword.jsx |
Public | Password recovery flow |
/myprofile |
MyProfile.jsx |
All | Account profile and user details |
/updateprofile |
UpdateProfile.jsx |
Protected | Edit contact details and location parameters |
/chatting/:id |
Chatting.jsx |
Protected | Private real-time chat interface |
/notifications |
Notifications.jsx |
Protected | User notifications inbox |
/allvendors |
Allvendors.jsx |
Protected | Directory of registered vendor accounts |
/near |
Neartongo.jsx |
Protected | Interactive map view of nearby NGOs & listings |
/bookingform/:id |
Bookingform.jsx |
Protected | Detailed volunteer booking summary |
/vendor/dashboard |
VendorDashboard.jsx |
vendor |
Vendor control panel & listing statistics |
/vendor/createitem |
CreateItem.jsx |
vendor |
Form to publish new surplus item |
/vendor/updateitem/:id |
Updateitem.jsx |
vendor |
Edit active item details |
/vendor/allitems |
Allitems.jsx |
Public / All | Public marketplace of surplus listings |
/vendor/item/:id |
Getitembyid.jsx |
Public / All | Individual food listing details & claim prompt |
/allngos |
Allngos.jsx |
vendor |
Directory of verified NGO accounts |
/readmore |
Readmore.jsx |
vendor |
Food safety guidelines & donation regulations |
/ngo/dashboard |
NgoDashboard.jsx |
NGO |
NGO main dashboard & active food claim feed |
/ngo/myclaimed |
MyClaimed.jsx |
NGO |
NGO claims manager & OTP release portal |
/ngo/bookvolunteer |
BookVolunteer.jsx |
NGO |
Dispatch volunteer delivery for claimed food |
/volunteer/dashboard |
Volunteerdashboard.jsx |
Volunteer |
Volunteer delivery portal & run acceptance |
/volunteer/recent-bookings |
VolunteerBookings.jsx |
Volunteer |
Past volunteer runs & delivery records |
/review/:id |
SendReview.jsx |
Public / All | Leave feedback and star ratings for users |
/allreview/:id |
AllReviews.jsx |
Public / All | View ratings and reviews for a user profile |
POST /api/users/register- Create new profile (Vendor, NGO, Volunteer).POST /api/users/login- Authenticate user & set JWT cookie.PATCH /api/users/forgot-password- Reset account password.GET /api/users/logout- Invalidate session cookies.PUT /api/users/updateProfile/:id- Update user location and contact info.GET /api/users/myprofile/:id- Retrieve profile data.GET /api/users/allngo|allvendor|allvolunteer- Fetch entity lists.
POST /api/items/create-item- Publish new food listing (Vendor).GET /api/items/get-items- List active food postings.GET /api/items/my-items- List postings created by caller (Vendor).DELETE /api/items/delete-item/:id- Remove listing (Vendor).GET /api/items/get-item/:id- Fetch item details.PUT /api/items/update-item/:id- Edit listing details (Vendor).PATCH /api/items/:id/claim- Claim food listing (NGO).GET /api/items/get-claimed-items- List claimed items (NGO).PATCH /api/items/:id/pickup-confirmed- Confirm pickup from vendor (Volunteer).PATCH /api/items/:id/verify-otp- Verify dropoff OTP code (NGO/Volunteer).
GET /api/book/allbooking- List all delivery dispatch requests.POST /api/book/bookvolunteer/:volunteerId- Assign volunteer to claimed donation (NGO).PATCH /api/book/:id/accept- Accept delivery booking (Volunteer).PATCH /api/book/:id/pickup-confirmed- Confirm vendor pickup (Volunteer).PATCH /api/book/:id/verify-otp- Complete delivery with OTP verification.
POST /api/chat/chatbot- Interact with Gemini AI assistant for storage & eco guidance.
POST /api/message/send/:id- Transmit direct message.GET /api/message/get/:id- Load conversation message history.
GET /api/notifications/notification- Retrieve notification stream.PATCH /api/notifications/notification/:id/read- Mark notification as read.POST /api/review/:id- Post review & star rating for a user.GET /api/review/:id- Fetch user feedback history.
To prevent food theft, misdirection, and unauthorized claims, ZeroWaste utilizes an in-app Dual-Phase OTP State Machine:
[Listing Created] ➔ [NGO Claims Listing] ➔ [OTP Generated for Handoff]
│
▼
[Volunteer Reaches NGO/Vendor] ◄── [Volunteer Accepts Run & Pickup]
│
▼
[OTP Verified on Dropoff] ➔ [Status Updated to Delivered]
- Pickup Phase: Volunteer arrives at the donor vendor's location and confirms pickup state in-app.
- Delivery Handoff: The receiving NGO displays an in-app unique OTP code.
- Verification: The Volunteer keys in the OTP, releasing the claim status to
Deliveredin MongoDB atomically.
In urban areas, food waste and community hunger exist side by side. Supermarkets and restaurants regularly dispose of high-quality edible inventory simply because of inventory rotation or near-term expiration dates.
Traditional food bank models suffer from scheduling friction and high transport costs. ZeroWaste solves this by turning surplus redistribution into an agile, on-demand network—combining real-time geolocation matching, crowdsourced volunteer transport, and automated chain-of-custody verification.
- Decision: Built a clean modular monolith architecture rather than fragmented microservices.
- Rationale: Keeps authentication, Socket.io websockets, and MongoDB transaction logic in single-hop sync, reducing network overhead and deployment complexity.
- Decision: Integrated Socket.io for live chat, notification delivery, and status propagation.
- Rationale: Perishable food requires immediate action. WebSockets eliminate latency inherent in polling, allowing NGOs and volunteers to react instantly.
- Decision: Integrated LangChain JS (
@langchain/google-genaiand@langchain/core) for AI assistant prompt orchestration, multi-turn memory, and RAG surplus database context. - Rationale: Standard direct LLM API calls lack session memory and live database context. LangChain's
ChatPromptTemplate,MessagesPlaceholder, and MongoDB context injection allow the assistant to retain conversation history across turns and answer user questions regarding currently available surplus items in real time.
- LangChain JS Architecture:
- Prompt Templating: Refactored static text prompts into structured
ChatPromptTemplateinstances with system roles and user placeholders. - Multi-Turn Session Memory: Converts user and bot message histories into LangChain
HumanMessageandAIMessageobjects for contextual multi-turn conversation. - Live Database RAG Context: Dynamically fetches active food/item listings (
status: "available") from MongoDB and feeds them into the system prompt context. - Resilient Fallback Chains: Wraps model execution in a fallback pipeline across
gemini-3.6-flash,gemini-3.5-flash,gemini-flash-latest, andgemini-1.5-flash.
- Prompt Templating: Refactored static text prompts into structured
- Generative Design Assistance: Used AI for initial UI layout structuring, CSS theme variables, and sample schema design.
- Custom-Engineered Core Logic:
- Dual-phase OTP validation state transitions created manually to prevent race conditions.
- Custom JWT cookie middleware and role authorization guards engineered from scratch.
- Custom Socket.io connection and room lifecycle event handlers written explicitly for database persistence.
- Architectural Overrides:
- Rejected WebRTC peer-to-peer chat suggestions in favor of Socket.io + MongoDB to retain message history for dispute resolution.
- Overrode third-party identity provider suggestions (e.g. Auth0) to maintain direct control over user role models and location coordinates.
- GPS Live Tracking & Geofencing: Integrate Leaflet live routing to auto-detect when a volunteer enters a 50m radius of vendor/NGO coordinates.
- Offline PWA Support: Implement Service Workers and IndexedDB to allow volunteers to update delivery statuses in low-connectivity areas (e.g., basements or loading bays).
- Twilio SMS & WhatsApp Gateway: Send instant OTP and status alerts via SMS so coordinators without active data connections can verify handoffs.
- Visual Spoilage Assessment AI: Enable camera uploads in the listing form to automatically predict food shelf-life before posting.
- Node.js (v18+ recommended)
- npm (v9+ recommended)
- MongoDB Atlas database URI
# Navigate to backend directory
cd backend
# Install dependencies
npm install
# Create a .env file with the following variables
PORT=3002
MONGODB_URI=your_mongodb_connection_string
JWT_TOKEN=your_jwt_secret_key
CLOUD_NAME=your_cloudinary_cloud_name
API_KEY=your_cloudinary_api_key
API_SECRET=your_cloudinary_api_secret
BOT_API_KEY=your_google_gemini_api_key
BOT_API_ENDPOINT=https://generativelanguage.googleapis.com/v1beta/models/gemini-3.6-flash:generateContent# Navigate to frontend directory
cd ../frontend
# Install dependencies
npm installOpen two terminal sessions to launch both servers simultaneously:
Terminal 1 (Backend):
cd backend
npm run devBackend runs on: http://localhost:3002
Terminal 2 (Frontend):
cd frontend
npm run devFrontend runs on: http://localhost:5173
Access the web application by opening http://localhost:5173 in your browser.
You can run the entire ZeroWaste application using Docker and Docker Compose without manually installing Node.js or local dependencies.
- Docker Desktop installed and running.
Ensure your backend/.env file is configured, then execute:
# Build images and start all services in detached mode
docker compose up --build -d- Frontend App: Accessible at http://localhost (Port
80or5173) - Backend API: Accessible at http://localhost:3002
- Health Check: Test backend connectivity at
http://localhost:3002/health
To run the app with a dedicated local MongoDB container instead of MongoDB Atlas:
docker compose --profile local-db up --build -ddocker compose downMade with ❤️ for Zero Waste and Sustainable Communities