A modern Applicant Tracking System (ATS) platform connecting candidates with companies
| Document | Description |
|---|---|
| 📘 Technical Report | Complete technical documentation including architecture, data models, and API reference |
| 🚀 Coolify Deployment Guide | Step-by-step guide for deploying JobConnect on Coolify |
| Feature | Description |
|---|---|
| CV Builder | Dynamic profile builder with real-time preview. Add experience, education, certifications, and skills with instant autosave. |
| Job Search | Browse and filter jobs by title, location, job type, and required skills. |
| One-Click Apply | Apply to jobs with your saved profile. Your matching score is calculated automatically. |
| Application Tracker | Visual pipeline showing your application status: Submitted → Screening → Interview → Offer → Hired |
| Skill Management | Add skills with proficiency levels (1-5) and years of experience for better job matching. |
| Feature | Description |
|---|---|
| Dashboard | Overview of all job postings with status indicators and applicant counts. |
| Job Management | Create, edit, publish, and archive job postings with rich descriptions. |
| Kanban Board | Drag-and-drop candidates between hiring stages. Update multiple candidates at once. |
| Candidate Profiles | View detailed candidate profiles with experience, education, and skill match scores. |
| AI-Powered Matching | Algorithm calculates compatibility score based on required/optional skills and proficiency. |
| Feature | Description |
|---|---|
| User Management | View, create, edit, and manage all user accounts (Candidates and Companies). |
| Job Management | Oversee all job postings across the platform with full CRUD capabilities. |
| Platform Oversight | Complete visibility into all platform activity and data. |
- JWT-based authentication with secure token refresh
- BCrypt password hashing
- Role-based access control (Candidate/Company/Admin)
- Protected API endpoints with authorization guards
- CORS configuration for secure cross-origin requests
The platform uses a sophisticated scoring algorithm to match candidates with job requirements:
┌─────────────────────────────────────────────────────────────────────┐
│ MATCHING SCORE BREAKDOWN │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Base Score (70%) = Matched Required Skills │
│ ─────────────────────── × 70 │
│ Total Required Skills │
│ │
│ Optional Bonus (20%) = Matched Optional Skills │
│ ──────────────────────── × 20 │
│ Total Optional Skills │
│ │
│ Proficiency Bonus = (Candidate Level - Required Level) × 2 │
│ (Max 10%) per matched skill │
│ │
├─────────────────────────────────────────────────────────────────────┤
│ TOTAL SCORE: Max 100% │
└─────────────────────────────────────────────────────────────────────┘
Example: A job requires 4 skills (3 required, 1 optional). A candidate has 3 of the required skills with higher proficiency than minimum:
- Base Score: 3/3 × 70 = 70 points
- Optional Bonus: 0/1 × 20 = 0 points
- Proficiency Bonus: +6 points (exceeds requirements)
- Total: 76%
- Docker and Docker Compose
- Node.js 20+ (for local development)
- .NET 9 SDK (for local development)
# Clone the repository
git clone https://github.com/yourusername/JobConnect.git
cd JobConnect
# Copy environment variables
cp .env.example .env
# Start all services
docker-compose up --buildServices will be available at:
| Service | URL | Description |
|---|---|---|
| 🌐 Frontend | http://localhost:4201 | Angular application |
| 🔌 API | http://localhost:5001 | .NET REST API |
| 🐘 Database | localhost:5433 | PostgreSQL |
| 📊 pgAdmin | http://localhost:5052 | Database management |
Backend (.NET API):
cd JobConnect.API
# Restore dependencies
dotnet restore
# Run in development mode
dotnet runFrontend (Angular):
cd jobconnect-frontend
# Install dependencies
npm install
# Start development server
npm startJobConnect/
├── 📁 JobConnect.API/ # .NET 9 Web API
│ ├── Controllers/
│ │ ├── AuthController.cs # Registration, login, password management
│ │ ├── JobsController.cs # Job CRUD operations
│ │ ├── CandidatesController.cs # Candidate profile management
│ │ ├── CompaniesController.cs # Company dashboard, kanban
│ │ ├── ApplicationsController.cs # Job applications
│ │ └── SkillsController.cs # Skills catalog
│ ├── Models/
│ │ ├── User.cs # User entity with roles
│ │ ├── CandidateProfile.cs # CV data (JSON columns)
│ │ ├── Company.cs # Company profile
│ │ ├── JobPosting.cs # Job with status lifecycle
│ │ ├── Application.cs # Application with kanban order
│ │ └── Skill.cs # Skills with proficiency
│ ├── Services/
│ │ ├── AuthService.cs # JWT token generation
│ │ └── MatchingScoreService.cs # Score calculation algorithm
│ ├── Data/
│ │ └── ApplicationDbContext.cs # EF Core context
│ └── DTOs/ # Data transfer objects
│
├── 📁 jobconnect-frontend/ # Angular 21 SPA
│ └── src/app/
│ ├── core/
│ │ ├── guards/ # Route protection
│ │ ├── interceptors/ # HTTP interceptors
│ │ ├── models/ # TypeScript interfaces
│ │ └── services/ # API service layer
│ ├── features/
│ │ ├── auth/ # Login, register
│ │ ├── landing/ # Home page
│ │ ├── jobs/ # Job list, details
│ │ ├── candidate/
│ │ │ ├── cv-builder/ # Profile editor
│ │ │ └── application-tracker/
│ │ └── company/
│ │ ├── dashboard/ # Company overview
│ │ ├── job-create/ # Job posting form
│ │ ├── job-edit/ # Edit existing jobs
│ │ ├── candidates/ # Kanban board
│ │ └── candidate-profile-modal/
│ └── shared/ # Reusable components
│
├── 📄 docker-compose.yml # Container orchestration
├── 📄 .env.example # Environment template
└── 📄 README.md
| Layer | Technology | Purpose |
|---|---|---|
| Frontend | Angular 21, Angular CDK | Modern SPA with drag-drop |
| Styling | SCSS, Glassmorphism | Premium liquid glass design |
| Backend | .NET 9, ASP.NET Core | RESTful API |
| ORM | Entity Framework Core | Database operations |
| Database | PostgreSQL 16 | Data persistence with JSONB |
| Auth | JWT + BCrypt | Secure authentication |
| Container | Docker Compose | Development environment |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
POST |
/api/auth/register |
Create new account | No |
POST |
/api/auth/login |
Authenticate user | No |
PUT |
/api/auth/change-email |
Update email | Yes |
PUT |
/api/auth/change-password |
Update password | Yes |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
GET |
/api/jobs |
List published jobs (with filters) | No |
GET |
/api/jobs/:id |
Get job details | No |
POST |
/api/jobs |
Create job posting | Company |
PUT |
/api/jobs/:id |
Update job | Company |
DELETE |
/api/jobs/:id |
Delete job | Company |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
GET |
/api/candidates/profile |
Get own profile | Candidate |
PUT |
/api/candidates/profile |
Update CV/profile | Candidate |
PUT |
/api/candidates/profile/skills |
Update skills | Candidate |
GET |
/api/candidates/applications |
List applications | Candidate |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
GET |
/api/companies/profile |
Get company profile | Company |
PUT |
/api/companies/profile |
Update company | Company |
GET |
/api/companies/jobs |
List company's jobs | Company |
GET |
/api/companies/jobs/:id/applications |
Get applicants | Company |
PUT |
/api/companies/jobs/:id/applications/:appId/status |
Update status | Company |
POST |
/api/companies/jobs/:id/kanban/reorder |
Reorder kanban | Company |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
POST |
/api/applications |
Apply to job | Candidate |
GET |
/api/applications/:id |
Get application details | Auth |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
GET |
/api/skills |
List all skills | No |
Create a .env file based on .env.example:
# Database Configuration
POSTGRES_DB=jobconnect
POSTGRES_USER=jobconnect
POSTGRES_PASSWORD=your_secure_password
# JWT Configuration
JWT_SECRET=YourSuperSecretKeyThatIsAtLeast32CharactersLong!
# CORS Configuration
CORS_ORIGINS=http://localhost:4200,http://localhost:4201
# pgAdmin (optional)
PGADMIN_EMAIL=admin@admin.com
PGADMIN_PASSWORD=admin123| Status | Description |
|---|---|
Draft |
Job created but not visible to candidates |
Published |
Active and searchable |
Closed |
No longer accepting applications |
Archived |
Historical record |
| Level | Description |
|---|---|
| 1 | Beginner - Basic understanding |
| 2 | Elementary - Limited experience |
| 3 | Intermediate - Practical application |
| 4 | Advanced - Deep knowledge |
| 5 | Expert - Industry leader |
cd JobConnect.API
# Add a new migration
dotnet ef migrations add MigrationName
# Apply migrations
dotnet ef database updateThe project includes a comprehensive data seeder that creates sample companies, job postings, candidates, and applications for testing and demonstration purposes.
Seed only if database is empty:
cd JobConnect.API
SEED_DATABASE=true dotnet runForce seed (add data even if database has existing data):
cd JobConnect.API
SEED_DATABASE=true FORCE_SEED=true dotnet runThe seeder creates:
- 10 companies with full profiles
- 50+ job postings across various roles and types
- 32 candidates with experience, education, and skills
- 100+ applications across all statuses
Note: Remove or set
SEED_DATABASE=falseafter seeding to prevent the seeder from running on every startup.
Frontend:
cd jobconnect-frontend
npm testBackend:
cd JobConnect.API
dotnet test- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Made with ❤️








