Latest commit

History

2,618 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PaySphere

PaySphere 💰

Payroll in seconds, not hours.
A lightweight payroll management system built for small businesses in India.

Figma DesignLive ProjectPostman DocumentationBackend APIYouTube Demo


❗ Problem Statement

Small businesses employing fewer than 10 workers spend hours every month manually calculating salaries factoring in paid leave, unpaid absences, overtime hours, and festival bonuses.

Most payroll software is built for large enterprises, making them:

  • Too complex for tiny teams.
  • Expensive and over-engineered.
  • Not optimized for the fast-paced "Digital Ledger" style of Bharat.

👉 Result: Wasted time, calculation errors, and frustration.


💡 Solution

PaySphere simplifies payroll into a 3-step workflow:

  1. 👥 Add Employees: Quickly onboard your team with base salary and overtime rates.
  2. 💬 Log Updates: Add leaves, overtime, and bonuses through a clean, intuitive interface.
  3. Run Payroll: Generate professional payslips and finalize payouts in one click.

🎯 Features

FeatureDescription
🔐 Google AuthenticationSecure Login & Signup with Google One-Tap integration.
🛡️ Role-Based Access Control (RBAC)Granular permissions with Admin, Manager, and Viewer roles for team collaboration.
👥 Employee ManagementDashboard view with status, role, and salary at a glance.
📥 Bulk Employee Import (CSV)Onboard entire teams in seconds by uploading a CSV file with row-level validation & duplicate detection.
💬 Activity TrackingLog leave, overtime, bonuses, and deductions per employee.
Instant PayrollAutomated calculation of Net Salary based on monthly activity.
📄 Professional PayslipsDownload detailed PDF breakdowns for each payout.
📧 Bulk Payslip EmailingOne-click or auto-scheduled (via cron) email dispatch of payslips to all employees.
📊 Advanced Reporting & AnalyticsInteractive dashboard with payroll trends, department/role breakdowns, and overtime analysis.
📑 XLSX Payroll SummariesExport formatted Excel spreadsheets with totals and per-employee breakdowns.
📦 ZIP Payslip ExportDownload a single ZIP archive containing all employee payslip PDFs for a given month.
📋 Audit LoggingEvent bus tracking for all mutations (payroll runs, employee CRUD, imports, emails, reports) with IP & user agent.
📱 Responsive DesignFully optimized for Mobile, Tablet, and Desktop.

🛠️ Tech Stack

LayerTechnologies
FrontendReact.js (v19), Vite, Tailwind CSS v4, MUI (Material UI), Redux Toolkit, Recharts, React Router
BackendNode.js, Express.js (v5), MongoDB, Mongoose, Redis (Caching layer), BullMQ (Background Jobs)
DeploymentVercel (Frontend), Render (Backend)
Tools & LibrariesExcelJS (XLSX exports), Archiver (ZIP archives), Nodemailer (SMTP emails), PDFKit, Multer, csv-parse, node-cron, Winston, Helmet, Jest (Testing)

📁 Project Structure

paysphere/
├── backend/
│ ├── src/
│ │ ├── config/ # Database connection & environment config
│ │ ├── controllers/ # Business logic (employees, payroll, reports, users)
│ │ │ └── __tests__/ # Controller unit tests (Jest + Supertest)
│ │ ├── jobs/ # Scheduled cron jobs (monthly payslip emails)
│ │ ├── middlewares/ # Auth, error handling, rate limiting, file upload
│ │ │ └── __tests__/ # Middleware tests
│ │ ├── models/ # Mongoose schemas (User, Employee, Payroll, AuditLog, CronLock)
│ │ ├── routes/ # API endpoint definitions
│ │ ├── seeds/ # Database seed scripts
│ │ ├── services/ # Cross-cutting services (audit logging, email dispatch)
│ │ │ └── __tests__/ # Service tests
│ │ ├── utils/ # Helpers: salary calculator, CSV export, logger, validators, email
│ │ │ └── __tests__/ # Utility unit tests
│ │ ├── workers/ # Background worker threads (PDF generation)
│ │ ├── app.js # Express app setup & middleware chain
│ │ └── index.js # Server entry point & cron job bootstrap
├── frontend/
│ ├── src/
│ │ ├── assets/ # Images and local files
│ │ ├── components/ # Reusable UI Components
│ │ │ ├── common/ # Button, Input, Modal, Skeleton, EmptyState, etc.
│ │ │ └── reports/ # Charts & tables: PayrollTrend, SalaryDistribution, etc.
│ │ ├── features/ # Feature-based slices (Auth, UI, User) + Redux hooks & services
│ │ ├── hooks/ # Global reusable React hooks (e.g., useLocalStorage)
│ │ ├── pages/ # Main route views (Landing, Dashboard, Reports, Settings, etc.)
│ │ ├── services/ # API services (axios config + request helpers)
│ │ ├── store/ # Redux store configuration
│ │ ├── utils/ # Helper functions and constants
│ │ ├── App.jsx # Route definitions & global providers
│ │ ├── main.jsx # React root & app bootstrap
│ │ └── index.css # Global styles + Tailwind directives

📸 Screenshots

Dashboard Overview

PaySphere Dashboard


🚀 Installation & Setup

1. Backend Configuration

Copy the .env.example file to create a .env file in backend/:

cp .env.example .env

Update the variables with your own values:

# ServerPORT=5000FRONTEND_URL=http://localhost:5173NODE_ENV=development# DatabaseMONGO_URI=your_mongodb_uri# AuthenticationJWT_SECRET=your_secret_keyGOOGLE_CLIENT_ID=your_google_idGOOGLE_CLIENT_SECRET=your_google_secret# Caching & Background JobsREDIS_URI=your_redis_connection_uri# Email (SMTP)# Backend sends payslips & notifications directly via SMTP. If SMTP is# not configured, it falls back to the Vercel proxy at FRONTEND_URL/api/send-email,# then to console logging.EMAIL_HOST=your_smtp_host# e.g. smtp.gmail.comEMAIL_PORT=587# or 465 for SSLEMAIL_SECURE=false# true for port 465EMAIL_USER=your_smtp_username# e.g. your_email@gmail.comEMAIL_PASS=your_smtp_password# or app passwordEMAIL_FROM="PaySphere <no-reply@paysphere.com>"EMAIL_PROXY_SECRET=your_email_proxy_secret_key# Aliases (used by SMTP transport — populate both pairs for compatibility)SMTP_HOST=your_smtp_hostSMTP_PORT=587SMTP_SECURE=falseSMTP_USER=your_smtp_userSMTP_PASS=your_smtp_pass# LoggingLOG_LEVEL=info

2. Frontend Configuration

Copy the .env.example file to create a .env file in frontend/:

cp .env.example .env

Update the variables with your own values:

VITE_API_URL=http://localhost:5000VITE_GOOGLE_CLIENT_ID=your_google_id# Email Proxy SMTP (used by Vercel Serverless Function at /api/send-email)EMAIL_PROXY_SECRET=your_email_proxy_secret_keySMTP_HOST=smtp.gmail.comSMTP_PORT=587SMTP_USER=your_email@gmail.comSMTP_PASS=your_app_passwordSMTP_SECURE=falseEMAIL_FROM="PaySphere" <no-reply@paysphere.com>

3. Run Development

# Backendcd backend && npm run dev
# Frontendcd frontend && npm run dev

4. Run with Docker (Recommended)

The entire stack (MongoDB + backend + frontend) can be started with a single command using Docker Compose. Hot-reloading is enabled for both the backend (nodemon) and the frontend (Vite HMR).

Prerequisites: Docker with Docker Compose v2.

# From the repo root
docker compose up --build

This starts:

  • MongoDB at localhost:27017
  • Backend API at http://localhost:5000
  • Frontend at http://localhost:5173

All services work out of the box with sensible defaults. To override secrets and Google/SMTP settings, copy the root .env.example to .env and edit it:

cp .env.example .env

Then restart the stack for changes to take effect:

docker compose up -d
docker compose restart backend

Useful commands:

# Build/start all services in the background
docker compose up --build -d
# Stream logs from all services (or one: docker compose logs backend)
docker compose logs -f
# Stop the stack (keeps the MongoDB volume)
docker compose down
# Stop and delete the MongoDB data volume
docker compose down -v

Note: Redis is optional. Without a REDIS_URL, caching falls back to an in-memory store and background payslip email jobs remain available in a degraded mode.

5. Testing

# Run backend test suite (Jest + Supertest)cd backend && npm test

PaySphere — Payroll in seconds, not hours. ⚡

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

