A full-stack Learning Management System (LMS) built with the MERN stack, featuring course management, payment processing, and real-time progress tracking.
- Course Discovery: Browse and search courses with advanced filtering
- Secure Payments: Integrated Stripe payment processing
- Progress Tracking: Track course completion and lecture progress
- Video Player: Built-in YouTube video player with chapter navigation
- Responsive Design: Fully responsive across all devices
- User Authentication: Secure authentication via Clerk
- Course Creation: Rich text editor for course descriptions
- Content Management: Add chapters and lectures with video URLs
- Student Analytics: Track enrollments and earnings
- Course Editing: Update course content and pricing
- Dashboard: Overview of courses and student engagement
- React 18 - UI library
- React Router v6 - Client-side routing
- Tailwind CSS - Utility-first CSS framework
- Axios - HTTP client
- Quill - Rich text editor
- React YouTube - Video player integration
- React Toastify - Toast notifications
- Node.js - Runtime environment
- Express.js - Web framework
- MongoDB - NoSQL database
- Mongoose - ODM for MongoDB
- Clerk - Authentication and user management
- Stripe - Payment processing
- Cloudinary - Image/video storage
- MongoDB Atlas - Cloud database
- Vercel - Frontend and backend hosting
- GitHub - Version control
- Node.js (v16 or higher)
- MongoDB Atlas account
- Clerk account
- Stripe account
- Cloudinary account
git clone https://github.com/yourusername/skillbridge-lms.git
cd skillbridge-lmscd server
npm install
# Create .env file
cat > .env << EOF
MONGODB_URI=your_mongodb_connection_string
CLERK_PUBLISHABLE_KEY=your_clerk_publishable_key
CLERK_SECRET_KEY=your_clerk_secret_key
STRIPE_SECRET_KEY=your_stripe_secret_key
CLOUDINARY_NAME=your_cloudinary_name
CLOUDINARY_API_KEY=your_cloudinary_api_key
CLOUDINARY_API_SECRET=your_cloudinary_api_secret
CURRENCY=USD
PORT=5000
EOF
# Start server
npm startcd client
npm install
# Create .env file
cat > .env << EOF
VITE_BACKEND_URL=http://localhost:5000
VITE_CLERK_PUBLISHABLE_KEY=your_clerk_publishable_key
VITE_CURRENCY=$
EOF
# Start development server
npm run dev- Push code to GitHub
- Import project to Vercel
- Set Root Directory to
server - Add environment variables
- Deploy
- Import same repository
- Set Root Directory to
client - Set Framework Preset to
Vite - Add environment variables
- Deploy
MONGODB_URI= # MongoDB connection string
CLERK_PUBLISHABLE_KEY= # Clerk public key
CLERK_SECRET_KEY= # Clerk secret key
STRIPE_SECRET_KEY= # Stripe secret key
CLOUDINARY_NAME= # Cloudinary cloud name
CLOUDINARY_API_KEY= # Cloudinary API key
CLOUDINARY_API_SECRET= # Cloudinary API secret
CURRENCY=USD # Default currency
PORT=5000 # Server port
VITE_BACKEND_URL= # Backend API URL
VITE_CLERK_PUBLISHABLE_KEY= # Clerk public key
VITE_CURRENCY=$ # Currency symbol
- User selects course and clicks "Enroll Now"
- Stripe checkout session created
- User completes payment
- Webhook verifies payment
- User enrolled in course
- Redirect to course player
- Lecture completion marked via API
- Progress percentage calculated in real-time
- Completed courses tracked separately
- Resume from last watched lecture
- Clerk handles all authentication
- JWT tokens for API authorization
- Protected routes on frontend and backend
- User data synced between Clerk and MongoDB
- Mobile-first approach
- Breakpoints: sm (640px), md (768px), lg (1024px), xl (1280px)
- Touch-friendly interface
- Optimized images and lazy loading
# Backend tests
cd server
npm test
# Frontend tests
cd client
npm test- Image optimization via Cloudinary
- Lazy loading for course cards
- Debounced search functionality
- Efficient MongoDB queries with indexes
- Code splitting in React
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit changes (
git commit -m 'Add AmazingFeature') - Push to branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Your Name
- Email: mxmsdcms203@gmail.com
β If you found this project helpful, please consider giving it a star!
