{"id":51366629,"url":"https://github.com/siiiidddexe/candsync","last_synced_at":"2026-07-03T02:31:10.266Z","repository":{"id":367954668,"uuid":"1282491775","full_name":"siiiidddexe/candsync","owner":"siiiidddexe","description":"A modern self-hosted Applicant Tracking System (ATS) with AI-powered resume extraction. Built with Node.js, SQLite, React, and Vite.","archived":false,"fork":false,"pushed_at":"2026-06-28T11:54:16.000Z","size":119,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-28T13:17:19.261Z","etag":null,"topics":["ai","ats","candidate-tracking","nodejs","react","recruitment","resume-parser","sqlite"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/siiiidddexe.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-27T21:00:39.000Z","updated_at":"2026-06-28T11:54:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/siiiidddexe/candsync","commit_stats":null,"previous_names":["siiiidddexe/candsync"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/siiiidddexe/candsync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siiiidddexe%2Fcandsync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siiiidddexe%2Fcandsync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siiiidddexe%2Fcandsync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siiiidddexe%2Fcandsync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/siiiidddexe","download_url":"https://codeload.github.com/siiiidddexe/candsync/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/siiiidddexe%2Fcandsync/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35070339,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-03T02:00:05.635Z","response_time":110,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","ats","candidate-tracking","nodejs","react","recruitment","resume-parser","sqlite"],"created_at":"2026-07-03T02:31:09.763Z","updated_at":"2026-07-03T02:31:10.261Z","avatar_url":"https://github.com/siiiidddexe.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# 🎯 CandSync\n\n**A modern, self-hosted Applicant Tracking System (ATS) with AI-powered resume extraction.**\n\n[![Node.js](https://img.shields.io/badge/Node.js-22+-339933?logo=node.js\u0026logoColor=white)](https://nodejs.org)\n[![React](https://img.shields.io/badge/React-18-61DAFB?logo=react\u0026logoColor=black)](https://reactjs.org)\n[![SQLite](https://img.shields.io/badge/SQLite-built--in-003B57?logo=sqlite\u0026logoColor=white)](https://sqlite.org)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\n\u003c/div\u003e\n\n---\n\n## ✨ Features\n\n| Category | Details |\n|---|---|\n| **Jobs** | Create \u0026 manage job postings with client, location, skills, and status |\n| **Candidates** | Rich candidate profiles with 17 fields per candidate |\n| **AI Extraction** | Auto-fill candidate forms from PDF / image resumes (Gemini + OpenRouter) |\n| **Excel Export** | Export candidate lists with or without resume links |\n| **Pipeline Statuses** | Fully customizable candidate pipeline stages with color coding |\n| **User Management** | Granular per-user permissions (create/read/update/delete per resource) |\n| **Job Access Control** | Restrict users to specific jobs only |\n| **Resume Access** | Fine-grained control over who can view uploaded resumes |\n| **Auth** | JWT-based authentication with 7-day sessions |\n| **Responsive UI** | Works on desktop and mobile |\n\n---\n\n## 🏗️ Tech Stack\n\n```\ncandsync/\n├── backend/          # Node.js · Express · SQLite (node:sqlite built-in)\n└── frontend/         # React 18 · Vite · TailwindCSS · Heroicons\n```\n\n**Backend dependencies:** `express`, `bcryptjs`, `jsonwebtoken`, `multer`, `xlsx`, `uuid`, `node-fetch`, `dotenv`  \n**Frontend dependencies:** `react`, `react-router-dom`, `axios`, `react-hot-toast`, `@heroicons/react`\n\n\u003e **Node.js 22+ required** — uses the built-in `node:sqlite` module (no separate sqlite3 install needed).\n\n---\n\n## 🚀 Quick Start\n\n### Prerequisites\n\n- [Node.js 22+](https://nodejs.org) (check with `node --version`)\n- Git\n\n### 1. Clone \u0026 Install\n\n```bash\ngit clone https://github.com/siiiidddexe/candsync.git\ncd candsync\n\n# Install all dependencies (backend + frontend)\nnpm run install:all\n```\n\n### 2. Configure Environment\n\n```bash\ncd backend\ncopy .env.example .env   # Windows\n# cp .env.example .env   # macOS/Linux\n```\n\nEdit `backend/.env` and set at minimum:\n\n```env\nJWT_SECRET=your-long-random-secret-here\n```\n\nTo enable **AI resume extraction**, add at least one API key:\n\n```env\nGEMINI_API_KEY=AIza...          # Get from https://aistudio.google.com\nOPENROUTER_API_KEY=sk-or-...    # Get from https://openrouter.ai\n```\n\n\u003e API keys can also be set from the **Settings** page in the UI after first login.\n\n### 3. Start\n\n**Option A — One-click (Windows):**\n```\nDouble-click start.bat\n```\n\n**Option B — Manual (two terminals):**\n```bash\n# Terminal 1 – Backend\ncd backend\nnpm run dev       # dev mode (nodemon)\n# npm start       # production mode\n\n# Terminal 2 – Frontend\ncd frontend\nnpm run dev\n```\n\n### 4. Open\n\n| Service | URL |\n|---|---|\n| Frontend | http://localhost:5173 |\n| Backend API | http://localhost:5000 |\n\n**Default credentials:**\n```\nEmail:    admin@candsync.com\nPassword: Admin@123\n```\n\n\u003e ⚠️ Change the default password immediately after first login.\n\n---\n\n## 📋 Usage Guide\n\n### Jobs\n\n1. Navigate to **Jobs** (home page)\n2. Click **New Job** → fill title, client, location, skills, description\n3. Click **N Candidates** on any job card to manage that job's pipeline\n\n### Adding Candidates\n\n1. Open a job → click **Add**\n2. *(Optional)* Upload a PDF/image resume and click **Auto-Fill with AI** — fields populate automatically\n3. Fill any remaining fields and set the pipeline **Status**\n4. Click **Save**\n\n### Exporting\n\n- **Export** — downloads an Excel file with all candidate fields\n- **+ Resume** — same but includes a resume URL column (requires `withResume` permission)\n\n### User Management *(Superadmin only)*\n\nGo to **Users** → **New User** and configure:\n\n- **Role**: `viewer` | `editor` | `admin` (purely cosmetic — actual access is permission-based)\n- **Permissions**: fine-grained CRUD per resource (Jobs, Candidates, Statuses, Exports)\n- **Job Access**: all jobs, or a specific list of jobs\n- **Resume Access**: toggle per user\n\n### AI Configuration *(Settings page)*\n\n- Set **Gemini** or **OpenRouter** as primary provider\n- Both providers are used as automatic fallback for each other\n- Supported resume formats: PDF, JPEG, PNG, GIF, WEBP (up to 10 MB)\n\n---\n\n## 🔒 Security Notes\n\n- JWT tokens expire after **7 days**\n- Passwords are hashed with **bcrypt** (10 rounds)\n- Resume files are served only to users with `resumeAccess` permission\n- Set a strong `JWT_SECRET` in production (32+ random characters)\n- Set `FRONTEND_URL` to your actual domain in production to restrict CORS\n\n---\n\n## 📁 Project Structure\n\n```\ncandsync/\n├── backend/\n│   ├── middleware/\n│   │   └── auth.js          # JWT verification, permission helpers\n│   ├── routes/\n│   │   ├── auth.js          # Login, /me, change-password\n│   │   ├── candidates.js    # CRUD, AI extract, resume serve, export\n│   │   ├── jobs.js          # CRUD + candidate count\n│   │   ├── settings.js      # AI keys \u0026 config\n│   │   ├── statuses.js      # Pipeline stages\n│   │   └── users.js         # User management\n│   ├── uploads/             # Resume files (git-ignored)\n│   ├── db.js                # SQLite schema, seed data\n│   ├── server.js            # Express app entry point\n│   ├── .env.example         # Environment variable template\n│   └── package.json\n├── frontend/\n│   ├── src/\n│   │   ├── api/client.js    # Axios instance with auth interceptor\n│   │   ├── context/\n│   │   │   └── AuthContext.jsx\n│   │   ├── components/\n│   │   │   └── Layout.jsx   # Sidebar navigation shell\n│   │   ├── pages/\n│   │   │   ├── Login.jsx\n│   │   │   ├── Jobs.jsx\n│   │   │   ├── Candidates.jsx\n│   │   │   ├── Statuses.jsx\n│   │   │   ├── Users.jsx\n│   │   │   └── Settings.jsx\n│   │   ├── App.jsx\n│   │   └── index.css        # Tailwind + custom components\n│   └── package.json\n├── start.bat                # Windows one-click launcher\n├── install.bat              # Windows one-click installer\n└── package.json             # Root convenience scripts\n```\n\n---\n\n## 🤝 Contributing\n\nPull requests are welcome! For major changes, please open an issue first to discuss what you would like to change.\n\n---\n\n## 📄 License\n\n[MIT](LICENSE) © 2024 CandSync\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsiiiidddexe%2Fcandsync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsiiiidddexe%2Fcandsync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsiiiidddexe%2Fcandsync/lists"}