A comprehensive backend platform with AI-powered recommendations, user management, content moderation, and administrative dashboard.
Atlas is a production-ready backend platform that combines modern authentication, AI-powered recommendations, comprehensive content management, and a full-featured admin dashboard. Built with TypeScript, Express.js, and MongoDB, it provides everything needed for a scalable web application backend.
- 🔐 JWT Authentication - Secure user registration, login, and token management
- 🤖 AI Recommendations - Intelligent content recommendations based on user interests
- 📊 Admin Dashboard - Complete administrative interface with analytics and user management
- 🛡️ Role-Based Access - User, moderator, and admin role management
- 📝 Content Management - Full CRUD operations for events, organizations, and labs
- 📈 Analytics & Reporting - Detailed system analytics with data export capabilities
- 🔍 Advanced Search - Flexible search and filtering across all content types
- ⚡ Performance Optimized - Efficient MongoDB queries and response caching
Atlas Backend Platform
├── 🔐 Authentication Module
│ ├── JWT Token Management
│ ├── Password Hashing (bcrypt)
│ └── Role-Based Access Control
├── 🤖 AI Recommendations Engine
│ ├── Interest-Based Matching
│ ├── Content Scoring Algorithm
│ └── Dynamic Recommendation Updates
├── 📚 Content Management System
│ ├── Events Management
│ ├── Organizations Directory
│ └── Labs & Projects Hub
├── 🎛️ Admin Dashboard Backend
│ ├── User Management & Analytics
│ ├── Content Moderation System
│ ├── System Health Monitoring
│ └── Data Export & Reporting
└── 🌐 REST API Layer
├── Express.js Server
├── Middleware Stack
└── Error Handling System
- Node.js v16.0.0 or higher
- MongoDB v4.4 or higher
- npm or yarn package manager
Clone the repository:
git clone https://github.com/your-username/atlas.git cd atlasInstall dependencies:
npm install
Environment Setup:
cp .env.example .env
Configure your
.envfile:# Server ConfigurationPORT=3001NODE_ENV=development# DatabaseMONGODB_URI=mongodb://localhost:27017/atlas# JWT ConfigurationJWT_SECRET=your-super-secret-jwt-keyJWT_EXPIRES_IN=24hJWT_REFRESH_SECRET=your-refresh-secret-keyJWT_REFRESH_EXPIRES_IN=7d# Admin ConfigurationADMIN_SESSION_TIMEOUT=3600000ADMIN_MAX_LOGIN_ATTEMPTS=5# FeaturesRECOMMENDATIONS_ENABLED=trueANALYTICS_ENABLED=true
Start MongoDB:
# Using MongoDB service sudo systemctl start mongod # Or using Docker docker run -d -p 27017:27017 --name atlas-mongo mongo:latest
Run the application:
# Development mode with hot reload npm run dev # Production mode npm run build npm start
Verify installation:
curl http://localhost:3001/api/health
atlas/
├── src/backend/
│ ├── modules/
│ │ ├── api/
│ │ │ ├── routes/
│ │ │ │ ├── auth/ # Authentication routes
│ │ │ │ ├── users/ # User management routes │ │ │ │ ├── events/ # Events CRUD routes
│ │ │ │ ├── organizations/ # Organizations routes
│ │ │ │ ├── labs/ # Labs routes
│ │ │ │ ├── recommendations/ # AI recommendations
│ │ │ │ └── admin/ # Admin dashboard routes
│ │ │ │ ├── dashboard.ts
│ │ │ │ ├── users.ts
│ │ │ │ ├── content.ts
│ │ │ │ ├── analytics.ts
│ │ │ │ └── middleware.ts
│ │ │ └── index.ts # API routes aggregator
│ │ ├── database/
│ │ │ ├── models/ # MongoDB schemas
│ │ │ │ ├── User.ts
│ │ │ │ ├── Event.ts
│ │ │ │ ├── Organization.ts
│ │ │ │ └── Lab.ts
│ │ │ └── connection.ts # Database connection
│ │ ├── auth/
│ │ │ ├── middleware.ts # JWT middleware
│ │ │ └── utils.ts # Auth utilities
│ │ └── recommendations/
│ │ └── engine.ts # AI recommendation engine
│ ├── middleware/ # Global middleware
│ ├── types/ # TypeScript type definitions
│ └── utils/ # Utility functions
├── server.ts # Express server setup
├── package.json
├── tsconfig.json
├── README.md # This file
└── ADMIN-DASHBOARD.md # Admin documentation
// Register new userPOST/auth/register{"name": "John Doe","username": "johndoe","email": "john@example.com","password": "securePassword123","interests": [1,2,3]}// User loginPOST/auth/login{"username": "johndoe","password": "securePassword123"}// Refresh JWT tokenPOST/auth/refresh{"refreshToken": "your_refresh_token_here"}// Get current user profileGET/auth/profile
Authorization: Bearer<your_jwt_token>// Get all users (paginated)GET/users?page=1&limit=20&search=john// Get user by IDGET/users/:id// Update user profilePUT/users/:id
Authorization: Bearer<jwt_token>// Delete user accountDELETE/users/:id
Authorization: Bearer<jwt_token>// Get all eventsGET/events?page=1&limit=20&search=hackathon&location=NYC// Create new eventPOST/eventsAuthorization: Bearer<jwt_token>{"title": "Tech Conference 2024","description": "Annual technology conference","date": "2024-06-15","location": "New York City","organizer": "Tech Corp"}// Get event by IDGET/events/:id// Update eventPUT/events/:id
Authorization: Bearer<jwt_token>// Delete eventDELETE/events/:id Authorization: Bearer<jwt_token>// Get all organizationsGET/organizations?page=1&limit=20&search=tech&type=startup// Create organizationPOST/organizationsAuthorization: Bearer<jwt_token>{"name": "Tech Innovators Inc","description": "Leading technology innovation company","type": "startup","location": "San Francisco","website": "https://techinnovators.com"}// Organization CRUD operationsGET/organizations/:idPUT/organizations/:idDELETE/organizations/:id// Get all labsGET/labs?page=1&limit=20&search=AI&field=machine-learning// Create lab/projectPOST/labsAuthorization: Bearer<jwt_token>{"name": "AI Research Lab","description": "Cutting-edge artificial intelligence research","field": "machine-learning","leader": "Dr. Sarah Johnson","status": "active"}// Lab CRUD operationsGET/labs/:idPUT/labs/:idDELETE/labs/:id// Get personalized recommendationsGET/recommendations
Authorization: Bearer<jwt_token>Queryparams: ?type=events&limit=10&includeScore=true// Get recommendations for specific userGET/recommendations/user/:userId
Authorization: Bearer<admin_jwt_token>// Update user interests (affects future recommendations)PUT/recommendations/interests
Authorization: Bearer<jwt_token>{"interests": [1,2,5,8]}All admin endpoints require Authorization: Bearer <admin_jwt_token>
// System overviewGET/admin/dashboard// User management GET/admin/users?page=1&limit=20&role=adminPUT/admin/users/:id/role{"role": "moderator"}// Content moderationGET/admin/content/pending?type=eventsPUT/admin/content/events/:id/approvePUT/admin/content/events/:id/reject{"reason": "Inappropriate content"}// Analytics & reportingGET/admin/analytics/overview?period=30GET/admin/analytics/usersGET/admin/analytics/export?format=json&type=overviewThe Atlas recommendation engine uses an intelligent matching algorithm to provide personalized content suggestions based on user interests and behavior patterns.
- Interest Profiling: Users select interests during registration
- Content Scoring: Each content item is scored against user interests
- Dynamic Ranking: Recommendations are ranked by relevance score
- Continuous Learning: System adapts based on user interactions
// Simplified scoring algorithmfunctioncalculateRecommendationScore(content: Content,userInterests: number[]): number{constbaseScore=50;// Base relevance scoreconstinterestBonus=content.interests?.reduce((score,interest)=>{returnuserInterests.includes(interest) ? score+25 : score;},0)||0;// Additional factorsconstrecencyBonus=calculateRecencyBonus(content.createdAt);constpopularityBonus=calculatePopularityBonus(content.views||0);returnMath.min(100,baseScore+interestBonus+recencyBonus+popularityBonus);}// Get personalized event recommendationsconsteventRecommendations=awaitfetch('/api/recommendations?type=events&limit=5',{headers: {'Authorization': `Bearer ${userToken}`}});// Get mixed content recommendations with scoresconstallRecommendations=awaitfetch('/api/recommendations?limit=10&includeScore=true',{headers: {'Authorization': `Bearer ${userToken}`}});// Update user interests to improve recommendationsawaitfetch('/api/recommendations/interests',{method: 'PUT',headers: {'Authorization': `Bearer ${userToken}`,'Content-Type': 'application/json'},body: JSON.stringify({interests: [1,3,7,12]})});Atlas includes a comprehensive admin dashboard backend for complete system management. See ADMIN-DASHBOARD.md for detailed documentation.
- 📊 System Overview: Real-time system health, performance metrics, and usage statistics
- 👥 User Management: Complete user lifecycle management with role-based access control
- 📝 Content Moderation: Approval workflows for events, organizations, and labs
- 📈 Analytics & Reporting: Detailed system analytics with CSV/JSON export capabilities
- 🔍 Advanced Search: Powerful search and filtering across all system entities
- 🛡️ Security Management: Session tracking, activity logging, and access control
# 1. Create admin user in MongoDB
mongosh atlas
db.users.updateOne(
{ username: 'your_username' }, { $set: { role: 'admin' } }
)
# 2. Login and access admin endpoints
curl -X POST http://localhost:3001/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin_user","password":"admin_password"}'# 3. Use admin token for dashboard access
curl -H "Authorization: Bearer ADMIN_TOKEN" \
http://localhost:3001/api/admin/dashboardinterfaceUser{userId: number;// Auto-increment primary keyname: string;// Full nameusername: string;// Unique usernameemail: string;// Unique email addresspassword: string;// Hashed passwordrole: 'user'|'admin'|'moderator';// User roleinterests: number[];// Array of interest IDscreatedAt: Date;// Registration timestampupdatedAt: Date;// Last update timestamplastLogin?: Date;// Last login timestamp}interfaceEvent{id: string;// MongoDB ObjectIdtitle: string;// Event titledescription?: string;// Event descriptiondate: Date;// Event datelocation?: string;// Event locationorganizer?: string;// Event organizerinterests?: number[];// Related interest IDscreatedBy: number;// User ID of creatorcreatedAt: Date;// Creation timestampupdatedAt: Date;// Last update timestampviews?: number;// View count for popularity}interfaceOrganization{id: string;// MongoDB ObjectIdname: string;// Organization namedescription?: string;// Organization descriptiontype?: string;// Organization typelocation?: string;// Organization locationwebsite?: string;// Organization websiteinterests?: number[];// Related interest IDscreatedBy: number;// User ID of creatorcreatedAt: Date;// Creation timestampupdatedAt: Date;// Last update timestampviews?: number;// View count for popularity}interfaceLab{id: string;// MongoDB ObjectIdname: string;// Lab namedescription?: string;// Lab descriptionfield?: string;// Research fieldleader?: string;// Lab leaderstatus?: string;// Lab statusinterests?: number[];// Related interest IDscreatedBy: number;// User ID of creatorcreatedAt: Date;// Creation timestampupdatedAt: Date;// Last update timestampviews?: number;// View count for popularity}# Server Configuration
PORT=3001 # Server port
NODE_ENV=development # Environment mode
CORS_ORIGIN=http://localhost:3000 # CORS allowed origin# Database Configuration
MONGODB_URI=mongodb://localhost:27017/atlas # MongoDB connection string
MONGODB_OPTIONS={} # Additional MongoDB options# JWT Authentication
JWT_SECRET=your-256-bit-secret # JWT signing secret (use strong secret!)
JWT_EXPIRES_IN=24h # Access token expiration
JWT_REFRESH_SECRET=refresh-secret # Refresh token secret
JWT_REFRESH_EXPIRES_IN=7d # Refresh token expiration# Security Settings
BCRYPT_ROUNDS=12 # Password hashing rounds
RATE_LIMIT_WINDOW=900000 # Rate limit window (15 min)
RATE_LIMIT_MAX=100 # Max requests per window# Feature Flags
RECOMMENDATIONS_ENABLED=true # Enable AI recommendations
ANALYTICS_ENABLED=true # Enable analytics collection
ADMIN_DASHBOARD_ENABLED=true # Enable admin dashboard# Admin Configuration
ADMIN_SESSION_TIMEOUT=3600000 # Admin session timeout (1 hour)
ADMIN_MAX_LOGIN_ATTEMPTS=5 # Max failed login attempts
ADMIN_LOCKOUT_DURATION=1800000 # Account lockout duration (30 min)# Analytics Configuration
ANALYTICS_RETENTION_DAYS=90 # Data retention period
ANALYTICS_EXPORT_MAX_ROWS=10000 # Max rows for data export
ANALYTICS_CACHE_TTL=300000 # Cache TTL (5 minutes)# Logging
LOG_LEVEL=info # Logging level
LOG_FILE=logs/atlas.log # Log file pathFor optimal performance, create these indexes:
// User indexesdb.users.createIndex({"username": 1},{unique: true});db.users.createIndex({"email": 1},{unique: true});db.users.createIndex({"userId": 1},{unique: true});db.users.createIndex({"role": 1});db.users.createIndex({"interests": 1});db.users.createIndex({"createdAt": -1});// Content indexesdb.events.createIndex({"title": "text","description": "text"});db.events.createIndex({"date": 1});db.events.createIndex({"createdAt": -1});db.events.createIndex({"interests": 1});db.organizations.createIndex({"name": "text","description": "text"});db.organizations.createIndex({"type": 1});db.organizations.createIndex({"location": 1});db.organizations.createIndex({"createdAt": -1});db.labs.createIndex({"name": "text","description": "text"});db.labs.createIndex({"field": 1});db.labs.createIndex({"status": 1});db.labs.createIndex({"createdAt": -1});# Run all tests
npm test# Run tests with coverage
npm run test:coverage
# Run tests in watch mode
npm run test:watch
# Run specific test suite
npm test -- --grep "Authentication"# Health check
curl http://localhost:3001/api/health
# User registration
curl -X POST http://localhost:3001/api/auth/register \
-H "Content-Type: application/json" \
-d '{ "name": "Test User", "username": "testuser", "email": "test@example.com", "password": "password123", "interests": [1, 2, 3] }'# User login
curl -X POST http://localhost:3001/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username": "testuser", "password": "password123"}'# Get recommendations (replace TOKEN)
curl -H "Authorization: Bearer TOKEN" \
"http://localhost:3001/api/recommendations?limit=5"# Create event (replace TOKEN)
curl -X POST http://localhost:3001/api/events \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{ "title": "Test Event", "description": "Test event description", "date": "2024-06-15", "location": "Test Location" }'// TypeScript client exampleclassAtlasApiClient{privatebaseURL: string;privatetoken: string|null=null;constructor(baseURL: string='http://localhost:3001/api'){this.baseURL=baseURL;}// Authentication methodsasynclogin(username: string,password: string){constresponse=awaitfetch(`${this.baseURL}/auth/login`,{method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ username, password })});constdata=awaitresponse.json();if(data.success){this.token=data.data.tokens.accessToken;}returndata;}asyncregister(userData: RegisterData){constresponse=awaitfetch(`${this.baseURL}/auth/register`,{method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify(userData)});returnawaitresponse.json();}// Content methodsasyncgetEvents(params?: {page?: number;limit?: number;search?: string}){constqueryString=params ? '?'+newURLSearchParams(paramsasany) : '';constresponse=awaitfetch(`${this.baseURL}/events${queryString}`);returnawaitresponse.json();}asyncgetRecommendations(limit: number=10){constresponse=awaitfetch(`${this.baseURL}/recommendations?limit=${limit}`,{headers: {'Authorization': `Bearer ${this.token}`}});returnawaitresponse.json();}asynccreateEvent(eventData: CreateEventData){constresponse=awaitfetch(`${this.baseURL}/events`,{method: 'POST',headers: {'Authorization': `Bearer ${this.token}`,'Content-Type': 'application/json'},body: JSON.stringify(eventData)});returnawaitresponse.json();}}// Usageconstclient=newAtlasApiClient();awaitclient.login('username','password');constrecommendations=awaitclient.getRecommendations(5);constevents=awaitclient.getEvents({page: 1,limit: 20});Build the application:
npm run build
Set production environment variables:
export NODE_ENV=production export MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/atlas export JWT_SECRET=your-super-secure-256-bit-production-secret
Start the production server:
npm start
# DockerfileFROM node:18-alpine
WORKDIR /app
# Copy package filesCOPY package*.json ./
RUN npm ci --only=production
# Copy source codeCOPY . .
# Build applicationRUN npm run build
# Expose portEXPOSE 3001
# Health checkHEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3001/api/health || exit 1
# Start applicationCMD ["npm", "start"]# docker-compose.ymlversion: '3.8'services:
atlas-backend:
build: .ports:
- "3001:3001"environment:
- NODE_ENV=production
- MONGODB_URI=mongodb://mongo:27017/atlas
- JWT_SECRET=your-production-secretdepends_on:
- mongorestart: unless-stoppedmongo:
image: mongo:6.0ports:
- "27017:27017"volumes:
- mongo_data:/data/dbrestart: unless-stoppedvolumes:
mongo_data:# Example deployment to AWS Elastic Beanstalk
eb init atlas-backend --platform node.js
eb create production-environment
eb deploy- 🔐 JWT Authentication: Secure token-based authentication
- 🛡️ Password Hashing: bcrypt with configurable rounds
- 🚫 Rate Limiting: Prevent abuse with request rate limiting
- 🔒 Role-Based Access: Admin, moderator, and user roles
- 🛡️ Input Validation: Comprehensive request validation
- 🔍 SQL Injection Protection: MongoDB parameterized queries
- 🚨 Error Handling: Secure error responses without sensitive data
- Environment Variables: Never commit secrets to version control
- HTTPS Only: Use HTTPS in production (configure reverse proxy)
- CORS Configuration: Restrict CORS to trusted origins
- Regular Updates: Keep dependencies updated
- Security Headers: Use helmet.js for security headers
- Input Sanitization: Validate and sanitize all user inputs
- Audit Logging: Log security-relevant events
- ⚡ Efficient Queries: Optimized MongoDB aggregation pipelines
- 💾 Caching: Response caching for frequently accessed data
- 📄 Pagination: Built-in pagination for large datasets
- 🔍 Indexing: Strategic database indexing for query performance
- 🚀 Async Operations: Non-blocking asynchronous operations
// Health check endpointGET/api/health{"success": true,"data": {"status": "healthy","timestamp": "2024-01-15T10:30:00.000Z","uptime": "2d 5h 30m","version": "1.0.0","database": "connected","memory": {"used": 45.2,"total": 128.0,"percentage": 35.3}}}# Monitor application performance
npm install -g clinic
clinic doctor -- npm start
# Database performance monitoring
mongotop --host localhost:27017
mongostat --host localhost:27017We welcome contributions to Atlas! Please follow these guidelines:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes with proper TypeScript typing
- Add tests for new functionality
- Run the test suite:
npm test - Commit your changes:
git commit -m 'Add amazing feature' - Push to your branch:
git push origin feature/amazing-feature - Open a Pull Request
- TypeScript: All code must be properly typed
- ESLint: Follow the project's ESLint configuration
- Prettier: Use Prettier for code formatting
- Testing: Include tests for new features
- Documentation: Update documentation for API changes
feat: add user role management
fix: resolve JWT token expiration issue docs: update API documentation
test: add tests for recommendations engine
refactor: optimize database queries
- README.md - Main project documentation (this file)
- ADMIN-DASHBOARD.md - Complete admin dashboard documentation
- API.md - Detailed API reference (auto-generated)
- DEPLOYMENT.md - Production deployment guide
- CONTRIBUTING.md - Contribution guidelines
- TypeScript Documentation: https://www.typescriptlang.org/docs/
- Express.js Guide: https://expressjs.com/en/guide/
- MongoDB Manual: https://docs.mongodb.com/manual/
- JWT.io: https://jwt.io/introduction/
Q: What is Atlas? A: Atlas is a comprehensive backend platform providing authentication, AI-powered recommendations, content management, and administrative features for modern web applications.
Q: What technologies does Atlas use? A: Atlas is built with TypeScript, Node.js, Express.js, MongoDB, and JWT for authentication. It includes AI-powered recommendations and a full admin dashboard.
Q: Is Atlas production-ready? A: Yes! Atlas includes comprehensive error handling, security features, performance optimizations, and production deployment guides.
Q: How do I set up admin access?
A: Create a user account, then update their role in MongoDB: db.users.updateOne({username: 'admin'}, {$set: {role: 'admin'}})
Q: How does the recommendation system work? A: The AI recommendation engine matches user interests with content, scoring items based on relevance, recency, and popularity.
Q: Can I customize the recommendation algorithm?
A: Yes! The recommendation engine in src/backend/modules/recommendations/engine.ts is fully customizable.
Q: How do I add new content types? A: Create a new MongoDB model, add CRUD routes, update the recommendations engine, and add admin management routes.
Q: How do I deploy Atlas to production?
A: See the deployment section above. Atlas supports Docker, cloud platforms (AWS, Azure, GCP), and traditional VPS deployments.
Q: What are the system requirements? A: Node.js v16+, MongoDB v4.4+, and at least 512MB RAM. Recommended: 2GB RAM and SSD storage for production.
Q: How do I scale Atlas? A: Atlas supports horizontal scaling with load balancers, MongoDB clustering, and Redis caching. See deployment documentation for details.
- 🔍 Advanced Search: Elasticsearch integration for enhanced search capabilities
- 📧 Email System: Email notifications and verification system
- 📱 Mobile API: Optimized endpoints for mobile applications
- 🔄 Real-time Updates: WebSocket support for live data updates
- 📊 Advanced Analytics: Machine learning-powered analytics and insights
- 🌍 Internationalization: Multi-language support
- 🔗 Third-party Integrations: OAuth providers, social media APIs
- 📦 Plugin System: Extensible plugin architecture
- v1.0.0 - Initial release with authentication, CRUD operations, and recommendations
- v1.1.0 - Added admin dashboard with comprehensive management features
- v1.2.0 - Enhanced analytics and reporting capabilities (coming soon)
- v2.0.0 - Real-time features and advanced search (planned)
This project is licensed under the MIT License - see the LICENSE file for details.
MIT License
Copyright (c) 2024 Atlas Platform
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
- Express.js Community - For the excellent web framework
- MongoDB Team - For the powerful NoSQL database
- TypeScript Team - For enhanced JavaScript development
- JWT.io - For secure authentication standards
- Open Source Community - For the countless libraries and tools that make this project possible
- 📖 Documentation: Check the docs in this repository
- 🐛 Bug Reports: Open an issue on GitHub
- 💡 Feature Requests: Open a feature request issue
- 💬 Discussions: Join our GitHub Discussions
- 📧 Email Support: support@atlas-platform.com
- GitHub: https://github.com/your-username/atlas
- Discord: Join our developer community
- Twitter: Follow @AtlasPlatform for updates
Built with ❤️ for the developer community
⭐ Star this repository if you find it helpful! ⭐