2,618 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PaySphere

PaySphere 💰

Payroll in seconds, not hours.
A lightweight payroll management system built for small businesses in India.

Figma DesignLive ProjectPostman DocumentationBackend APIYouTube Demo


❗ Problem Statement

Small businesses employing fewer than 10 workers spend hours every month manually calculating salaries factoring in paid leave, unpaid absences, overtime hours, and festival bonuses.

Most payroll software is built for large enterprises, making them:

  • Too complex for tiny teams.
  • Expensive and over-engineered.
  • Not optimized for the fast-paced "Digital Ledger" style of Bharat.

👉 Result: Wasted time, calculation errors, and frustration.


💡 Solution

PaySphere simplifies payroll into a 3-step workflow:

  1. 👥 Add Employees: Quickly onboard your team with base salary and overtime rates.
  2. 💬 Log Updates: Add leaves, overtime, and bonuses through a clean, intuitive interface.
  3. Run Payroll: Generate professional payslips and finalize payouts in one click.

🎯 Features

FeatureDescription
🔐 Google AuthenticationSecure Login & Signup with Google One-Tap integration.
🛡️ Role-Based Access Control (RBAC)Granular permissions with Admin, Manager, and Viewer roles for team collaboration.
👥 Employee ManagementDashboard view with status, role, and salary at a glance.
📥 Bulk Employee Import (CSV)Onboard entire teams in seconds by uploading a CSV file with row-level validation & duplicate detection.
💬 Activity TrackingLog leave, overtime, bonuses, and deductions per employee.
Instant PayrollAutomated calculation of Net Salary based on monthly activity.
📄 Professional PayslipsDownload detailed PDF breakdowns for each payout.
📧 Bulk Payslip EmailingOne-click or auto-scheduled (via cron) email dispatch of payslips to all employees.
📊 Advanced Reporting & AnalyticsInteractive dashboard with payroll trends, department/role breakdowns, and overtime analysis.
📑 XLSX Payroll SummariesExport formatted Excel spreadsheets with totals and per-employee breakdowns.
📦 ZIP Payslip ExportDownload a single ZIP archive containing all employee payslip PDFs for a given month.
📋 Audit LoggingEvent bus tracking for all mutations (payroll runs, employee CRUD, imports, emails, reports) with IP & user agent.
📱 Responsive DesignFully optimized for Mobile, Tablet, and Desktop.

🛠️ Tech Stack

LayerTechnologies
FrontendReact.js (v19), Vite, Tailwind CSS v4, MUI (Material UI), Redux Toolkit, Recharts, React Router
BackendNode.js, Express.js (v5), MongoDB, Mongoose, Redis (Caching layer), BullMQ (Background Jobs)
DeploymentVercel (Frontend), Render (Backend)
Tools & LibrariesExcelJS (XLSX exports), Archiver (ZIP archives), Nodemailer (SMTP emails), PDFKit, Multer, csv-parse, node-cron, Winston, Helmet, Jest (Testing)

📁 Project Structure

paysphere/
├── backend/
│ ├── src/
│ │ ├── config/ # Database connection & environment config
│ │ ├── controllers/ # Business logic (employees, payroll, reports, users)
│ │ │ └── __tests__/ # Controller unit tests (Jest + Supertest)
│ │ ├── jobs/ # Scheduled cron jobs (monthly payslip emails)
│ │ ├── middlewares/ # Auth, error handling, rate limiting, file upload
│ │ │ └── __tests__/ # Middleware tests
│ │ ├── models/ # Mongoose schemas (User, Employee, Payroll, AuditLog, CronLock)
│ │ ├── routes/ # API endpoint definitions
│ │ ├── seeds/ # Database seed scripts
│ │ ├── services/ # Cross-cutting services (audit logging, email dispatch)
│ │ │ └── __tests__/ # Service tests
│ │ ├── utils/ # Helpers: salary calculator, CSV export, logger, validators, email
│ │ │ └── __tests__/ # Utility unit tests
│ │ ├── workers/ # Background worker threads (PDF generation)
│ │ ├── app.js # Express app setup & middleware chain
│ │ └── index.js # Server entry point & cron job bootstrap
├── frontend/
│ ├── src/
│ │ ├── assets/ # Images and local files
│ │ ├── components/ # Reusable UI Components
│ │ │ ├── common/ # Button, Input, Modal, Skeleton, EmptyState, etc.
│ │ │ └── reports/ # Charts & tables: PayrollTrend, SalaryDistribution, etc.
│ │ ├── features/ # Feature-based slices (Auth, UI, User) + Redux hooks & services
│ │ ├── hooks/ # Global reusable React hooks (e.g., useLocalStorage)
│ │ ├── pages/ # Main route views (Landing, Dashboard, Reports, Settings, etc.)
│ │ ├── services/ # API services (axios config + request helpers)
│ │ ├── store/ # Redux store configuration
│ │ ├── utils/ # Helper functions and constants
│ │ ├── App.jsx # Route definitions & global providers
│ │ ├── main.jsx # React root & app bootstrap
│ │ └── index.css # Global styles + Tailwind directives

📸 Screenshots

Dashboard Overview

PaySphere Dashboard


🚀 Installation & Setup

1. Backend Configuration

Copy the .env.example file to create a .env file in backend/:

cp .env.example .env

Update the variables with your own values:

# ServerPORT=5000FRONTEND_URL=http://localhost:5173NODE_ENV=development# DatabaseMONGO_URI=your_mongodb_uri# AuthenticationJWT_SECRET=your_secret_keyGOOGLE_CLIENT_ID=your_google_idGOOGLE_CLIENT_SECRET=your_google_secret# Caching & Background JobsREDIS_URI=your_redis_connection_uri# Email (SMTP)# Backend sends payslips & notifications directly via SMTP. If SMTP is# not configured, it falls back to the Vercel proxy at FRONTEND_URL/api/send-email,# then to console logging.EMAIL_HOST=your_smtp_host# e.g. smtp.gmail.comEMAIL_PORT=587# or 465 for SSLEMAIL_SECURE=false# true for port 465EMAIL_USER=your_smtp_username# e.g. your_email@gmail.comEMAIL_PASS=your_smtp_password# or app passwordEMAIL_FROM="PaySphere <no-reply@paysphere.com>"EMAIL_PROXY_SECRET=your_email_proxy_secret_key# Aliases (used by SMTP transport — populate both pairs for compatibility)SMTP_HOST=your_smtp_hostSMTP_PORT=587SMTP_SECURE=falseSMTP_USER=your_smtp_userSMTP_PASS=your_smtp_pass# LoggingLOG_LEVEL=info

2. Frontend Configuration

Copy the .env.example file to create a .env file in frontend/:

cp .env.example .env

Update the variables with your own values:

VITE_API_URL=http://localhost:5000VITE_GOOGLE_CLIENT_ID=your_google_id# Email Proxy SMTP (used by Vercel Serverless Function at /api/send-email)EMAIL_PROXY_SECRET=your_email_proxy_secret_keySMTP_HOST=smtp.gmail.comSMTP_PORT=587SMTP_USER=your_email@gmail.comSMTP_PASS=your_app_passwordSMTP_SECURE=falseEMAIL_FROM="PaySphere" <no-reply@paysphere.com>

3. Run Development

# Backendcd backend && npm run dev
# Frontendcd frontend && npm run dev

4. Run with Docker (Recommended)

The entire stack (MongoDB + backend + frontend) can be started with a single command using Docker Compose. Hot-reloading is enabled for both the backend (nodemon) and the frontend (Vite HMR).

Prerequisites: Docker with Docker Compose v2.

# From the repo root
docker compose up --build

This starts:

  • MongoDB at localhost:27017
  • Backend API at http://localhost:5000
  • Frontend at http://localhost:5173

All services work out of the box with sensible defaults. To override secrets and Google/SMTP settings, copy the root .env.example to .env and edit it:

cp .env.example .env

Then restart the stack for changes to take effect:

docker compose up -d
docker compose restart backend

Useful commands:

# Build/start all services in the background
docker compose up --build -d
# Stream logs from all services (or one: docker compose logs backend)
docker compose logs -f
# Stop the stack (keeps the MongoDB volume)
docker compose down
# Stop and delete the MongoDB data volume
docker compose down -v

Note: Redis is optional. Without a REDIS_URL, caching falls back to an in-memory store and background payslip email jobs remain available in a degraded mode.

5. Testing

# Run backend test suite (Jest + Supertest)cd backend && npm test

PaySphere — Payroll in seconds, not hours. ⚡

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,618 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PaySphere

