QuirkyRoomie is a full-stack MERN app for managing flatmate conflicts through complaint tracking, voting, leaderboards, and flat-level stats.
Shared living gets messy. QuirkyRoomie gives everyone a transparent system to:
- log household complaints,
- vote on issues fairly,
- resolve conflicts with accountability,
- and track karma on a leaderboard.
- JWT-based authentication (register, login, current user)
- Complaint lifecycle (create, list, view, vote, resolve)
- Trending complaints feed
- Leaderboard views (top karma and most complained users)
- Flat analytics (members and statistics)
- Responsive React UI with protected routes
- Node.js + Express
- MongoDB + Mongoose
- JWT + bcryptjs
- express-validator
- React 19 + Vite
- React Router 7
- Axios
- Tailwind CSS 4
QuirkyRoomie/
├─ backend/
│ ├─ server.js
│ └─ src/
│ ├─ config/
│ ├─ controllers/
│ ├─ middleware/
│ ├─ models/
│ ├─ routes/
│ └─ utils/
├─ frontend/
│ ├─ index.html
│ ├─ public/
│ └─ src/
│ ├─ components/
│ ├─ context/
│ ├─ pages/
│ ├─ services/
│ └─ styles/
└─ README.md
- Node.js 18+
- npm 9+
- MongoDB instance (local or Atlas)
cd backend
npm install
cd ../frontend
npm installCreate backend/.env:
PORT=5000
MONGODB_URI=mongodb+srv://<username>:<password>@<cluster>.mongodb.net/quirkyroomie
JWT_SECRET=replace_with_a_long_random_secretTerminal 1 (backend):
cd backend
npm run devTerminal 2 (frontend):
cd frontend
npm run devOpen the frontend URL shown by Vite (typically http://localhost:5173).
npm run dev— start API with nodemonnpm start— start API with Node
npm run dev— start Vite dev servernpm run build— create production buildnpm run preview— preview production build locally
Base URL: http://localhost:5000/api
POST /auth/registerPOST /auth/loginGET /auth/me(protected)
POST /complaints(protected)GET /complaints(protected)GET /complaints/trending(protected)GET /complaints/:id(protected)POST /complaints/:id/vote(protected)PUT /complaints/:id/resolve(protected)
GET /leaderboard(protected)GET /leaderboard/complaints(protected)
GET /flat/stats(protected)GET /flat/members(protected)
Protected routes require
Authorization: Bearer <token>.
cd frontend
npm run buildThe production output is generated in frontend/dist.
- If MongoDB fails to connect, verify
MONGODB_URIand network access rules (Atlas IP allowlist). - If auth fails unexpectedly, verify
JWT_SECRETexists and backend was restarted after.envchanges. - If ports are busy, change backend
PORTor let Vite auto-switch frontend port.
- Backend and frontend each have their own README files for deeper, layer-specific details.
- This root README is the quickest end-to-end setup guide.