Skip to content

MN-987/innovaDigits-PMS-Backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

178 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸš€ Inova PMS - Performance Management System

Inova PMS Logo

innovaDigits - Performance Management System

A comprehensive backend API for employee performance management and tracking
Built with Node.js, Express.js, and MongoDB

View Demo Report Bug Request Feature

Downloads Contributors Issues License Node.js Version MongoDB Version

πŸ“‹ Table Of Contents

🎯 About The Project

Screen Shot

What is innovaDigits-PMS?

Inova PMS is a comprehensive Performance Management System backend API designed to align employees' individual goals and performance with organizational objectives. This system provides the foundational infrastructure for tracking, evaluating, and improving employee performance across teams and departments.

The backend serves as the core engine for a larger PMS platform being developed by innovaDigits, one of Egypt's leading software development companies.

πŸ“‹ View Complete Project Documentation

Key Features

✨ Comprehensive Performance Tracking

  • Employee performance evaluation and monitoring
  • Goal setting and progress tracking
  • Team performance analytics
  • Competency-based assessments

πŸ” Robust Authentication & Authorization

  • JWT-based authentication
  • Role-based access control
  • Secure password hashing with bcrypt
  • Session management with cookies

πŸ“Š Advanced Feedback System

  • Multi-directional feedback collection
  • Performance review cycles
  • Real-time feedback tracking
  • Metadata-driven feedback forms

🏒 Team & User Management

  • Hierarchical team structures
  • User role management
  • Department organization
  • Employee onboarding workflows

Core Modules

The project is architected around three primary modules:

1. πŸ‘₯ Users & Teams Module

  • User registration, authentication, and profile management
  • Team creation and member assignment
  • Role-based permissions and access control
  • User hierarchy and reporting structures

2. 🎯 Competencies Module

  • Skill and competency framework management
  • Competency assessments and ratings
  • Performance level definitions
  • Career development pathways

3. πŸ“ Feedback Module

  • 360-degree feedback collection
  • Performance review workflows
  • Feedback analytics and reporting
  • Custom feedback forms and templates

Architecture Overview

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Frontend App  β”‚    β”‚   Mobile App    β”‚    β”‚  Admin Panel    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
          β”‚                      β”‚                      β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                 β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚   REST API      β”‚
                    β”‚  (Express.js)   β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚   MongoDB       β”‚
                    β”‚   Database      β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

⚠️ Important Note: To utilize the Feedback or Competency modules, proper API calls must be made to the Users and Teams modules first to establish the necessary relationships and permissions.

πŸ› οΈ Built With

This project is built using modern, industry-standard technologies:

Core Technologies

  • Node.js - JavaScript runtime environment
  • Express.js - Fast, unopinionated web framework
  • MongoDB - NoSQL database for flexible data storage
  • Mongoose - MongoDB object modeling for Node.js

Authentication & Security

Validation & Utilities

Communication

Development Tools

  • Nodemon - Development server with auto-restart
  • dotenv - Environment variable management
  • CORS - Cross-Origin Resource Sharing

API Features

  • RESTful API design principles
  • JSON-based request/response format
  • Comprehensive error handling
  • Input validation and sanitization
  • Role-based access control
  • Pagination and filtering support

πŸš€ Getting Started

Follow these steps to get the Inova PMS backend running on your local machine for development and testing purposes.

Prerequisites

Before you begin, ensure you have the following installed on your system:

  • Node.js (v18.0 or higher)
  • npm (v8.0 or higher) - comes with Node.js
  • MongoDB (v6.0 or higher) - local installation or MongoDB Atlas account
  • Git - for version control

Check your installations:

node --version
npm --version
git --version

Installation

  1. Clone the repository

    git clone https://github.com/MN-987/innovaDigits-PMS-Backend.git
    cd innovaDigits-PMS-Backend
  2. Install dependencies

    npm install
  3. Set up environment variables

    Create a .env file in the root directory:

    touch .env

    Add the following environment variables to your .env file:

    # Server Configuration
    PORT=6000
    NODE_ENV=development
    
    # Database Configuration
    DB_URL=mongodb://localhost:27017/inova-pms
    # For MongoDB Atlas: mongodb+srv://username:password@cluster.mongodb.net/inova-pms
    
    # JWT Configuration
    JWT_SECRET=your_super_secret_jwt_key_here
    JWT_EXPIRES_IN=7d
    
    # Email Configuration (Optional)
    SENDGRID_API_KEY=your_sendgrid_api_key
    FROM_EMAIL=noreply@innovapms.com
    
    # CORS Configuration
    FRONTEND_URL=http://localhost:3000
  4. Start MongoDB

    If using local MongoDB:

    # On macOS with Homebrew
    brew services start mongodb-community
    
    # On Windows
    net start MongoDB
    
    # On Linux
    sudo systemctl start mongod
  5. Run the application

    # Development mode with auto-restart
    npm start
    
    # Or directly with node
    node app.js
  6. Verify the installation

    The server should start on http://localhost:6000. You should see:

    Example app listening on port 6000!
    DB Connected ....
    