PaySphere 💰

Payroll in seconds, not hours.
A lightweight payroll management system built for small businesses in India.

Figma DesignLive ProjectPostman DocumentationBackend APIYouTube Demo


❗ Problem Statement

Small businesses employing fewer than 10 workers spend hours every month manually calculating salaries factoring in paid leave, unpaid absences, overtime hours, and festival bonuses.

Most payroll software is built for large enterprises, making them:

  • Too complex for tiny teams.
  • Expensive and over-engineered.
  • Not optimized for the fast-paced "Digital Ledger" style of Bharat.

👉 Result: Wasted time, calculation errors, and frustration.


💡 Solution

PaySphere simplifies payroll into a 3-step workflow:

  1. 👥 Add Employees: Quickly onboard your team with base salary and overtime rates.
  2. 💬 Log Updates: Add leaves, overtime, and bonuses through a clean, intuitive interface.
  3. Run Payroll: Generate professional payslips and finalize payouts in one click.

🎯 Features

FeatureDescription
🔐 Google AuthenticationSecure Login & Signup with Google One-Tap integration.
🛡️ Role-Based Access Control (RBAC)Granular permissions with Admin, Manager, and Viewer roles for team collaboration.
👥 Employee ManagementDashboard view with status, role, and salary at a glance.
📥 Bulk Employee Import (CSV)Onboard entire teams in seconds by uploading a CSV file with row-level validation & duplicate detection.
💬 Activity TrackingLog leave, overtime, bonuses, and deductions per employee.
Instant PayrollAutomated calculation of Net Salary based on monthly activity.
📄 Professional PayslipsDownload detailed PDF breakdowns for each payout.
📧 Bulk Payslip EmailingOne-click or auto-scheduled (via cron) email dispatch of payslips to all employees.
📊 Advanced Reporting & AnalyticsInteractive dashboard with payroll trends, department/role breakdowns, and overtime analysis.
📑 XLSX Payroll SummariesExport formatted Excel spreadsheets with totals and per-employee breakdowns.
📦 ZIP Payslip ExportDownload a single ZIP archive containing all employee payslip PDFs for a given month.
📋 Audit LoggingEvent bus tracking for all mutations (payroll runs, employee CRUD, imports, emails, reports) with IP & user agent.
📱 Responsive DesignFully optimized for Mobile, Tablet, and Desktop.

🛠️ Tech Stack

LayerTechnologies
FrontendReact.js (v19), Vite, Tailwind CSS v4, MUI (Material UI), Redux Toolkit, Recharts, React Router
BackendNode.js, Express.js (v5), MongoDB, Mongoose, Redis (Caching layer), BullMQ (Background Jobs)
DeploymentVercel (Frontend), Render (Backend)
Tools & LibrariesExcelJS (XLSX exports), Archiver (ZIP archives), Nodemailer (SMTP emails), PDFKit, Multer, csv-parse, node-cron, Winston, Helmet, Jest (Testing)

📁 Project Structure

paysphere/
├── backend/
│ ├── src/
│ │ ├── config/ # Database connection & environment config
│ │ ├── controllers/ # Business logic (employees, payroll, reports, users)
│ │ │ └── __tests__/ # Controller unit tests (Jest + Supertest)
│ │ ├── jobs/ # Scheduled cron jobs (monthly payslip emails)
│ │ ├── middlewares/ # Auth, error handling, rate limiting, file upload
│ │ │ └── __tests__/ # Middleware tests
│ │ ├── models/ # Mongoose schemas (User, Employee, Payroll, AuditLog, CronLock)
│ │ ├── routes/ # API endpoint definitions
│ │ ├── seeds/ # Database seed scripts
│ │ ├── services/ # Cross-cutting services (audit logging, email dispatch)
│ │ │ └── __tests__/ # Service tests
│ │ ├── utils/ # Helpers: salary calculator, CSV export, logger, validators, email
│ │ │ └── __tests__/ # Utility unit tests
│ │ ├── workers/ # Background worker threads (PDF generation)
│ │ ├── app.js # Express app setup & middleware chain
│ │ └── index.js # Server entry point & cron job bootstrap
├── frontend/
│ ├── src/
│ │ ├── assets/ # Images and local files
│ │ ├── components/ # Reusable UI Components
│ │ │ ├── common/ # Button, Input, Modal, Skeleton, EmptyState, etc.
│ │ │ └── reports/ # Charts & tables: PayrollTrend, SalaryDistribution, etc.
│ │ ├── features/ # Feature-based slices (Auth, UI, User) + Redux hooks & services
│ │ ├── hooks/ # Global reusable React hooks (e.g., useLocalStorage)
│ │ ├── pages/ # Main route views (Landing, Dashboard, Reports, Settings, etc.)
│ │ ├── services/ # API services (axios config + request helpers)
│ │ ├── store/ # Redux store configuration
│ │ ├── utils/ # Helper functions and constants
│ │ ├── App.jsx # Route definitions & global providers
│ │ ├── main.jsx # React root & app bootstrap
│ │ └── index.css # Global styles + Tailwind directives

📸 Screenshots

Dashboard Overview

PaySphere Dashboard


🚀 Installation & Setup

1. Backend Configuration

Copy the .env.example file to create a .env file in backend/:

cp .env.example .env

Update the variables with your own values:

# ServerPORT=5000FRONTEND_URL=http://localhost:5173NODE_ENV=development# DatabaseMONGO_URI=your_mongodb_uri# AuthenticationJWT_SECRET=your_secret_keyGOOGLE_CLIENT_ID=your_google_idGOOGLE_CLIENT_SECRET=your_google_secret# Caching & Background JobsREDIS_URI=your_redis_connection_uri# Email (SMTP)# Backend sends payslips & notifications directly via SMTP. If SMTP is# not configured, it falls back to the Vercel proxy at FRONTEND_URL/api/send-email,# then to console logging.EMAIL_HOST=your_smtp_host# e.g. smtp.gmail.comEMAIL_PORT=587# or 465 for SSLEMAIL_SECURE=false# true for port 465EMAIL_USER=your_smtp_username# e.g. your_email@gmail.comEMAIL_PASS=your_smtp_password# or app passwordEMAIL_FROM="PaySphere <no-reply@paysphere.com>"EMAIL_PROXY_SECRET=your_email_proxy_secret_key# Aliases (used by SMTP transport — populate both pairs for compatibility)SMTP_HOST=your_smtp_hostSMTP_PORT=587SMTP_SECURE=falseSMTP_USER=your_smtp_userSMTP_PASS=your_smtp_pass# LoggingLOG_LEVEL=info

2. Frontend Configuration

Copy the .env.example file to create a .env file in frontend/:

cp .env.example .env

Update the variables with your own values:

VITE_API_URL=http://localhost:5000VITE_GOOGLE_CLIENT_ID=your_google_id# Email Proxy SMTP (used by Vercel Serverless Function at /api/send-email)EMAIL_PROXY_SECRET=your_email_proxy_secret_keySMTP_HOST=smtp.gmail.comSMTP_PORT=587SMTP_USER=your_email@gmail.comSMTP_PASS=your_app_passwordSMTP_SECURE=falseEMAIL_FROM="PaySphere" <no-reply@paysphere.com>

3. Run Development

# Backendcd backend && npm run dev
# Frontendcd frontend && npm run dev

4. Run with Docker (Recommended)

The entire stack (MongoDB + backend + frontend) can be started with a single command using Docker Compose. Hot-reloading is enabled for both the backend (nodemon) and the frontend (Vite HMR).

Prerequisites: Docker with Docker Compose v2.

# From the repo root
docker compose up --build

This starts:

  • MongoDB at localhost:27017
  • Backend API at http://localhost:5000
  • Frontend at http://localhost:5173

All services work out of the box with sensible defaults. To override secrets and Google/SMTP settings, copy the root .env.example to .env and edit it:

cp .env.example .env

Then restart the stack for changes to take effect:

docker compose up -d
docker compose restart backend

Useful commands:

# Build/start all services in the background
docker compose up --build -d
# Stream logs from all services (or one: docker compose logs backend)
docker compose logs -f
# Stop the stack (keeps the MongoDB volume)
docker compose down
# Stop and delete the MongoDB data volume
docker compose down -v

Note: Redis is optional. Without a REDIS_URL, caching falls back to an in-memory store and background payslip email jobs remain available in a degraded mode.

5. Testing

# Run backend test suite (Jest + Supertest)cd backend && npm test

PaySphere — Payroll in seconds, not hours. ⚡

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,618 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PaySphere

