An open API service indexing awesome lists of open source software.

https://github.com/siiiidddexe/candsync

A modern self-hosted Applicant Tracking System (ATS) with AI-powered resume extraction. Built with Node.js, SQLite, React, and Vite.
https://github.com/siiiidddexe/candsync

ai ats candidate-tracking nodejs react recruitment resume-parser sqlite

Last synced: about 5 hours ago
JSON representation

A modern self-hosted Applicant Tracking System (ATS) with AI-powered resume extraction. Built with Node.js, SQLite, React, and Vite.

Awesome Lists containing this project

README

          

# ๐ŸŽฏ CandSync

**A modern, self-hosted Applicant Tracking System (ATS) with AI-powered resume extraction.**

[![Node.js](https://img.shields.io/badge/Node.js-22+-339933?logo=node.js&logoColor=white)](https://nodejs.org)
[![React](https://img.shields.io/badge/React-18-61DAFB?logo=react&logoColor=black)](https://reactjs.org)
[![SQLite](https://img.shields.io/badge/SQLite-built--in-003B57?logo=sqlite&logoColor=white)](https://sqlite.org)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)

---

## โœจ Features

| Category | Details |
|---|---|
| **Jobs** | Create & manage job postings with client, location, skills, and status |
| **Candidates** | Rich candidate profiles with 17 fields per candidate |
| **AI Extraction** | Auto-fill candidate forms from PDF / image resumes (Gemini + OpenRouter) |
| **Excel Export** | Export candidate lists with or without resume links |
| **Pipeline Statuses** | Fully customizable candidate pipeline stages with color coding |
| **User Management** | Granular per-user permissions (create/read/update/delete per resource) |
| **Job Access Control** | Restrict users to specific jobs only |
| **Resume Access** | Fine-grained control over who can view uploaded resumes |
| **Auth** | JWT-based authentication with 7-day sessions |
| **Responsive UI** | Works on desktop and mobile |

---

## ๐Ÿ—๏ธ Tech Stack

```
candsync/
โ”œโ”€โ”€ backend/ # Node.js ยท Express ยท SQLite (node:sqlite built-in)
โ””โ”€โ”€ frontend/ # React 18 ยท Vite ยท TailwindCSS ยท Heroicons
```

**Backend dependencies:** `express`, `bcryptjs`, `jsonwebtoken`, `multer`, `xlsx`, `uuid`, `node-fetch`, `dotenv`
**Frontend dependencies:** `react`, `react-router-dom`, `axios`, `react-hot-toast`, `@heroicons/react`

> **Node.js 22+ required** โ€” uses the built-in `node:sqlite` module (no separate sqlite3 install needed).

---

## ๐Ÿš€ Quick Start

### Prerequisites

- [Node.js 22+](https://nodejs.org) (check with `node --version`)
- Git

### 1. Clone & Install

```bash
git clone https://github.com/siiiidddexe/candsync.git
cd candsync

# Install all dependencies (backend + frontend)
npm run install:all
```

### 2. Configure Environment

```bash
cd backend
copy .env.example .env # Windows
# cp .env.example .env # macOS/Linux
```

Edit `backend/.env` and set at minimum:

```env
JWT_SECRET=your-long-random-secret-here
```

To enable **AI resume extraction**, add at least one API key:

```env
GEMINI_API_KEY=AIza... # Get from https://aistudio.google.com
OPENROUTER_API_KEY=sk-or-... # Get from https://openrouter.ai
```

> API keys can also be set from the **Settings** page in the UI after first login.

### 3. Start

**Option A โ€” One-click (Windows):**
```
Double-click start.bat
```

**Option B โ€” Manual (two terminals):**
```bash
# Terminal 1 โ€“ Backend
cd backend
npm run dev # dev mode (nodemon)
# npm start # production mode

# Terminal 2 โ€“ Frontend
cd frontend
npm run dev
```

### 4. Open

| Service | URL |
|---|---|
| Frontend | http://localhost:5173 |
| Backend API | http://localhost:5000 |

**Default credentials:**
```
Email: admin@candsync.com
Password: Admin@123
```

> โš ๏ธ Change the default password immediately after first login.

---

## ๐Ÿ“‹ Usage Guide

### Jobs

1. Navigate to **Jobs** (home page)
2. Click **New Job** โ†’ fill title, client, location, skills, description
3. Click **N Candidates** on any job card to manage that job's pipeline

### Adding Candidates

1. Open a job โ†’ click **Add**
2. *(Optional)* Upload a PDF/image resume and click **Auto-Fill with AI** โ€” fields populate automatically
3. Fill any remaining fields and set the pipeline **Status**
4. Click **Save**

### Exporting

- **Export** โ€” downloads an Excel file with all candidate fields
- **+ Resume** โ€” same but includes a resume URL column (requires `withResume` permission)

### User Management *(Superadmin only)*

Go to **Users** โ†’ **New User** and configure:

- **Role**: `viewer` | `editor` | `admin` (purely cosmetic โ€” actual access is permission-based)
- **Permissions**: fine-grained CRUD per resource (Jobs, Candidates, Statuses, Exports)
- **Job Access**: all jobs, or a specific list of jobs
- **Resume Access**: toggle per user

### AI Configuration *(Settings page)*

- Set **Gemini** or **OpenRouter** as primary provider
- Both providers are used as automatic fallback for each other
- Supported resume formats: PDF, JPEG, PNG, GIF, WEBP (up to 10 MB)

---

## ๐Ÿ”’ Security Notes

- JWT tokens expire after **7 days**
- Passwords are hashed with **bcrypt** (10 rounds)
- Resume files are served only to users with `resumeAccess` permission
- Set a strong `JWT_SECRET` in production (32+ random characters)
- Set `FRONTEND_URL` to your actual domain in production to restrict CORS

---

## ๐Ÿ“ Project Structure

```
candsync/
โ”œโ”€โ”€ backend/
โ”‚ โ”œโ”€โ”€ middleware/
โ”‚ โ”‚ โ””โ”€โ”€ auth.js # JWT verification, permission helpers
โ”‚ โ”œโ”€โ”€ routes/
โ”‚ โ”‚ โ”œโ”€โ”€ auth.js # Login, /me, change-password
โ”‚ โ”‚ โ”œโ”€โ”€ candidates.js # CRUD, AI extract, resume serve, export
โ”‚ โ”‚ โ”œโ”€โ”€ jobs.js # CRUD + candidate count
โ”‚ โ”‚ โ”œโ”€โ”€ settings.js # AI keys & config
โ”‚ โ”‚ โ”œโ”€โ”€ statuses.js # Pipeline stages
โ”‚ โ”‚ โ””โ”€โ”€ users.js # User management
โ”‚ โ”œโ”€โ”€ uploads/ # Resume files (git-ignored)
โ”‚ โ”œโ”€โ”€ db.js # SQLite schema, seed data
โ”‚ โ”œโ”€โ”€ server.js # Express app entry point
โ”‚ โ”œโ”€โ”€ .env.example # Environment variable template
โ”‚ โ””โ”€โ”€ package.json
โ”œโ”€โ”€ frontend/
โ”‚ โ”œโ”€โ”€ src/
โ”‚ โ”‚ โ”œโ”€โ”€ api/client.js # Axios instance with auth interceptor
โ”‚ โ”‚ โ”œโ”€โ”€ context/
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ AuthContext.jsx
โ”‚ โ”‚ โ”œโ”€โ”€ components/
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ Layout.jsx # Sidebar navigation shell
โ”‚ โ”‚ โ”œโ”€โ”€ pages/
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Login.jsx
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Jobs.jsx
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Candidates.jsx
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Statuses.jsx
โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Users.jsx
โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ Settings.jsx
โ”‚ โ”‚ โ”œโ”€โ”€ App.jsx
โ”‚ โ”‚ โ””โ”€โ”€ index.css # Tailwind + custom components
โ”‚ โ””โ”€โ”€ package.json
โ”œโ”€โ”€ start.bat # Windows one-click launcher
โ”œโ”€โ”€ install.bat # Windows one-click installer
โ””โ”€โ”€ package.json # Root convenience scripts
```

---

## ๐Ÿค Contributing

Pull requests are welcome! For major changes, please open an issue first to discuss what you would like to change.

---

## ๐Ÿ“„ License

[MIT](LICENSE) ยฉ 2024 CandSync