Environment Configuration

Required Environment Variables

Variable Description Example
PORT Server port number 6000
DB_URL MongoDB connection string mongodb://localhost:27017/inova-pms
JWT_SECRET Secret key for JWT signing your_super_secret_key
JWT_EXPIRES_IN JWT token expiration time 7d

Optional Environment Variables

Variable Description Default
NODE_ENV Environment mode development
SENDGRID_API_KEY SendGrid API key for emails -
FROM_EMAIL Default sender email -
FRONTEND_URL Frontend application URL http://localhost:3000

πŸ“– API Documentation

The Inova PMS API follows RESTful principles and provides comprehensive endpoints for managing users, teams, competencies, and feedback.

Base URL

http://localhost:6000/api/v1

Authentication

Most endpoints require authentication using JWT tokens. Include the token in the Authorization header:

Authorization: Bearer <your_jwt_token>

To obtain a token, use the authentication endpoints:

# Login
POST /api/v1/auth/login
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "your_password"
}

API Endpoints

πŸ” Authentication Routes (/api/v1/auth)

Method Endpoint Description Auth Required
POST /register Register new user ❌
POST /login User login ❌
POST /logout User logout βœ…
POST /refresh Refresh JWT token βœ…
POST /forgot-password Request password reset ❌
POST /reset-password Reset password ❌

πŸ‘₯ User Routes (/api/v1/user)

Method Endpoint Description Auth Required
GET / Get all users βœ…
GET /:id Get user by ID βœ…
PUT /:id Update user βœ…
DELETE /:id Delete user βœ… (Admin)
GET /profile Get current user profile βœ…
PUT /profile Update current user profile βœ…

🏒 Team Routes (/api/v1/teams)

Method Endpoint Description Auth Required
GET / Get all teams βœ…
POST / Create new team βœ… (Admin)
GET /:id Get team by ID βœ…
PUT /:id Update team βœ… (Admin)
DELETE /:id Delete team βœ… (Admin)
POST /:id/members Add team member βœ… (Admin)
DELETE /:id/members/:userId Remove team member βœ… (Admin)

🎯 Competency Routes (/api/v1/competency)

Method Endpoint Description Auth Required
GET / Get all competencies βœ…
POST / Create competency βœ… (Admin)
GET /:id Get competency by ID βœ…
PUT /:id Update competency βœ… (Admin)
DELETE /:id Delete competency βœ… (Admin)

πŸ“Š Level Routes (/api/v1/levels)

Method Endpoint Description Auth Required
GET / Get all levels βœ…
POST / Create level βœ… (Admin)
GET /:id Get level by ID βœ…
PUT /:id Update level βœ… (Admin)
DELETE /:id Delete level βœ… (Admin)

πŸ“ Feedback Routes (/api/v1/feedback)

Method Endpoint Description Auth Required
GET / Get all feedback βœ…
POST / Create feedback βœ…
GET /:id Get feedback by ID βœ…
PUT /:id Update feedback βœ…
DELETE /:id Delete feedback βœ…

πŸ“‚ Category Routes (/api/v1/category)

Method Endpoint Description Auth Required
GET / Get all categories βœ…
POST / Create category βœ… (Admin)
GET /:id Get category by ID βœ…
PUT /:id Update category βœ… (Admin)
DELETE /:id Delete category βœ… (Admin)

Example API Calls

Register a new user

curl -X POST http://localhost:6000/api/v1/auth/register \
  -H "Content-Type: application/json" \
  -d '{
    "firstName": "John",
    "lastName": "Doe",
    "email": "john.doe@example.com",
    "password": "securePassword123",
    "role": "employee"
  }'

Create a new team

curl -X POST http://localhost:6000/api/v1/teams \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <your_jwt_token>" \
  -d '{
    "name": "Development Team",
    "description": "Software development team",
    "department": "Engineering"
  }'

Submit feedback

curl -X POST http://localhost:6000/api/v1/feedback \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <your_jwt_token>" \
  -d '{
    "receiverId": "user_id_here",
    "competencyId": "competency_id_here",
    "rating": 4,
    "comments": "Great work on the project!",
    "feedbackType": "peer"
  }'