PaySphere 💰

Payroll in seconds, not hours.
A lightweight payroll management system built for small businesses in India.

Figma DesignLive ProjectPostman DocumentationBackend APIYouTube Demo


❗ Problem Statement

Small businesses employing fewer than 10 workers spend hours every month manually calculating salaries factoring in paid leave, unpaid absences, overtime hours, and festival bonuses.

Most payroll software is built for large enterprises, making them:

  • Too complex for tiny teams.
  • Expensive and over-engineered.
  • Not optimized for the fast-paced "Digital Ledger" style of Bharat.

👉 Result: Wasted time, calculation errors, and frustration.


💡 Solution

PaySphere simplifies payroll into a 3-step workflow:

  1. 👥 Add Employees: Quickly onboard your team with base salary and overtime rates.
  2. 💬 Log Updates: Add leaves, overtime, and bonuses through a clean, intuitive interface.
  3. Run Payroll: Generate professional payslips and finalize payouts in one click.

🎯 Features

FeatureDescription
🔐 Google AuthenticationSecure Login & Signup with Google One-Tap integration.
🛡️ Role-Based Access Control (RBAC)Granular permissions with Admin, Manager, and Viewer roles for team collaboration.
👥 Employee ManagementDashboard view with status, role, and salary at a glance.
📥 Bulk Employee Import (CSV)Onboard entire teams in seconds by uploading a CSV file with row-level validation & duplicate detection.
💬 Activity TrackingLog leave, overtime, bonuses, and deductions per employee.
Instant PayrollAutomated calculation of Net Salary based on monthly activity.
📄 Professional PayslipsDownload detailed PDF breakdowns for each payout.
📧 Bulk Payslip EmailingOne-click or auto-scheduled (via cron) email dispatch of payslips to all employees.
📊 Advanced Reporting & AnalyticsInteractive dashboard with payroll trends, department/role breakdowns, and overtime analysis.
📑 XLSX Payroll SummariesExport formatted Excel spreadsheets with totals and per-employee breakdowns.
📦 ZIP Payslip ExportDownload a single ZIP archive containing all employee payslip PDFs for a given month.
📋 Audit LoggingEvent bus tracking for all mutations (payroll runs, employee CRUD, imports, emails, reports) with IP & user agent.
📱 Responsive DesignFully optimized for Mobile, Tablet, and Desktop.

🛠️ Tech Stack

LayerTechnologies
FrontendReact.js (v19), Vite, Tailwind CSS v4, MUI (Material UI), Redux Toolkit, Recharts, React Router
BackendNode.js, Express.js (v5), MongoDB, Mongoose, Redis (Caching layer), BullMQ (Background Jobs)
DeploymentVercel (Frontend), Render (Backend)
Tools & LibrariesExcelJS (XLSX exports), Archiver (ZIP archives), Nodemailer (SMTP emails), PDFKit, Multer, csv-parse, node-cron, Winston, Helmet, Jest (Testing)

📁 Project Structure

paysphere/
├── backend/
│ ├── src/
│ │ ├── config/ # Database connection & environment config
│ │ ├── controllers/ # Business logic (employees, payroll, reports, users)
│ │ │ └── __tests__/ # Controller unit tests (Jest + Supertest)
│ │ ├── jobs/ # Scheduled cron jobs (monthly payslip emails)
│ │ ├── middlewares/ # Auth, error handling, rate limiting, file upload
│ │ │ └── __tests__/ # Middleware tests
│ │ ├── models/ # Mongoose schemas (User, Employee, Payroll, AuditLog, CronLock)
│ │ ├── routes/ # API endpoint definitions
│ │ ├── seeds/ # Database seed scripts
│ │ ├── services/ # Cross-cutting services (audit logging, email dispatch)
│ │ │ └── __tests__/ # Service tests
│ │ ├── utils/ # Helpers: salary calculator, CSV export, logger, validators, email
│ │ │ └── __tests__/ # Utility unit tests
│ │ ├── workers/ # Background worker threads (PDF generation)
│ │ ├── app.js # Express app setup & middleware chain
│ │ └── index.js # Server entry point & cron job bootstrap
├── frontend/
│ ├── src/
│ │ ├── assets/ # Images and local files
│ │ ├── components/ # Reusable UI Components
│ │ │ ├── common/ # Button, Input, Modal, Skeleton, EmptyState, etc.
│ │ │ └── reports/ # Charts & tables: PayrollTrend, SalaryDistribution, etc.
│ │ ├── features/ # Feature-based slices (Auth, UI, User) + Redux hooks & services
│ │ ├── hooks/ # Global reusable React hooks (e.g., useLocalStorage)
│ │ ├── pages/ # Main route views (Landing, Dashboard, Reports, Settings, etc.)
│ │ ├── services/ # API services (axios config + request helpers)
│ │ ├── store/ # Redux store configuration
│ │ ├── utils/ # Helper functions and constants
│ │ ├── App.jsx # Route definitions & global providers
│ │ ├── main.jsx # React root & app bootstrap
│ │ └── index.css # Global styles + Tailwind directives

📸 Screenshots

Dashboard Overview

PaySphere Dashboard


🚀 Installation & Setup

1. Backend Configuration

Copy the .env.example file to create a .env file in backend/:

cp .env.example .env

Update the variables with your own values:

# ServerPORT=5000FRONTEND_URL=http://localhost:5173NODE_ENV=development# DatabaseMONGO_URI=your_mongodb_uri# AuthenticationJWT_SECRET=your_secret_keyGOOGLE_CLIENT_ID=your_google_idGOOGLE_CLIENT_SECRET=your_google_secret# Caching & Background JobsREDIS_URI=your_redis_connection_uri# Email (SMTP)# Backend sends payslips & notifications directly via SMTP. If SMTP is# not configured, it falls back to the Vercel proxy at FRONTEND_URL/api/send-email,# then to console logging.EMAIL_HOST=your_smtp_host# e.g. smtp.gmail.comEMAIL_PORT=587# or 465 for SSLEMAIL_SECURE=false# true for port 465EMAIL_USER=your_smtp_username# e.g. your_email@gmail.comEMAIL_PASS=your_smtp_password# or app passwordEMAIL_FROM="PaySphere <no-reply@paysphere.com>"EMAIL_PROXY_SECRET=your_email_proxy_secret_key# Aliases (used by SMTP transport — populate both pairs for compatibility)SMTP_HOST=your_smtp_hostSMTP_PORT=587SMTP_SECURE=falseSMTP_USER=your_smtp_userSMTP_PASS=your_smtp_pass# LoggingLOG_LEVEL=info

2. Frontend Configuration

Copy the .env.example file to create a .env file in frontend/:

cp .env.example .env

Update the variables with your own values:

VITE_API_URL=http://localhost:5000VITE_GOOGLE_CLIENT_ID=your_google_id# Email Proxy SMTP (used by Vercel Serverless Function at /api/send-email)EMAIL_PROXY_SECRET=your_email_proxy_secret_keySMTP_HOST=smtp.gmail.comSMTP_PORT=587SMTP_USER=your_email@gmail.comSMTP_PASS=your_app_passwordSMTP_SECURE=falseEMAIL_FROM="PaySphere" <no-reply@paysphere.com>

3. Run Development

# Backendcd backend && npm run dev
# Frontendcd frontend && npm run dev

4. Run with Docker (Recommended)

The entire stack (MongoDB + backend + frontend) can be started with a single command using Docker Compose. Hot-reloading is enabled for both the backend (nodemon) and the frontend (Vite HMR).

Prerequisites: Docker with Docker Compose v2.

# From the repo root
docker compose up --build

This starts:

  • MongoDB at localhost:27017
  • Backend API at http://localhost:5000
  • Frontend at http://localhost:5173

All services work out of the box with sensible defaults. To override secrets and Google/SMTP settings, copy the root .env.example to .env and edit it:

cp .env.example .env

Then restart the stack for changes to take effect:

docker compose up -d
docker compose restart backend

Useful commands:

# Build/start all services in the background
docker compose up --build -d
# Stream logs from all services (or one: docker compose logs backend)
docker compose logs -f
# Stop the stack (keeps the MongoDB volume)
docker compose down
# Stop and delete the MongoDB data volume
docker compose down -v

Note: Redis is optional. Without a REDIS_URL, caching falls back to an in-memory store and background payslip email jobs remain available in a degraded mode.

5. Testing

# Run backend test suite (Jest + Supertest)cd backend && npm test

PaySphere — Payroll in seconds, not hours. ⚡

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

