PrepMate is a full-stack web application that helps students prepare for technical interviews in a structured and interactive way.
It enables students to:
- 📚 Practice subject-wise questions with subtopic categorization
- 📊 Track learning progress with real-time progress bars
- 📝 Share and explore interview experiences from peers
Built with a modern React + Tailwind + Shadcn UI frontend, and a PostgreSQL + Prisma backend, PrepMate ensures both performance and scalability. Optimized APIs are powered by Redis caching for lightning-fast responses.
-
🔐 Authentication & Authorization
Secure login system with JWT-based authentication and role-based access (User/Admin). -
📖 Subjects & Subtopics Management
Organize practice material by subject → subtopic → question. -
❓ Question Bank
- Add, update, and delete subject-wise questions.
- Fast retrieval with Redis caching + invalidation.
-
✅ Progress Tracking
- Track completion status of each question.
- Visualize progress through interactive progress bars.
-
📝 Interview Experiences
- Share real-world interview stories.
- Public experiences visible upon admin approval.
-
⚡ Optimized APIs with Redis
- Reduced DB load through caching.
- Intelligent cache invalidation ensures data consistency.
-
🎨 Modern UI/UX
- Responsive design using Tailwind CSS.
- Prebuilt components with Shadcn UI.
- Smooth animations with Framer Motion.
- Frontend → React, Tailwind CSS, Shadcn UI, Framer Motion
- Backend → Node.js, Express.js
- Database → PostgreSQL (Prisma ORM)
- Caching → Redis (Upstash)
- Deployment → Vercel (Frontend + Backend), NeonDB (Postgres), Upstash Redis
- Clone the repository
git clone https://github.com/your-username/prepmate.git cd prepmate - Install dependencies
npm install - Configure environment variables
Create a .env file in the root with:
DATABASE_URL=your_postgres_url REDIS_URL=your_redis_url FRONTEND_URL=http://localhost:3000 JWT_SECRET=your_jwt_secret - Run Prisma migrations
npx prisma migrate dev - Start the backend
npm run dev - Start the frontend
cd frontend npm run dev
| Endpoint | TTL (Time-to-Live) | Invalidation Condition |
|---|---|---|
/subjects |
12 hours | On adding a new subject, subtopic, or question |
/subtopics/:subject |
1 hour | On adding a new subtopic |
/questions/:subtopic |
15 minutes | On add, update, or delete question |
/interview/public |
30 minutes | On approve or delete interview experience |
- Subjects (12h) → Subjects are relatively stable and change less frequently, so a longer TTL reduces redundant database calls.
- Subtopics (1h) → Subtopics may get updated more often than subjects but not as frequently as questions, hence a moderate TTL.
- Questions (15m) → Questions are dynamic and likely to be added, updated, or removed frequently, so the cache is kept short.
- Public Interview Experiences (30m) → These are user-submitted and pending moderation, so a shorter TTL ensures faster reflection of approval or deletion.