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. |
| Feature | Description |
|---|---|
| Interview Scheduling | Candidates view company availability calendar and book 90-minute interview slots. |
| HD Video Room | Powered by 100ms with real-time chat during the interview. |
| Reschedule/Cancel | Full support for rescheduling to new slots and cancellation with reasons. |
| Status Tracking | Interview states: Scheduled β InProgress β Completed/Cancelled |
| Type | Trigger | Recipient |
|---|---|---|
interview_scheduled |
Candidate schedules interview | Company |
interview_cancelled |
Interview cancelled | Other party |
application_received |
Candidate applies | Company |
application_status |
Status changes in Kanban | Candidate |
- 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
β β βββ InterviewsController.cs # Video interview scheduling
β β βββ NotificationsController.cs # Real-time notifications
β β βββ 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
β β βββ Interview.cs # Scheduled video interviews
β β βββ Notification.cs # Persistent notifications
β β βββ Skill.cs # Skills with proficiency
β βββ Services/
β β βββ AuthService.cs # JWT token generation
β β βββ MatchingScoreService.cs # Score calculation algorithm
β β βββ InterviewSchedulingService.cs # 100ms integration
β βββ 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/
β β βββ interview/ # Video room, scheduling
β βββ 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 |
| Video | 100ms | HD video conferencing |
| 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 |
|---|---|---|---|
POST |
/api/interviews |
Schedule interview | Candidate |
GET |
/api/interviews |
List interviews | Auth |
GET |
/api/interviews/:id |
Get interview details | Auth |
GET |
/api/interviews/:id/join |
Get 100ms meeting room code | Auth |
PUT |
/api/interviews/:id/cancel |
Cancel with reason | Auth |
PUT |
/api/interviews/:id/reschedule |
Reschedule interview | Auth |
POST |
/api/interviews/:id/messages |
Send chat message | Auth |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
GET |
/api/notifications |
List notifications | Yes |
GET |
/api/notifications/count |
Unread count | Yes |
PUT |
/api/notifications/:id/read |
Mark as read | Yes |
PUT |
/api/notifications/read-all |
Mark all as read | Yes |
DELETE |
/api/notifications/:id |
Delete notification | Yes |
DELETE |
/api/notifications |
Delete all | Yes |
| 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
# 100ms Video Conferencing
HMS_ACCESS_KEY=your_100ms_access_key
HMS_SECRET=your_100ms_secret
HMS_TEMPLATE_ID=your_100ms_template_id
# 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 |
| Status | Color | Description |
|---|---|---|
| Submitted | π΅ Blue | New applications |
| Screening | π‘ Yellow | Under review |
| Interview | π£ Purple | Interview scheduled |
| Offer | π’ Green | Offer sent |
| Hired | β Dark Green | Candidate hired |
| Rejected | π΄ Red | Application rejected |
| 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 β€οΈ