2,618 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PaySphere

PaySphere 💰

Payroll in seconds, not hours.
A lightweight payroll management system built for small businesses in India.

Figma DesignLive ProjectPostman DocumentationBackend APIYouTube Demo


❗ Problem Statement

Small businesses employing fewer than 10 workers spend hours every month manually calculating salaries factoring in paid leave, unpaid absences, overtime hours, and festival bonuses.

Most payroll software is built for large enterprises, making them:

  • Too complex for tiny teams.
  • Expensive and over-engineered.
  • Not optimized for the fast-paced "Digital Ledger" style of Bharat.

👉 Result: Wasted time, calculation errors, and frustration.


💡 Solution

PaySphere simplifies payroll into a 3-step workflow:

  1. 👥 Add Employees: Quickly onboard your team with base salary and overtime rates.
  2. 💬 Log Updates: Add leaves, overtime, and bonuses through a clean, intuitive interface.
  3. Run Payroll: Generate professional payslips and finalize payouts in one click.

🎯 Features

FeatureDescription
🔐 Google AuthenticationSecure Login & Signup with Google One-Tap integration.
🛡️ Role-Based Access Control (RBAC)Granular permissions with Admin, Manager, and Viewer roles for team collaboration.
👥 Employee ManagementDashboard view with status, role, and salary at a glance.
📥 Bulk Employee Import (CSV)Onboard entire teams in seconds by uploading a CSV file with row-level validation & duplicate detection.
💬 Activity TrackingLog leave, overtime, bonuses, and deductions per employee.
Instant PayrollAutomated calculation of Net Salary based on monthly activity.
📄 Professional PayslipsDownload detailed PDF breakdowns for each payout.
📧 Bulk Payslip EmailingOne-click or auto-scheduled (via cron) email dispatch of payslips to all employees.
📊 Advanced Reporting & AnalyticsInteractive dashboard with payroll trends, department/role breakdowns, and overtime analysis.
📑 XLSX Payroll SummariesExport formatted Excel spreadsheets with totals and per-employee breakdowns.
📦 ZIP Payslip ExportDownload a single ZIP archive containing all employee payslip PDFs for a given month.
📋 Audit LoggingEvent bus tracking for all mutations (payroll runs, employee CRUD, imports, emails, reports) with IP & user agent.
📱 Responsive DesignFully optimized for Mobile, Tablet, and Desktop.

🛠️ Tech Stack

LayerTechnologies
FrontendReact.js (v19), Vite, Tailwind CSS v4, MUI (Material UI), Redux Toolkit, Recharts, React Router
BackendNode.js, Express.js (v5), MongoDB, Mongoose, Redis (Caching layer), BullMQ (Background Jobs)
DeploymentVercel (Frontend), Render (Backend)
Tools & LibrariesExcelJS (XLSX exports), Archiver (ZIP archives), Nodemailer (SMTP emails), PDFKit, Multer, csv-parse, node-cron, Winston, Helmet, Jest (Testing)

📁 Project Structure

paysphere/
├── backend/
│ ├── src/
│ │ ├── config/ # Database connection & environment config
│ │ ├── controllers/ # Business logic (employees, payroll, reports, users)
│ │ │ └── __tests__/ # Controller unit tests (Jest + Supertest)
│ │ ├── jobs/ # Scheduled cron jobs (monthly payslip emails)
│ │ ├── middlewares/ # Auth, error handling, rate limiting, file upload
│ │ │ └── __tests__/ # Middleware tests
│ │ ├── models/ # Mongoose schemas (User, Employee, Payroll, AuditLog, CronLock)
│ │ ├── routes/ # API endpoint definitions
│ │ ├── seeds/ # Database seed scripts
│ │ ├── services/ # Cross-cutting services (audit logging, email dispatch)
│ │ │ └── __tests__/ # Service tests
│ │ ├── utils/ # Helpers: salary calculator, CSV export, logger, validators, email
│ │ │ └── __tests__/ # Utility unit tests
│ │ ├── workers/ # Background worker threads (PDF generation)
│ │ ├── app.js # Express app setup & middleware chain
│ │ └── index.js # Server entry point & cron job bootstrap
├── frontend/
│ ├── src/
│ │ ├── assets/ # Images and local files
│ │ ├── components/ # Reusable UI Components
│ │ │ ├── common/ # Button, Input, Modal, Skeleton, EmptyState, etc.
│ │ │ └── reports/ # Charts & tables: PayrollTrend, SalaryDistribution, etc.
│ │ ├── features/ # Feature-based slices (Auth, UI, User) + Redux hooks & services
│ │ ├── hooks/ # Global reusable React hooks (e.g., useLocalStorage)
│ │ ├── pages/ # Main route views (Landing, Dashboard, Reports, Settings, etc.)
│ │ ├── services/ # API services (axios config + request helpers)
│ │ ├── store/ # Redux store configuration
│ │ ├── utils/ # Helper functions and constants
│ │ ├── App.jsx # Route definitions & global providers
│ │ ├── main.jsx # React root & app bootstrap
│ │ └── index.css # Global styles + Tailwind directives

📸 Screenshots

Dashboard Overview

PaySphere Dashboard


🚀 Installation & Setup

1. Backend Configuration

Copy the .env.example file to create a .env file in backend/:

cp .env.example .env

Update the variables with your own values:

# ServerPORT=5000FRONTEND_URL=http://localhost:5173NODE_ENV=development# DatabaseMONGO_URI=your_mongodb_uri# AuthenticationJWT_SECRET=your_secret_keyGOOGLE_CLIENT_ID=your_google_idGOOGLE_CLIENT_SECRET=your_google_secret# Caching & Background JobsREDIS_URI=your_redis_connection_uri# Email (SMTP)# Backend sends payslips & notifications directly via SMTP. If SMTP is# not configured, it falls back to the Vercel proxy at FRONTEND_URL/api/send-email,# then to console logging.EMAIL_HOST=your_smtp_host# e.g. smtp.gmail.comEMAIL_PORT=587# or 465 for SSLEMAIL_SECURE=false# true for port 465EMAIL_USER=your_smtp_username# e.g. your_email@gmail.comEMAIL_PASS=your_smtp_password# or app passwordEMAIL_FROM="PaySphere <no-reply@paysphere.com>"EMAIL_PROXY_SECRET=your_email_proxy_secret_key# Aliases (used by SMTP transport — populate both pairs for compatibility)SMTP_HOST=your_smtp_hostSMTP_PORT=587SMTP_SECURE=falseSMTP_USER=your_smtp_userSMTP_PASS=your_smtp_pass# LoggingLOG_LEVEL=info

2. Frontend Configuration

Copy the .env.example file to create a .env file in frontend/:

cp .env.example .env

Update the variables with your own values:

VITE_API_URL=http://localhost:5000VITE_GOOGLE_CLIENT_ID=your_google_id# Email Proxy SMTP (used by Vercel Serverless Function at /api/send-email)EMAIL_PROXY_SECRET=your_email_proxy_secret_keySMTP_HOST=smtp.gmail.comSMTP_PORT=587SMTP_USER=your_email@gmail.comSMTP_PASS=your_app_passwordSMTP_SECURE=falseEMAIL_FROM="PaySphere" <no-reply@paysphere.com>

3. Run Development

# Backendcd backend && npm run dev
# Frontendcd frontend && npm run dev

4. Run with Docker (Recommended)

The entire stack (MongoDB + backend + frontend) can be started with a single command using Docker Compose. Hot-reloading is enabled for both the backend (nodemon) and the frontend (Vite HMR).

Prerequisites: Docker with Docker Compose v2.

# From the repo root
docker compose up --build

This starts:

  • MongoDB at localhost:27017
  • Backend API at http://localhost:5000
  • Frontend at http://localhost:5173

All services work out of the box with sensible defaults. To override secrets and Google/SMTP settings, copy the root .env.example to .env and edit it:

cp .env.example .env

Then restart the stack for changes to take effect:

docker compose up -d
docker compose restart backend

Useful commands:

# Build/start all services in the background
docker compose up --build -d
# Stream logs from all services (or one: docker compose logs backend)
docker compose logs -f
# Stop the stack (keeps the MongoDB volume)
docker compose down
# Stop and delete the MongoDB data volume
docker compose down -v

Note: Redis is optional. Without a REDIS_URL, caching falls back to an in-memory store and background payslip email jobs remain available in a degraded mode.

5. Testing

# Run backend test suite (Jest + Supertest)cd backend && npm test

PaySphere — Payroll in seconds, not hours. ⚡

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,618 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PaySphere