πŸ”§ Usage

Running the Server

  1. Development Mode (with auto-restart)

    npm start
  2. Production Mode

    NODE_ENV=production node app.js

Testing the API

You can test the API using various tools:

Using cURL

# Health check
curl http://localhost:6000/api/v1/auth/health

# Login
curl -X POST http://localhost:6000/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email": "test@example.com", "password": "password123"}'

Using Postman

  1. Import the API collection (if available)
  2. Set the base URL to http://localhost:6000/api/v1
  3. Configure authentication with JWT tokens

Using Thunder Client (VS Code Extension)

  1. Install Thunder Client extension
  2. Create a new collection
  3. Add requests for each endpoint

Common Use Cases

1. User Onboarding Flow

// 1. Register user
POST /api/v1/auth/register

// 2. Assign to team
POST /api/v1/teams/:teamId/members

// 3. Set up competencies
GET /api/v1/competency

// 4. Initial performance assessment
POST /api/v1/feedback

2. Performance Review Cycle

// 1. Get team members
GET /api/v1/teams/:teamId

// 2. Collect feedback for each member
POST /api/v1/feedback

// 3. Generate performance reports
GET /api/v1/feedback?receiverId=:userId

// 4. Update competency levels
PUT /api/v1/competency/:id

πŸ“ Project Structure

inova-pms/
β”œβ”€β”€ πŸ“„ app.js                     # Application entry point
β”œβ”€β”€ πŸ“„ package.json               # Dependencies and scripts
β”œβ”€β”€ πŸ“„ package-lock.json          # Dependency lock file
β”œβ”€β”€ πŸ“„ .env                       # Environment variables (create this)
β”œβ”€β”€ πŸ“„ README.md                  # Project documentation
β”œβ”€β”€ πŸ“„ LICENSE                    # MIT License
β”‚
β”œβ”€β”€ πŸ“ config/                    # Configuration files
β”‚   └── πŸ“„ dbConnection.js        # MongoDB connection setup
β”‚
β”œβ”€β”€ πŸ“ routes/                    # API route definitions
β”‚   β”œβ”€β”€ πŸ“„ index.routes.js        # Main router and middleware setup
β”‚   β”œβ”€β”€ πŸ“„ auth.routes.js         # Authentication routes
β”‚   β”œβ”€β”€ πŸ“„ user.routes.js         # User management routes
β”‚   β”œβ”€β”€ πŸ“„ team.routes.js         # Team management routes
β”‚   β”œβ”€β”€ πŸ“„ competency.routes.js   # Competency routes
β”‚   β”œβ”€β”€ πŸ“„ feedback.routes.js     # Feedback routes
β”‚   β”œβ”€β”€ πŸ“„ category.routes.js     # Category routes
β”‚   └── πŸ“„ level.routes.js        # Level routes
β”‚
β”œβ”€β”€ πŸ“ controller/                # Business logic controllers
β”‚   β”œβ”€β”€ πŸ“„ auth.controller.js     # Authentication logic
β”‚   β”œβ”€β”€ πŸ“„ user.controller.js     # User management logic
β”‚   β”œβ”€β”€ πŸ“„ team.controller.js     # Team management logic
β”‚   β”œβ”€β”€ πŸ“„ competency.controller.js # Competency logic
β”‚   β”œβ”€β”€ πŸ“„ feedback.controller.js # Feedback logic
β”‚   β”œβ”€β”€ πŸ“„ category.controller.js # Category logic
β”‚   └── πŸ“„ level.controller.js    # Level logic
β”‚
β”œβ”€β”€ πŸ“ service/                   # Service layer (business logic)
β”‚   β”œβ”€β”€ πŸ“„ auth.service.js        # Authentication services
β”‚   β”œβ”€β”€ πŸ“„ user.service.js        # User services
β”‚   β”œβ”€β”€ πŸ“„ team.service.js        # Team services
β”‚   β”œβ”€β”€ πŸ“„ competency.service.js  # Competency services
β”‚   β”œβ”€β”€ πŸ“„ feedback.service.js    # Feedback services
β”‚   β”œβ”€β”€ πŸ“„ category.service.js    # Category services
β”‚   └── πŸ“„ level.service.js       # Level services
β”‚
β”œβ”€β”€ πŸ“ data/                      # Database models (Mongoose schemas)
β”‚   β”œβ”€β”€ πŸ“„ user.model.js          # User schema
β”‚   β”œβ”€β”€ πŸ“„ team.model.js          # Team schema
β”‚   β”œβ”€β”€ πŸ“„ competency.model.js    # Competency schema
β”‚   β”œβ”€β”€ πŸ“„ feedback.model.js      # Feedback schema
β”‚   β”œβ”€β”€ πŸ“„ feedback.metadata.model.js # Feedback metadata schema
β”‚   β”œβ”€β”€ πŸ“„ category.model.js      # Category schema
β”‚   └── πŸ“„ level.model.js         # Level schema
β”‚
β”œβ”€β”€ πŸ“ middleware/                # Custom middleware
β”‚   β”œβ”€β”€ πŸ“ auth/                  # Authentication middleware
β”‚   β”‚   β”œβ”€β”€ πŸ“„ isAuthenticated.js # JWT verification
β”‚   β”‚   └── πŸ“„ isSuperAdmin.js    # Admin role verification
β”‚   └── πŸ“ validator/             # Input validation middleware
β”‚       β”œβ”€β”€ πŸ“„ validation.js      # General validation utilities
β”‚       β”œβ”€β”€ πŸ“„ user.validator.js  # User input validation
β”‚       β”œβ”€β”€ πŸ“„ team.validator.js  # Team input validation
β”‚       β”œβ”€β”€ πŸ“„ competency.validator.js # Competency validation
β”‚       β”œβ”€β”€ πŸ“„ feedback.validator.js # Feedback validation
β”‚       β”œβ”€β”€ πŸ“„ category.validator.js # Category validation
β”‚       └── πŸ“„ level.validators.js # Level validation
β”‚
└── πŸ“ util/                      # Utility functions
    β”œβ”€β”€ πŸ“„ errorClass.js          # Custom error classes
    β”œβ”€β”€ πŸ“„ errorHandling.js       # Global error handling
    └── πŸ“„ feedbackTest.js        # Feedback testing utilities

