A peer-to-peer marketplace for IIT Indore students and faculty to buy and sell second-hand goods. Built with a Next.js frontend and an Express + Prisma backend, with Clerk for authentication, Cloudinary for image uploads, and Dodo Payments for checkout.
🔗 Live: iitishop.vercel.app
| Layer | Technology |
|---|---|
| Frontend | Next.js 15, React 19, Tailwind CSS, shadcn/ui |
| Backend | Node.js, Express.js, TypeScript |
| ORM | Prisma |
| Database | MySQL |
| Auth | Clerk |
| Payments | Dodo Payments |
| Image Storage | Cloudinary |
iitishop/
├── backend/ # Express + Prisma REST API
│ ├── prisma/ # Schema and migrations
│ └── src/
│ ├── controllers/
│ ├── routes/
│ ├── middleware/
│ └── index.ts
└── frontend/ # Next.js app
└── src/
├── app/ # App router pages & API routes
├── components/
├── hooks/
└── types/
- Node.js 18+
- A running MySQL database
- Accounts for: Clerk, Cloudinary, Dodo Payments
git clone https://github.com/yasharyasaxena/iitishop.git
cd iitishopcd backend
npm installCreate a .env file in the backend/ directory:
DATABASE_URL="mysql://USER:PASSWORD@HOST:PORT/DATABASE"
PORT=3000Run Prisma migrations and generate the client:
npx prisma migrate dev
npx prisma generateStart the dev server:
npm run devThe API will be available at http://localhost:3000. You can verify it with the health check endpoint: GET /health.
cd ../frontend
npm installCreate a .env.local file in the frontend/ directory:
# Clerk (https://dashboard.clerk.com)
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
CLERK_SECRET_KEY=sk_test_...
# URL of the running backend
NEXT_PUBLIC_API_URL=http://localhost:3000
# Cloudinary (https://cloudinary.com/console)
CLOUDINARY_CLOUD_NAME=your_cloud_name
CLOUDINARY_UPLOAD_PRESET=your_upload_presetStart the dev server:
npm run devThe app will be available at http://localhost:3001 (or the next available port).
| Variable | Description |
|---|---|
DATABASE_URL |
MySQL connection string (e.g. mysql://user:pass@localhost:3306/iitishop) |
PORT |
Port for the Express server (default: 3000) |
| Variable | Description |
|---|---|
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY |
Clerk publishable key (public) |
CLERK_SECRET_KEY |
Clerk secret key (server-only) |
NEXT_PUBLIC_API_URL |
Base URL of the backend API |
CLOUDINARY_CLOUD_NAME |
Your Cloudinary cloud name (server-only) |
CLOUDINARY_UPLOAD_PRESET |
Cloudinary unsigned upload preset (server-only) |
| Command | Description |
|---|---|
npm run dev |
Start dev server with nodemon |
npm run build |
Compile TypeScript to dist/ |
npm run start |
Run compiled production build |
npm run prisma:generate |
Re-generate Prisma client |
npm run prisma:studio |
Open Prisma Studio |
| Command | Description |
|---|---|
npm run dev |
Start Next.js dev server |
npm run build |
Build for production |
npm run start |
Start production server |
npm run lint |
Run ESLint |
- Browse and search product listings by category
- Seller dashboard to create, edit, and manage listings
- Product image uploads via Cloudinary
- Order management for buyers and sellers
- Checkout and payments via Dodo Payments
- Auth and user profiles via Clerk
- Review and reporting system
- In-app messaging between users