PaySphere 💰

Payroll in seconds, not hours.
A lightweight payroll management system built for small businesses in India.

Figma DesignLive ProjectPostman DocumentationBackend APIYouTube Demo


❗ Problem Statement

Small businesses employing fewer than 10 workers spend hours every month manually calculating salaries factoring in paid leave, unpaid absences, overtime hours, and festival bonuses.

Most payroll software is built for large enterprises, making them:

  • Too complex for tiny teams.
  • Expensive and over-engineered.
  • Not optimized for the fast-paced "Digital Ledger" style of Bharat.

👉 Result: Wasted time, calculation errors, and frustration.


💡 Solution

PaySphere simplifies payroll into a 3-step workflow:

  1. 👥 Add Employees: Quickly onboard your team with base salary and overtime rates.
  2. 💬 Log Updates: Add leaves, overtime, and bonuses through a clean, intuitive interface.
  3. Run Payroll: Generate professional payslips and finalize payouts in one click.

🎯 Features

FeatureDescription
🔐 Google AuthenticationSecure Login & Signup with Google One-Tap integration.
🛡️ Role-Based Access Control (RBAC)Granular permissions with Admin, Manager, and Viewer roles for team collaboration.
👥 Employee ManagementDashboard view with status, role, and salary at a glance.
📥 Bulk Employee Import (CSV)Onboard entire teams in seconds by uploading a CSV file with row-level validation & duplicate detection.
💬 Activity TrackingLog leave, overtime, bonuses, and deductions per employee.
Instant PayrollAutomated calculation of Net Salary based on monthly activity.
📄 Professional PayslipsDownload detailed PDF breakdowns for each payout.
📧 Bulk Payslip EmailingOne-click or auto-scheduled (via cron) email dispatch of payslips to all employees.
📊 Advanced Reporting & AnalyticsInteractive dashboard with payroll trends, department/role breakdowns, and overtime analysis.
📑 XLSX Payroll SummariesExport formatted Excel spreadsheets with totals and per-employee breakdowns.
📦 ZIP Payslip ExportDownload a single ZIP archive containing all employee payslip PDFs for a given month.
📋 Audit LoggingEvent bus tracking for all mutations (payroll runs, employee CRUD, imports, emails, reports) with IP & user agent.
📱 Responsive DesignFully optimized for Mobile, Tablet, and Desktop.

🛠️ Tech Stack

LayerTechnologies
FrontendReact.js (v19), Vite, Tailwind CSS v4, MUI (Material UI), Redux Toolkit, Recharts, React Router
BackendNode.js, Express.js (v5), MongoDB, Mongoose, Redis (Caching layer), BullMQ (Background Jobs)
DeploymentVercel (Frontend), Render (Backend)
Tools & LibrariesExcelJS (XLSX exports), Archiver (ZIP archives), Nodemailer (SMTP emails), PDFKit, Multer, csv-parse, node-cron, Winston, Helmet, Jest (Testing)

📁 Project Structure

paysphere/
├── backend/
│ ├── src/
│ │ ├── config/ # Database connection & environment config
│ │ ├── controllers/ # Business logic (employees, payroll, reports, users)
│ │ │ └── __tests__/ # Controller unit tests (Jest + Supertest)
│ │ ├── jobs/ # Scheduled cron jobs (monthly payslip emails)
│ │ ├── middlewares/ # Auth, error handling, rate limiting, file upload
│ │ │ └── __tests__/ # Middleware tests
│ │ ├── models/ # Mongoose schemas (User, Employee, Payroll, AuditLog, CronLock)
│ │ ├── routes/ # API endpoint definitions
│ │ ├── seeds/ # Database seed scripts
│ │ ├── services/ # Cross-cutting services (audit logging, email dispatch)
│ │ │ └── __tests__/ # Service tests
│ │ ├── utils/ # Helpers: salary calculator, CSV export, logger, validators, email
│ │ │ └── __tests__/ # Utility unit tests
│ │ ├── workers/ # Background worker threads (PDF generation)
│ │ ├── app.js # Express app setup & middleware chain
│ │ └── index.js # Server entry point & cron job bootstrap
├── frontend/
│ ├── src/
│ │ ├── assets/ # Images and local files
│ │ ├── components/ # Reusable UI Components
│ │ │ ├── common/ # Button, Input, Modal, Skeleton, EmptyState, etc.
│ │ │ └── reports/ # Charts & tables: PayrollTrend, SalaryDistribution, etc.
│ │ ├── features/ # Feature-based slices (Auth, UI, User) + Redux hooks & services
│ │ ├── hooks/ # Global reusable React hooks (e.g., useLocalStorage)
│ │ ├── pages/ # Main route views (Landing, Dashboard, Reports, Settings, etc.)
│ │ ├── services/ # API services (axios config + request helpers)
│ │ ├── store/ # Redux store configuration
│ │ ├── utils/ # Helper functions and constants
│ │ ├── App.jsx # Route definitions & global providers
│ │ ├── main.jsx # React root & app bootstrap
│ │ └── index.css # Global styles + Tailwind directives

📸 Screenshots

Dashboard Overview

PaySphere Dashboard


🚀 Installation & Setup

1. Backend Configuration

Copy the .env.example file to create a .env file in backend/:

cp .env.example .env

Update the variables with your own values:

# ServerPORT=5000FRONTEND_URL=http://localhost:5173NODE_ENV=development# DatabaseMONGO_URI=your_mongodb_uri# AuthenticationJWT_SECRET=your_secret_keyGOOGLE_CLIENT_ID=your_google_idGOOGLE_CLIENT_SECRET=your_google_secret# Caching & Background JobsREDIS_URI=your_redis_connection_uri# Email (SMTP)# Backend sends payslips & notifications directly via SMTP. If SMTP is# not configured, it falls back to the Vercel proxy at FRONTEND_URL/api/send-email,# then to console logging.EMAIL_HOST=your_smtp_host# e.g. smtp.gmail.comEMAIL_PORT=587# or 465 for SSLEMAIL_SECURE=false# true for port 465EMAIL_USER=your_smtp_username# e.g. your_email@gmail.comEMAIL_PASS=your_smtp_password# or app passwordEMAIL_FROM="PaySphere <no-reply@paysphere.com>"EMAIL_PROXY_SECRET=your_email_proxy_secret_key# Aliases (used by SMTP transport — populate both pairs for compatibility)SMTP_HOST=your_smtp_hostSMTP_PORT=587SMTP_SECURE=falseSMTP_USER=your_smtp_userSMTP_PASS=your_smtp_pass# LoggingLOG_LEVEL=info

2. Frontend Configuration

Copy the .env.example file to create a .env file in frontend/:

cp .env.example .env

Update the variables with your own values:

VITE_API_URL=http://localhost:5000VITE_GOOGLE_CLIENT_ID=your_google_id# Email Proxy SMTP (used by Vercel Serverless Function at /api/send-email)EMAIL_PROXY_SECRET=your_email_proxy_secret_keySMTP_HOST=smtp.gmail.comSMTP_PORT=587SMTP_USER=your_email@gmail.comSMTP_PASS=your_app_passwordSMTP_SECURE=falseEMAIL_FROM="PaySphere" <no-reply@paysphere.com>

3. Run Development

# Backendcd backend && npm run dev
# Frontendcd frontend && npm run dev

4. Run with Docker (Recommended)

The entire stack (MongoDB + backend + frontend) can be started with a single command using Docker Compose. Hot-reloading is enabled for both the backend (nodemon) and the frontend (Vite HMR).

Prerequisites: Docker with Docker Compose v2.

# From the repo root
docker compose up --build

This starts:

  • MongoDB at localhost:27017
  • Backend API at http://localhost:5000
  • Frontend at http://localhost:5173

All services work out of the box with sensible defaults. To override secrets and Google/SMTP settings, copy the root .env.example to .env and edit it:

cp .env.example .env

Then restart the stack for changes to take effect:

docker compose up -d
docker compose restart backend

Useful commands:

# Build/start all services in the background
docker compose up --build -d
# Stream logs from all services (or one: docker compose logs backend)
docker compose logs -f
# Stop the stack (keeps the MongoDB volume)
docker compose down
# Stop and delete the MongoDB data volume
docker compose down -v

Note: Redis is optional. Without a REDIS_URL, caching falls back to an in-memory store and background payslip email jobs remain available in a degraded mode.

5. Testing

# Run backend test suite (Jest + Supertest)cd backend && npm test

PaySphere — Payroll in seconds, not hours. ⚡

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,618 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PaySphere