Key Directories Explained

/routes - API Route Definitions

Contains Express.js route definitions that map HTTP requests to controller functions. Each module has its own route file for better organization.

/controller - Request Handlers

Contains the main business logic for handling HTTP requests. Controllers process the request, call appropriate services, and return responses.

/service - Business Logic Layer

Contains the core business logic separated from HTTP concerns. Services handle data processing, validation, and communication with the database.

/data - Database Models

Contains Mongoose schemas that define the structure of documents in MongoDB collections. These models handle data validation and relationships.

/middleware - Custom Middleware

Contains reusable middleware functions for authentication, authorization, and input validation that can be applied to routes.

/util - Utility Functions

Contains helper functions, error handling utilities, and other reusable code that doesn't fit into other categories.

πŸ—ΊοΈ Roadmap

Current Features βœ…

  • βœ… User authentication and authorization
  • βœ… Team management system
  • βœ… Competency framework
  • βœ… Feedback collection and management
  • βœ… Role-based access control
  • βœ… Input validation and error handling
  • βœ… RESTful API design

Upcoming Features 🚧

Phase 1 - Core Enhancements

  • Performance Analytics Dashboard

    • Comprehensive performance metrics
    • Visual charts and reports
    • Trend analysis over time
  • Advanced Reporting System

    • Custom report generation
    • PDF export functionality
    • Scheduled reports via email
  • Notification System

    • Real-time notifications
    • Email alerts for performance reviews
    • Custom notification preferences

Phase 2 - Advanced Features

  • Goal Setting & Tracking

    • SMART goals framework
    • Progress tracking
    • Goal alignment with company objectives
  • 360-Degree Feedback Enhancement

    • Multi-source feedback collection
    • Anonymous feedback options
    • Peer nomination system
  • Performance Review Workflows

    • Automated review cycles
    • Approval workflows
    • Performance improvement plans

Phase 3 - Integration & Scaling

  • Third-party Integrations

    • HR Information Systems (HRIS)
    • Single Sign-On (SSO)
    • Calendar applications
  • Advanced Analytics

    • Machine learning insights
    • Predictive analytics
    • Performance forecasting
  • Mobile Application

    • Native iOS/Android apps
    • Offline functionality
    • Push notifications

Phase 4 - Enterprise Features

  • Multi-tenant Architecture

    • Organization isolation
    • Custom branding
    • Configurable workflows
  • Advanced Security

    • Two-factor authentication
    • Audit logging
    • Data encryption at rest
  • API Rate Limiting & Monitoring

    • Request throttling
    • API usage analytics
    • Performance monitoring

Known Issues πŸ›

See the open issues for a list of known bugs and feature requests.

Contributing to the Roadmap

