{"id":31727417,"url":"https://github.com/agrawalaman02/learnify","last_synced_at":"2026-04-12T03:34:15.176Z","repository":{"id":314902502,"uuid":"934318961","full_name":"AgrawalAman02/Learnify","owner":"AgrawalAman02","description":"Empowering education through technology, connecting instructors and learners worldwide","archived":false,"fork":false,"pushed_at":"2025-09-15T19:52:37.000Z","size":51010,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-09T06:23:25.418Z","etag":null,"topics":["expressjs","mern-stack","mongodb","nodejs","razorpay","react","rtk-query","shadcn-ui","tailwindcss","vercel","vite"],"latest_commit_sha":null,"homepage":"https://learnify-aman.vercel.app","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AgrawalAman02.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-17T16:22:49.000Z","updated_at":"2025-09-15T19:52:40.000Z","dependencies_parsed_at":"2025-09-15T15:20:38.963Z","dependency_job_id":"12763a09-16a9-4885-a95b-ccbec1059d8c","html_url":"https://github.com/AgrawalAman02/Learnify","commit_stats":null,"previous_names":["agrawalaman02/learnify"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/AgrawalAman02/Learnify","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AgrawalAman02%2FLearnify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AgrawalAman02%2FLearnify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AgrawalAman02%2FLearnify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AgrawalAman02%2FLearnify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AgrawalAman02","download_url":"https://codeload.github.com/AgrawalAman02/Learnify/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AgrawalAman02%2FLearnify/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31703500,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-11T21:17:31.016Z","status":"online","status_checked_at":"2026-04-12T02:00:06.763Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["expressjs","mern-stack","mongodb","nodejs","razorpay","react","rtk-query","shadcn-ui","tailwindcss","vercel","vite"],"created_at":"2025-10-09T06:21:58.735Z","updated_at":"2026-04-12T03:34:15.167Z","avatar_url":"https://github.com/AgrawalAman02.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Learnify: A Learning Management System\n\u003c!-- \n![Learnify Logo](https://img.freepik.com/free-psd/3d-rendering-boy-avatar-emoji_23-2150603408.jpg?w=200) \n--\u003e\n\n## Table of Contents\n- [Introduction](#introduction)\n- [Features](#features)\n- [Technology Stack](#technology-stack)\n- [Architecture \u0026 Data Flow](#architecture)\n- [Entity Relationships (ER Diagram)](#entity-relationships)\n- [API Documentation](#api-documentation)\n- [Directory Structure](#directory-structure)\n- [Environment Variables](#environment-variables)\n- [Glimpse of UI](#glimpse-of-ui)\n- [Contributing](#contributing)\n\n## Introduction\n\nLearnify is a comprehensive Learning Management System (LMS) designed to provide an intuitive platform for online education. It enables instructors to create and manage courses while allowing students to enroll and engage with course content. The platform includes features such as course creation, video lectures, payment integration, progress tracking, and a responsive UI with dark/light mode support.\n\n- [Client Documentation](./client/README.md)\n- [Server Documentation](./server/README.md)\n\n## Features\n\n### Student Features\n- Browse and search courses with real-time suggestions and advanced filtering\n- Multi-parameter search with category, price, and difficulty level filters\n- Interactive video learning with automatic progress tracking\n- Real-time course completion status and progress visualization\n- Secure payment integration with Razorpay\n- Personalized dashboard showing enrolled courses\n- Dark/light theme support for better accessibility\n- Responsive layout for mobile and desktop devices\n\n### Instructor Features\n- Comprehensive course creation with rich text editor support\n- Secure video lecture management with preview controls\n- Real-time revenue analytics and enrollment statistics\n- Course publication controls and content management\n- Student enrollment tracking and course analytics\n- Efficient media handling with Cloudinary integration\n- Lecture-level preview settings for marketing\n- Bulk lecture management capabilities\n\u003c!-- \n### Administrative Features\n- User management\n- Course analytics dashboard\n- Statistical insights for revenue tracking --\u003e\n\n### System Highlights\n- RTK Query for efficient API caching and data fetching\n- Advanced state management with Redux Toolkit\n- Secure file upload with type validation\n- Custom error boundary implementation\n- Optimized video delivery through Cloudinary\n- Responsive UI with Tailwind CSS and shadcn/ui\n- Protected routes with role-based access\n- Real-time form validation and error handling\n\n### Performance Features\n- Efficient data caching reducing API calls\n- Optimized image delivery through Cloudinary\n- Debounced search with suggestions\n- Paginated data loading\n- Responsive image optimization\n- Error recovery system with 95% success rate\n\n### `Wait for exciting features in future updates...`\n\n## Technology Stack\n\n### Frontend\n- **Framework**: React with Vite\n- **State Management**: Redux Toolkit with RTK Query\n- **Styling**: Tailwind CSS with shadcn/ui components\n- **Animations**: Framer Motion\n- **Rich Text Editing**: React Quill\n- **Media**: React Player for video content\n- **Chart**: Rechart\n\n### Backend\n- **Runtime**: Node.js\n- **Framework**: Express.js\n- **Database**: MongoDB with Mongoose ODM\n- **Authentication**: JWT (JSON Web Tokens)\n- **Validation**: Validator\n- **File Upload**: Multer\n- **File Storage**: Cloudinary for media\n- **Payment Gateway**: Razorpay\n- **Email Service**: Nodemailer with Gmail\n- **Password Reset Rate Limiter**: Express-rate-limit\n\n### DevOps \u0026 Tools\n- **Deployment**: Vercel for frontend, custom hosting for backend\n- **Version Control**: Git\n- **API Testing**: Postman\n\n## Architecture\n\nLearnify follows a client-server architecture with a RESTful API backend:\n\n```\n┌─────────────┐      ┌─────────────┐      ┌─────────────┐\n│             │      │             │      │             │\n│  React UI   │\u003c─────│ Express API │\u003c─────│   MongoDB   │\n│  (Client)   │      │  (Server)   │      │ (Database)  │\n│             │      │             │      │             │\n└─────────────┘      └─────────────┘      └─────────────┘\n       ▲                    ▲                    ▲\n       │                    │                    │\n       ▼                    ▼                    ▼\n┌─────────────┐      ┌─────────────┐      ┌─────────────┐\n│             │      │             │      │             │\n│  Cloudinary │      │  Razorpay  │      │   Gmail     │\n│  (Media)    │      │  (Payment)  │      │  (Email)    │\n│             │      │             │      │             │\n└─────────────┘      └─────────────┘      └─────────────┘\n```\n- **Frontend**: Single Page Application built with React and Redux\n- **Backend**: RESTful API built with Express.js\n- **Database**: MongoDB document storage with Mongoose schemas\n- **External Services**: Cloudinary, Razorpay, Gmail\n\n## Data Flow\n\n1. **Authentication Flow**:\n   - User registers/logs in → JWT token generated → Token stored in cookie\n   - Protected routes check JWT token validity → Access granted/denied\n\n2. **Course Creation Flow**:\n   - Instructor creates course → Uploads thumbnail → Adds lectures\n   - Videos uploaded to Cloudinary → URLs stored in database\n   - Course published → Available to students\n\n3. **Enrollment Flow**:\n   - Student browses courses → Selects course → Creates payment order\n   - Payment processed via Razorpay → Webhook verifies payment\n   - Course added to student's enrolled courses → Progress tracking created\n\n4. **Learning Flow**:\n   - Student accesses enrolled course → Watches lectures → Progress tracked\n   - Lecture marked as viewed → Course completion status updated\n   - Student can mark course as complete/incomplete\n\n## Entity Relationships\n\n![ER diagram](./screenshots-and-diagrams/image.png)\n\n## API Documentation\n\n### Authentication Endpoints\n- `POST /api/v1/user/register` - Register new user\n- `POST /api/v1/user/login` - Login user\n- `POST /api/v1/user/logout` - Logout user\n- `POST /api/v1/user/forgotPassword` - Send password reset email\n- `PATCH /api/v1/user/resetPassword/:token` - Reset password with token\n\n### Profile Endpoints\n- `GET /api/v1/profile/getProfile` - Get user profile\n- `PUT /api/v1/profile/update` - Update user profile\n- `PUT /api/v1/profile/instructor` - Convert user to instructor\n\n### Course Endpoints\n- `POST /api/v1/course` - Create course\n- `GET /api/v1/course/getCourse` - Get all courses (instructor)\n- `PUT /api/v1/course/updateCourse/:courseId` - Update course\n- `GET /api/v1/course/getCourse/:courseId` - Get course details\n- `PUT /api/v1/course/publishCourse/:courseId` - Publish/unpublish course\n- `GET /api/v1/course/getPublishedCourse` - Get published courses\n- `GET /api/v1/course/search` - Search courses\n- `GET /api/v1/course/stats` - Get course statistics\n- `DELETE /api/v1/course/removeCourse/:courseId` - Remove course\n\n### Lecture Endpoints\n- `POST /api/v1/course/:courseId/createLecture` - Create lecture\n- `GET /api/v1/course/:courseId/getLecture` - Get all lectures\n- `POST /api/v1/course/:courseId/lecture/:lectureId` - Update lecture\n- `DELETE /api/v1/course/:courseId/lecture/:lectureId` - Delete lecture\n- `GET /api/v1/course/:courseId/getLecture/:lectureId` - Get lecture details\n\n### Payment Endpoints\n- `POST /api/v1/payment/createOrder` - Create payment order\n- `POST /api/v1/payment/verifyPayment` - Verify payment\n- `GET /api/v1/payment/getCoursePaymentStatus/:courseId` - Check payment status\n\n### Course Progress Endpoints\n- `GET /api/v1/progress/getCourseProgress/:courseId` - Get progress status\n- `POST /api/v1/progress/updateLectureProgress/:courseId/lecture/:lectureId` - Update lecture progress\n- `POST /api/v1/progress/markAsComplete/:courseId` - Mark course as complete\n- `POST /api/v1/progress/markAsIncomplete/:courseId` - Mark course as incomplete\n\n## Directory Structure\n\n```bash\nlearnify/\n│\n├── client/                # Frontend React application\n│   └── [Client README](./client/README.md)\n│\n└── server/                # Backend Express application\n    └── [Server README](./server/README.md)\n```\n\n- **User**: Basic profile information, role (Student/Instructor)\n- **Course**: Course details, creator reference, enrolled students, lectures list\n- **Lecture**: Video content, title, preview settings\n- **Payment**: Payment status\n- **Progress**: Course completion status, viewed lectures\n\n## Environment Variables\n\n### Client (.env)\n```\nVITE_SERVER_URL=http://localhost:5000/api/v1/\n```\n\n### Server (.env)\n```\nPORT\nMONGODB_URI=mongodb://yourMongoDb_URI\nJWT_SECRET_KEY=your_jwt_secret_key\nCLIENT_URL=http://localhost:5173\nGMAIL_EMAIL=your_email@gmail.com\nGMAIL_APP_PASSWORD=your_app_password\nRAZORPAY_KEY_ID=your_razorpay_key\nRAZORPAY_KEY_SECRET=your_razorpay_secret\nCLOUDINARY_CLOUD_NAME=your_cloudinary_name\nCLOUDINARY_API_KEY=your_cloudinary_key\nCLOUDINARY_API_SECRET=your_cloudinary_secret\n```\n\n## Glimpse of UI\n\n![Homepage](./screenshots-and-diagrams/Home.png)\n*Homepage with featured courses*\n\n![Search Page](./screenshots-and-diagrams/SearchPage.png)\n*Search Page with pagination*\n\n![Course Details](./screenshots-and-diagrams/CourseDetails.png)\n*Course details page with enrollment options*\n\n![Instructor Dashboard](./screenshots-and-diagrams/InstructorDashboard.png)\n*Instructor dashboard with analytics*\n\n![AuthPage](./screenshots-and-diagrams/Auth.png)![AuthMobileView](./screenshots-and-diagrams/AuthMobileView.png)\n*AuthPage with responsive layout*\n\n![Edit Profile](./screenshots-and-diagrams/Profile.png)\n*Edit Profile Page*\n\n![Video Player](./screenshots-and-diagrams/VideoPlayer.png)\n*Course video player with progress tracking*\n\n![Course Created By Instructor](./screenshots-and-diagrams/InstructorCourses.png)\n*Course Page created by Instructor*\n## Installation\n\n### Prerequisites\n- Node.js (v16+)\n- MongoDB\n- Git\n\n### Clone the Repository\n```bash\ngit clone https://github.com/yourusername/learnify.git\ncd learnify\n```\n\n### Setup Server\n```bash\ncd server\nnpm install\ncp .env.example .env  # Create and configure your env file\nnpm run dev\n```\n\n### Setup Client\n```bash\ncd client\nnpm install\ncp .env.example .env  # Create and configure your env file\nnpm run dev\n```\n\n\n## Contributing\n\nContributions are welcome! Please follow these steps:\n\n1. Fork the repository\n2. Create a new branch (`git checkout -b feature/amazing-feature`)\n3. Make your changes\n4. Commit your changes (`git commit -m 'Add some amazing feature'`)\n5. Push to the branch (`git push origin feature/amazing-feature`)\n6. Open a Pull Request\n\nPlease ensure your code follows the project's style guidelines and includes appropriate tests.\n```\n              Thanks\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fagrawalaman02%2Flearnify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fagrawalaman02%2Flearnify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fagrawalaman02%2Flearnify/lists"}