PaySphere 💰

Payroll in seconds, not hours.
A lightweight payroll management system built for small businesses in India.

Figma DesignLive ProjectPostman DocumentationBackend APIYouTube Demo


❗ Problem Statement

Small businesses employing fewer than 10 workers spend hours every month manually calculating salaries factoring in paid leave, unpaid absences, overtime hours, and festival bonuses.

Most payroll software is built for large enterprises, making them:

  • Too complex for tiny teams.
  • Expensive and over-engineered.
  • Not optimized for the fast-paced "Digital Ledger" style of Bharat.

👉 Result: Wasted time, calculation errors, and frustration.


💡 Solution

PaySphere simplifies payroll into a 3-step workflow:

  1. 👥 Add Employees: Quickly onboard your team with base salary and overtime rates.
  2. 💬 Log Updates: Add leaves, overtime, and bonuses through a clean, intuitive interface.
  3. Run Payroll: Generate professional payslips and finalize payouts in one click.

🎯 Features

FeatureDescription
🔐 Google AuthenticationSecure Login & Signup with Google One-Tap integration.
🛡️ Role-Based Access Control (RBAC)Granular permissions with Admin, Manager, and Viewer roles for team collaboration.
👥 Employee ManagementDashboard view with status, role, and salary at a glance.
📥 Bulk Employee Import (CSV)Onboard entire teams in seconds by uploading a CSV file with row-level validation & duplicate detection.
💬 Activity TrackingLog leave, overtime, bonuses, and deductions per employee.
Instant PayrollAutomated calculation of Net Salary based on monthly activity.
📄 Professional PayslipsDownload detailed PDF breakdowns for each payout.
📧 Bulk Payslip EmailingOne-click or auto-scheduled (via cron) email dispatch of payslips to all employees.
📊 Advanced Reporting & AnalyticsInteractive dashboard with payroll trends, department/role breakdowns, and overtime analysis.
📑 XLSX Payroll SummariesExport formatted Excel spreadsheets with totals and per-employee breakdowns.
📦 ZIP Payslip ExportDownload a single ZIP archive containing all employee payslip PDFs for a given month.
📋 Audit LoggingEvent bus tracking for all mutations (payroll runs, employee CRUD, imports, emails, reports) with IP & user agent.
📱 Responsive DesignFully optimized for Mobile, Tablet, and Desktop.

🛠️ Tech Stack

LayerTechnologies
FrontendReact.js (v19), Vite, Tailwind CSS v4, MUI (Material UI), Redux Toolkit, Recharts, React Router
BackendNode.js, Express.js (v5), MongoDB, Mongoose, Redis (Caching layer), BullMQ (Background Jobs)
DeploymentVercel (Frontend), Render (Backend)
Tools & LibrariesExcelJS (XLSX exports), Archiver (ZIP archives), Nodemailer (SMTP emails), PDFKit, Multer, csv-parse, node-cron, Winston, Helmet, Jest (Testing)

📁 Project Structure

paysphere/
├── backend/
│ ├── src/
│ │ ├── config/ # Database connection & environment config
│ │ ├── controllers/ # Business logic (employees, payroll, reports, users)
│ │ │ └── __tests__/ # Controller unit tests (Jest + Supertest)
│ │ ├── jobs/ # Scheduled cron jobs (monthly payslip emails)
│ │ ├── middlewares/ # Auth, error handling, rate limiting, file upload
│ │ │ └── __tests__/ # Middleware tests
│ │ ├── models/ # Mongoose schemas (User, Employee, Payroll, AuditLog, CronLock)
│ │ ├── routes/ # API endpoint definitions
│ │ ├── seeds/ # Database seed scripts
│ │ ├── services/ # Cross-cutting services (audit logging, email dispatch)
│ │ │ └── __tests__/ # Service tests
│ │ ├── utils/ # Helpers: salary calculator, CSV export, logger, validators, email
│ │ │ └── __tests__/ # Utility unit tests
│ │ ├── workers/ # Background worker threads (PDF generation)
│ │ ├── app.js # Express app setup & middleware chain
│ │ └── index.js # Server entry point & cron job bootstrap
├── frontend/
│ ├── src/
│ │ ├── assets/ # Images and local files
│ │ ├── components/ # Reusable UI Components
│ │ │ ├── common/ # Button, Input, Modal, Skeleton, EmptyState, etc.
│ │ │ └── reports/ # Charts & tables: PayrollTrend, SalaryDistribution, etc.
│ │ ├── features/ # Feature-based slices (Auth, UI, User) + Redux hooks & services
│ │ ├── hooks/ # Global reusable React hooks (e.g., useLocalStorage)
│ │ ├── pages/ # Main route views (Landing, Dashboard, Reports, Settings, etc.)
│ │ ├── services/ # API services (axios config + request helpers)
│ │ ├── store/ # Redux store configuration
│ │ ├── utils/ # Helper functions and constants
│ │ ├── App.jsx # Route definitions & global providers
│ │ ├── main.jsx # React root & app bootstrap
│ │ └── index.css # Global styles + Tailwind directives

📸 Screenshots

Dashboard Overview

PaySphere Dashboard


🚀 Installation & Setup

1. Backend Configuration

Copy the .env.example file to create a .env file in backend/:

cp .env.example .env

Update the variables with your own values:

# ServerPORT=5000FRONTEND_URL=http://localhost:5173NODE_ENV=development# DatabaseMONGO_URI=your_mongodb_uri# AuthenticationJWT_SECRET=your_secret_keyGOOGLE_CLIENT_ID=your_google_idGOOGLE_CLIENT_SECRET=your_google_secret# Caching & Background JobsREDIS_URI=your_redis_connection_uri# Email (SMTP)# Backend sends payslips & notifications directly via SMTP. If SMTP is# not configured, it falls back to the Vercel proxy at FRONTEND_URL/api/send-email,# then to console logging.EMAIL_HOST=your_smtp_host# e.g. smtp.gmail.comEMAIL_PORT=587# or 465 for SSLEMAIL_SECURE=false# true for port 465EMAIL_USER=your_smtp_username# e.g. your_email@gmail.comEMAIL_PASS=your_smtp_password# or app passwordEMAIL_FROM="PaySphere <no-reply@paysphere.com>"EMAIL_PROXY_SECRET=your_email_proxy_secret_key# Aliases (used by SMTP transport — populate both pairs for compatibility)SMTP_HOST=your_smtp_hostSMTP_PORT=587SMTP_SECURE=falseSMTP_USER=your_smtp_userSMTP_PASS=your_smtp_pass# LoggingLOG_LEVEL=info

2. Frontend Configuration

Copy the .env.example file to create a .env file in frontend/:

cp .env.example .env

Update the variables with your own values:

VITE_API_URL=http://localhost:5000VITE_GOOGLE_CLIENT_ID=your_google_id# Email Proxy SMTP (used by Vercel Serverless Function at /api/send-email)EMAIL_PROXY_SECRET=your_email_proxy_secret_keySMTP_HOST=smtp.gmail.comSMTP_PORT=587SMTP_USER=your_email@gmail.comSMTP_PASS=your_app_passwordSMTP_SECURE=falseEMAIL_FROM="PaySphere" <no-reply@paysphere.com>

3. Run Development

# Backendcd backend && npm run dev
# Frontendcd frontend && npm run dev

4. Run with Docker (Recommended)

The entire stack (MongoDB + backend + frontend) can be started with a single command using Docker Compose. Hot-reloading is enabled for both the backend (nodemon) and the frontend (Vite HMR).

Prerequisites: Docker with Docker Compose v2.

# From the repo root
docker compose up --build

This starts:

  • MongoDB at localhost:27017
  • Backend API at http://localhost:5000
  • Frontend at http://localhost:5173

All services work out of the box with sensible defaults. To override secrets and Google/SMTP settings, copy the root .env.example to .env and edit it:

cp .env.example .env

Then restart the stack for changes to take effect:

docker compose up -d
docker compose restart backend

Useful commands:

# Build/start all services in the background
docker compose up --build -d
# Stream logs from all services (or one: docker compose logs backend)
docker compose logs -f
# Stop the stack (keeps the MongoDB volume)
docker compose down
# Stop and delete the MongoDB data volume
docker compose down -v

Note: Redis is optional. Without a REDIS_URL, caching falls back to an in-memory store and background payslip email jobs remain available in a degraded mode.

5. Testing

# Run backend test suite (Jest + Supertest)cd backend && npm test

PaySphere — Payroll in seconds, not hours. ⚡

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

