A full-stack MERN application that connects people giving away household items they no longer need with people who would rather reuse than buy new. List a gift, browse what's nearby, filter by category and condition, and message the giver.
Built as the capstone project for the IBM Full Stack Software Developer Professional Certificate (Coursera).
Three independently deployable services:
├── giftlink-frontend/ React 18 SPA — Bootstrap 5, React Router 6
├── giftlink-backend/ Express REST API — MongoDB, JWT auth, Pino logging
└── sentiment/ Standalone sentiment-analysis microservice for reviews
The frontend talks to the backend over REST. The backend delegates review sentiment scoring to the
sentiment service, keeping that concern out of the main API — so it can be scaled or replaced
without touching the core application.
Frontend — React 18 · React Router 6 · React Bootstrap · react-datepicker
Backend — Express 4 · MongoDB 6 (native driver) · jsonwebtoken · bcryptjs ·
express-validator · Pino structured logging · CORS
Testing — Mocha · Chai · Sinon · Supertest (backend) · React Testing Library (frontend)
CI/CD — GitHub Actions: JSHint linting on the backend, production build verification on the client
- Gift listings — post items with category, condition, and images; browse the full catalogue
- Search & filter — dedicated search routes with category, condition, and age filtering
- Authentication — JWT-based registration and login, passwords hashed with bcrypt
- Input validation —
express-validatoron every write path - Sentiment analysis — reviews scored by a separate microservice
- Structured logging — Pino with pretty-printing in development
| Router | Responsibility |
|---|---|
authRoutes.js |
Registration, login, JWT issuance, profile updates |
giftRoutes.js |
Gift CRUD — list, detail, create |
searchRoutes.js |
Filtered search across the gift catalogue |
Prerequisites: Node.js 18+, a MongoDB instance (local or Atlas)
cd giftlink-backend
npm install
cp .env.sample .env # then fill in your own values
npm run devRequired environment variables:
| Variable | Description |
|---|---|
MONGO_URL |
MongoDB connection string |
DB_NAME |
Database name |
JWT_SECRET |
Secret used to sign JWTs — use a long random value |
cd sentiment
npm install
node index.jscd giftlink-frontend
npm install
cp .env.sample .env # set REACT_APP_BACKEND_URL
npm startThe app runs on http://localhost:3000.
cd giftlink-backend && npm test # Mocha + Chai + Supertest
cd giftlink-frontend && npm test # React Testing Library