Have ideas for new features? We'd love to hear from you!

🀝 Contributing

We welcome contributions from the community! Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

Ways to Contribute

πŸ› Report Bugs

  • Use our bug report template
  • Include detailed steps to reproduce the issue
  • Provide environment information

πŸ’‘ Suggest Features

πŸ“ Improve Documentation

  • Fix typos and grammatical errors
  • Add examples and clarifications
  • Translate documentation

πŸ”§ Submit Code

  • Fix bugs and implement features
  • Improve performance and security
  • Add tests and improve coverage

Development Guidelines

Code Style

  • Follow JavaScript ES6+ standards
  • Use meaningful variable and function names
  • Add comments for complex logic
  • Maintain consistent indentation (2 spaces)

Commit Messages

Follow the Conventional Commits specification:

feat: add user profile update endpoint
fix: resolve JWT token validation issue
docs: update API documentation
test: add unit tests for auth service
refactor: improve error handling structure

Testing

  • Write unit tests for new features
  • Ensure all existing tests pass
  • Test API endpoints with various inputs
  • Verify error handling scenarios

Creating A Pull Request

  1. Fork the Project

    git clone https://github.com/your-username/innovaDigits-PMS-Backend.git
    cd innovaDigits-PMS-Backend
  2. Create your Feature Branch

    git checkout -b feature/amazing-feature
    # or for bug fixes
    git checkout -b fix/bug-description
  3. Set up development environment

    npm install
    cp .env.example .env  # Configure your environment
  4. Make your changes

    • Write your code following the style guidelines
    • Add tests for new functionality
    • Update documentation as needed
  5. Test your changes

    npm test
    npm start  # Verify the server runs correctly
  6. Commit your Changes

    git add .
    git commit -m 'feat: add amazing feature'
  7. Push to the Branch

    git push origin feature/amazing-feature
  8. Open a Pull Request

    • Use our pull request template
    • Provide a clear description of changes
    • Link related issues
    • Request reviews from maintainers

Pull Request Guidelines

βœ… Before submitting:

  • Code follows the project's style guidelines
  • Self-review of your code has been performed
  • Comments have been added to hard-to-understand areas
  • Documentation has been updated accordingly
  • Tests have been added/updated and pass
  • No new warnings or errors are introduced

πŸ“‹ Pull Request checklist:

  • Clear, descriptive title
  • Detailed description of changes
  • Screenshots/GIFs for UI changes
  • Breaking changes are documented
  • Related issues are linked

Code of Conduct

This project follows the Contributor Covenant Code of Conduct. By participating, you agree to uphold this code.

Questions or Need Help?

  • πŸ’¬ Start a discussion
  • πŸ“§ Contact the maintainers
  • πŸ“– Check existing documentation and issues

πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

MIT License Summary

MIT License

Copyright (c) 2024 Mostafa Nasser & innovaDigits Team

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:

[Full license text in LICENSE file]

What this means:

  • βœ… Commercial use allowed
  • βœ… Modification allowed
  • βœ… Distribution allowed
  • βœ… Private use allowed
  • ❌ No liability or warranty provided

πŸ‘₯ Authors

Core Team

Mostafa Nasser - Lead Developer & Project Maintainer

innovaDigits Team

innovaDigits - Software Development Company

Contributors

We appreciate all contributors who have helped make this project better! πŸŽ‰

Want to see your name here? Check out our Contributing Guidelines and submit your first pull request!

πŸ™ Acknowledgements

We'd like to thank the following resources and communities that made this project possible:

Technology & Frameworks

  • Express.js - Fast, unopinionated web framework for Node.js
  • MongoDB - The database for modern applications
  • Mongoose - Elegant MongoDB object modeling for Node.js
  • JSON Web Tokens - Industry standard for secure authentication

Development Tools

  • Node.js - JavaScript runtime built on Chrome's V8 engine
  • Nodemon - Utility that monitors for changes and restarts server
  • Postman - API development and testing platform
  • Visual Studio Code - Source code editor

Learning Resources

Open Source Community

  • GitHub - Development platform and version control
  • npm - Package manager for Node.js
  • Stack Overflow - Developer community and Q&A platform

Inspiration & Design

Special Thanks

  • innovaDigits Team - For providing the vision and requirements for this project
  • Open Source Contributors - For their valuable contributions and feedback
  • Developer Community - For continuous learning and knowledge sharing

Made with ❀️ by the innovaDigits Team
Building the future of performance management, one commit at a time.

⬆️ Back to top

Releases

No releases published

Packages

 
 
 

Contributors