2,618 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PaySphere

PaySphere 💰

Payroll in seconds, not hours.
A lightweight payroll management system built for small businesses in India.

Figma DesignLive ProjectPostman DocumentationBackend APIYouTube Demo


❗ Problem Statement

Small businesses employing fewer than 10 workers spend hours every month manually calculating salaries factoring in paid leave, unpaid absences, overtime hours, and festival bonuses.

Most payroll software is built for large enterprises, making them:

  • Too complex for tiny teams.
  • Expensive and over-engineered.
  • Not optimized for the fast-paced "Digital Ledger" style of Bharat.

👉 Result: Wasted time, calculation errors, and frustration.


💡 Solution

PaySphere simplifies payroll into a 3-step workflow:

  1. 👥 Add Employees: Quickly onboard your team with base salary and overtime rates.
  2. 💬 Log Updates: Add leaves, overtime, and bonuses through a clean, intuitive interface.
  3. Run Payroll: Generate professional payslips and finalize payouts in one click.

🎯 Features

FeatureDescription
🔐 Google AuthenticationSecure Login & Signup with Google One-Tap integration.
🛡️ Role-Based Access Control (RBAC)Granular permissions with Admin, Manager, and Viewer roles for team collaboration.
👥 Employee ManagementDashboard view with status, role, and salary at a glance.
📥 Bulk Employee Import (CSV)Onboard entire teams in seconds by uploading a CSV file with row-level validation & duplicate detection.
💬 Activity TrackingLog leave, overtime, bonuses, and deductions per employee.
Instant PayrollAutomated calculation of Net Salary based on monthly activity.
📄 Professional PayslipsDownload detailed PDF breakdowns for each payout.
📧 Bulk Payslip EmailingOne-click or auto-scheduled (via cron) email dispatch of payslips to all employees.
📊 Advanced Reporting & AnalyticsInteractive dashboard with payroll trends, department/role breakdowns, and overtime analysis.
📑 XLSX Payroll SummariesExport formatted Excel spreadsheets with totals and per-employee breakdowns.
📦 ZIP Payslip ExportDownload a single ZIP archive containing all employee payslip PDFs for a given month.
📋 Audit LoggingEvent bus tracking for all mutations (payroll runs, employee CRUD, imports, emails, reports) with IP & user agent.
📱 Responsive DesignFully optimized for Mobile, Tablet, and Desktop.

🛠️ Tech Stack

LayerTechnologies
FrontendReact.js (v19), Vite, Tailwind CSS v4, MUI (Material UI), Redux Toolkit, Recharts, React Router
BackendNode.js, Express.js (v5), MongoDB, Mongoose, Redis (Caching layer), BullMQ (Background Jobs)
DeploymentVercel (Frontend), Render (Backend)
Tools & LibrariesExcelJS (XLSX exports), Archiver (ZIP archives), Nodemailer (SMTP emails), PDFKit, Multer, csv-parse, node-cron, Winston, Helmet, Jest (Testing)

📁 Project Structure

paysphere/
├── backend/
│ ├── src/
│ │ ├── config/ # Database connection & environment config
│ │ ├── controllers/ # Business logic (employees, payroll, reports, users)
│ │ │ └── __tests__/ # Controller unit tests (Jest + Supertest)
│ │ ├── jobs/ # Scheduled cron jobs (monthly payslip emails)
│ │ ├── middlewares/ # Auth, error handling, rate limiting, file upload
│ │ │ └── __tests__/ # Middleware tests
│ │ ├── models/ # Mongoose schemas (User, Employee, Payroll, AuditLog, CronLock)
│ │ ├── routes/ # API endpoint definitions
│ │ ├── seeds/ # Database seed scripts
│ │ ├── services/ # Cross-cutting services (audit logging, email dispatch)
│ │ │ └── __tests__/ # Service tests
│ │ ├── utils/ # Helpers: salary calculator, CSV export, logger, validators, email
│ │ │ └── __tests__/ # Utility unit tests
│ │ ├── workers/ # Background worker threads (PDF generation)
│ │ ├── app.js # Express app setup & middleware chain
│ │ └── index.js # Server entry point & cron job bootstrap
├── frontend/
│ ├── src/
│ │ ├── assets/ # Images and local files
│ │ ├── components/ # Reusable UI Components
│ │ │ ├── common/ # Button, Input, Modal, Skeleton, EmptyState, etc.
│ │ │ └── reports/ # Charts & tables: PayrollTrend, SalaryDistribution, etc.
│ │ ├── features/ # Feature-based slices (Auth, UI, User) + Redux hooks & services
│ │ ├── hooks/ # Global reusable React hooks (e.g., useLocalStorage)
│ │ ├── pages/ # Main route views (Landing, Dashboard, Reports, Settings, etc.)
│ │ ├── services/ # API services (axios config + request helpers)
│ │ ├── store/ # Redux store configuration
│ │ ├── utils/ # Helper functions and constants
│ │ ├── App.jsx # Route definitions & global providers
│ │ ├── main.jsx # React root & app bootstrap
│ │ └── index.css # Global styles + Tailwind directives

📸 Screenshots

Dashboard Overview

PaySphere Dashboard


🚀 Installation & Setup

1. Backend Configuration

Copy the .env.example file to create a .env file in backend/:

cp .env.example .env

Update the variables with your own values:

# ServerPORT=5000FRONTEND_URL=http://localhost:5173NODE_ENV=development# DatabaseMONGO_URI=your_mongodb_uri# AuthenticationJWT_SECRET=your_secret_keyGOOGLE_CLIENT_ID=your_google_idGOOGLE_CLIENT_SECRET=your_google_secret# Caching & Background JobsREDIS_URI=your_redis_connection_uri# Email (SMTP)# Backend sends payslips & notifications directly via SMTP. If SMTP is# not configured, it falls back to the Vercel proxy at FRONTEND_URL/api/send-email,# then to console logging.EMAIL_HOST=your_smtp_host# e.g. smtp.gmail.comEMAIL_PORT=587# or 465 for SSLEMAIL_SECURE=false# true for port 465EMAIL_USER=your_smtp_username# e.g. your_email@gmail.comEMAIL_PASS=your_smtp_password# or app passwordEMAIL_FROM="PaySphere <no-reply@paysphere.com>"EMAIL_PROXY_SECRET=your_email_proxy_secret_key# Aliases (used by SMTP transport — populate both pairs for compatibility)SMTP_HOST=your_smtp_hostSMTP_PORT=587SMTP_SECURE=falseSMTP_USER=your_smtp_userSMTP_PASS=your_smtp_pass# LoggingLOG_LEVEL=info

2. Frontend Configuration

Copy the .env.example file to create a .env file in frontend/:

cp .env.example .env

Update the variables with your own values:

VITE_API_URL=http://localhost:5000VITE_GOOGLE_CLIENT_ID=your_google_id# Email Proxy SMTP (used by Vercel Serverless Function at /api/send-email)EMAIL_PROXY_SECRET=your_email_proxy_secret_keySMTP_HOST=smtp.gmail.comSMTP_PORT=587SMTP_USER=your_email@gmail.comSMTP_PASS=your_app_passwordSMTP_SECURE=falseEMAIL_FROM="PaySphere" <no-reply@paysphere.com>

3. Run Development

# Backendcd backend && npm run dev
# Frontendcd frontend && npm run dev

4. Run with Docker (Recommended)

The entire stack (MongoDB + backend + frontend) can be started with a single command using Docker Compose. Hot-reloading is enabled for both the backend (nodemon) and the frontend (Vite HMR).

Prerequisites: Docker with Docker Compose v2.

# From the repo root
docker compose up --build

This starts:

  • MongoDB at localhost:27017
  • Backend API at http://localhost:5000
  • Frontend at http://localhost:5173

All services work out of the box with sensible defaults. To override secrets and Google/SMTP settings, copy the root .env.example to .env and edit it:

cp .env.example .env

Then restart the stack for changes to take effect:

docker compose up -d
docker compose restart backend

Useful commands:

# Build/start all services in the background
docker compose up --build -d
# Stream logs from all services (or one: docker compose logs backend)
docker compose logs -f
# Stop the stack (keeps the MongoDB volume)
docker compose down
# Stop and delete the MongoDB data volume
docker compose down -v

Note: Redis is optional. Without a REDIS_URL, caching falls back to an in-memory store and background payslip email jobs remain available in a degraded mode.

5. Testing

# Run backend test suite (Jest + Supertest)cd backend && npm test

PaySphere — Payroll in seconds, not hours. ⚡

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages