A modern, full-stack job portal connecting job seekers with recruiters
Features β’ Quick Start β’ Architecture β’ API Docs β’ Contributing
- Overview
- Features
- Tech Stack
- Architecture
- Getting Started
- Project Structure
- User Roles & Permissions
- Core Functionality
- API Documentation
- Database Schema
- Deployment
- Testing
- Contributing
- License
Skills Careers is a comprehensive job portal platform built with Next.js 15, designed to streamline the hiring process by connecting talented job seekers with top recruiters. The platform offers a seamless experience with role-based access control, real-time job search, application tracking, and an intuitive admin portal.
- π Multi-role Authentication: Job Seekers, Recruiters, and Admins with distinct permissions
- π Advanced Job Search: Real-time search with filters (location, category, experience, job type)
- π Analytics Dashboard: Comprehensive insights for admins and recruiters
- π CV Management: Automated CV generation with PDF export
- π OAuth Integration: Google & LinkedIn authentication
- π± Responsive Design: Mobile-first, optimized for all devices
- π Performance: Server-side rendering, optimized images, and cached connections
- β Create and manage professional profiles
- β Upload and manage CVs with automatic PDF generation
- β Search and filter jobs by location, category, experience
- β Apply to jobs with one-click application
- β Track application status (Pending, Approved, Declined)
- β Receive application notifications
- β View recruiter company profiles
- β Bookmark favorite jobs
- β Create company profiles with branding
- β Post and manage job listings
- β Publish/unpublish jobs
- β View and manage applications
- β Filter candidates by status
- β Mark candidates as favorites
- β Track hiring metrics and analytics
- β Manage company information
- β Access candidate profiles and CVs
- β Complete platform oversight dashboard
- β Manage users, recruiters, and job seekers
- β Moderate job postings
- β View platform analytics (jobs, applications, users)
- β Manage press releases and announcements
- β Handle inquiries and support tickets
- β Restrict/unrestrict accounts
- β Create new admin accounts
- π Smart Search: Real-time job search with MongoDB regex queries
- π§ Email Notifications: Automated emails via Nodemailer
- πΊοΈ Interactive Maps: Location-based job viewing with Leaflet
- π Data Visualization: Charts and analytics with Chart.js
- π¨ Modern UI: Beautiful interface with Tailwind CSS
- π Security: Bcrypt password hashing, secure sessions
- π Internationalization: Multi-language support ready
- βΏ Accessibility: WCAG compliant components
- Framework: Next.js 15.5.7 (App Router)
- UI Library: React 18.3.1
- Styling: Tailwind CSS 3.4.1
- Icons: React Icons, FontAwesome
- Forms: React Hook Form (via custom components)
- Maps: React Leaflet 4.2.1
- Charts: React Chart.js 2 5.3.0
- Animations: Swiper 11.2.0
- UI Components: Material-UI 6.1.7
- Notifications: SweetAlert2 11.15.10
- Runtime: Node.js
- Framework: Next.js API Routes
- Database: MongoDB 6.12.0
- ODM: Native MongoDB Driver
- Authentication: NextAuth.js 4.24.10
- Password Hashing: Bcrypt.js 2.4.3
- Email: Nodemailer 7.0.11
- File Storage: Cloudinary 2.5.1
- PDF Generation: jsPDF 3.0.0
- Deployment: Netlify (with Next.js plugin)
- Version Control: Git
- Linting: ESLint 8
- Package Manager: npm
- Environment: dotenv 16.4.7
- Search Engine: Elasticsearch (setup scripts included)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Client Layer β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
β βJob Seekerβ β Recruiterβ β Admin β β Public β β
β ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ β
βββββββββΌββββββββββββββΌββββββββββββββΌββββββββββββββΌβββββββββββ
β β β β
βββββββββββββββ΄ββββββββββββββ΄ββββββββββββββ
β
βββββββββββββββΌβββββββββββββββ
β Next.js Frontend (SSR) β
β - App Router β
β - React Components β
β - Tailwind CSS β
βββββββββββββββ¬βββββββββββββββ
β
βββββββββββββββΌβββββββββββββββ
β API Routes (Backend) β
β - /api/auth/* β
β - /api/job/* β
β - /api/users/* β
β - /api/applications/* β
βββββββββββββββ¬βββββββββββββββ
β
βββββββββββββββΌβββββββββββββββ
β Authentication Layer β
β - NextAuth.js β
β - JWT Sessions β
β - OAuth Providers β
βββββββββββββββ¬βββββββββββββββ
β
βββββββββββββββΌβββββββββββββββ
β Business Logic Layer β
β - /lib/* utilities β
β - Data validation β
β - PDF Generation β
βββββββββββββββ¬βββββββββββββββ
β
βββββββββββββββΌβββββββββββββββ
β Data Access Layer β
β - MongoDB Connection β
β - Cached Connections β
β - Query Optimization β
βββββββββββββββ¬βββββββββββββββ
β
βββββββββββββββΌβββββββββββββββ
β External Services β
β - Cloudinary (Images) β
β - Nodemailer (Email) β
β - OAuth Providers β
ββββββββββββββββββββββββββββββ
βββββββββββββββ ββββββββββββββββ βββββββββββββββ
β Users β β Recruiters β β Job Seekers β
βββββββββββββββ€ ββββββββββββββββ€ βββββββββββββββ€
β _id (PK) βββββ β _id (PK) β ββββΊβ _id (PK) β
β firstName β β β userId (FK) βββββ β userId (FK) β
β lastName β βββββ€ recruiterNameβ β email β
β email β β category β β experience β
β password β β email β β education β
β role β β contactNum β β skills β
β profileImg β β logo β βββββββββββββββ
βββββββββββββββ ββββββββββββββββ β
β β
β β
βββββββΌβββββββββ ββββββββΌβββββββ
β Jobs β βApplications β
ββββββββββββββββ€ βββββββββββββββ€
β _id (PK) βββββββββ€ jobId (FK) β
β recruiterId β β jobseekerId β
β jobTitle β β status β
β location β β appliedAt β
β category β β isFavourite β
β experience β βββββββββββββββ
β jobTypes β
β isPublished β
ββββββββββββββββ
Before you begin, ensure you have the following installed:
- Node.js (v18.x or higher)
- npm or yarn
- MongoDB (v6.x or higher)
- Git
Optional:
- Elasticsearch (v8.x) - for advanced search features
- Clone the repository
git clone https://github.com/yourusername/skills-careers-web-final.git
cd skills-careers-web-final- Install dependencies
npm install- Set up environment variables
Create a .env.local file in the root directory:
cp .env.example .env.localEdit .env.local and add your credentials (see Environment Variables section)
- Set up MongoDB
Ensure MongoDB is running locally or have a MongoDB Atlas connection string ready.
# For local MongoDB
mongod --dbpath /path/to/data/directory
# Or use MongoDB Atlas connection string in .env.localCreate a .env.local file with the following variables:
# Database
MONGODB_URI=mongodb://localhost:27017/skillscareers
# Or for MongoDB Atlas:
# MONGODB_URI=mongodb+srv://username:[email protected]/skillscareers
# NextAuth Configuration
NEXTAUTH_SECRET=your_nextauth_secret_here
# Generate with: openssl rand -base64 32
NEXTAUTH_URL=http://localhost:3000
# Google OAuth (Optional)
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
# LinkedIn OAuth (Optional)
LINKEDIN_CLIENT_ID=your_linkedin_client_id
LINKEDIN_CLIENT_SECRET=your_linkedin_client_secret
# Cloudinary (for image uploads)
CLOUDINARY_CLOUD_NAME=your_cloud_name
CLOUDINARY_API_KEY=your_api_key
CLOUDINARY_API_SECRET=your_api_secret
# Email Configuration (Nodemailer)
EMAIL_USER=[email protected]
EMAIL_PASS=your_email_app_password
# Optional: Elasticsearch
ELASTICSEARCH_URL=http://localhost:9200
ELASTIC_CLOUD_ID=your_elastic_cloud_id
ELASTIC_API_KEY=your_elastic_api_key
# Optional: Base URL
NEXT_PUBLIC_BASE_URL=http://localhost:3000npm run devOpen http://localhost:3000 in your browser.
# Build the application
npm run build
# Start the production server
npm startnpm run lint- Create Admin Account
Once the app is running, you can create an admin account through the API:
POST /api/auth/adminsignup
Content-Type: application/json
{
"firstName": "Admin",
"lastName": "User",
"email": "[email protected]",
"contactNumber": "+1234567890",
"password": "SecurePassword123!",
"confirmPassword": "SecurePassword123!"
}- Configure OAuth (Optional)
- Set up Google OAuth credentials in Google Cloud Console
- Set up LinkedIn OAuth credentials in LinkedIn Developer Portal
- Add authorized redirect URIs:
http://localhost:3000/api/auth/callback/googleandhttp://localhost:3000/api/auth/callback/linkedin
- Set up Elasticsearch (Optional)
# Run the setup script
node scripts/setup-elasticsearch.js
# Sync data
node scripts/sync-elasticsearch.jsskills-careers-web-final/
βββ app/ # Next.js App Router pages
β βββ (signup)/ # Auth group routes
β β βββ jobseekersignup/ # Job seeker registration
β β βββ recruitersignup/ # Recruiter registration
β βββ Portal/ # Dashboard (protected routes)
β β βββ analytics/ # Analytics dashboard
β β βββ annoucements/ # Announcements management
β β βββ bookingRecord/ # Booking/ticket records
β β βββ candidates/ # Candidate management
β β βββ dashboard/ # Main dashboard
β β βββ inquiries/ # Support inquiries
β β βββ jobApplications/ # Application management
β β βββ jobsAdmin/ # Admin job management
β β βββ jobsRecruiter/ # Recruiter job management
β β βββ pressrelease/ # Press release management
β β βββ profile/ # User profiles
β β βββ recruiter/ # Recruiter management
β β βββ settings/ # User settings
β β βββ tickets/ # Ticket system
β βββ api/ # API routes
β β βββ analytics/ # Analytics endpoints
β β βββ announcement/ # Announcement CRUD
β β βββ applications/ # Application endpoints
β β βββ auth/ # Authentication
β β β βββ [...nextauth]/ # NextAuth handler
β β β βββ adminsignup/ # Admin registration
β β β βββ jobseekersignup/# Job seeker registration
β β β βββ recruitersignup/# Recruiter registration
β β β βββ forgotPassword/ # Password reset request
β β β βββ resetPassword/ # Password reset
β β βββ job/ # Job CRUD operations
β β βββ jobapplication/ # Job application CRUD
β β βββ jobseekerdetails/ # Job seeker profile
β β βββ recruiterdetails/ # Recruiter profile
β β βββ users/ # User management
β β βββ ... # Other endpoints
β βββ about/ # About page
β βββ applications/ # Public applications view
β βββ categoryPage/ # Job categories
β βββ contact/ # Contact page
β βββ dashboard/ # Recruiter dashboard (legacy)
β βββ jobs/ # Job listings
β β βββ [jobid]/ # Job detail page
β βββ jobseeker/ # Job seeker profiles
β β βββ [jobseekerid]/ # Job seeker detail
β βββ login/ # Login page
β βββ pressRelease/ # Press releases
β βββ profile/ # User profile
β β βββ edit/ # Profile editing
β βββ recruiters/ # Recruiter directory
β β βββ [recruiterid]/ # Recruiter profile
β βββ register/ # Registration page
β βββ startingpage/ # Landing page
β βββ tickets/ # Public tickets
β βββ layout.js # Root layout
β βββ page.js # Home page
β βββ Providers.js # Context providers
β
βββ components/ # Reusable React components
β βββ PortalComponents/ # Portal-specific components
β β βββ PortalHeader.js # Dashboard header
β β βββ PortalSidebar.js # Dashboard sidebar
β β βββ dashboardStats.js # Statistics cards
β β βββ dashboardCharts.js# Analytics charts
β β βββ ... # Other portal components
β βββ StartingPageComponents/# Landing page components
β βββ Button.js # Reusable button
β βββ CategoryComponent.js # Category display
β βββ Footer.js # Site footer
β βββ jobCard.js # Job listing card
β βββ jobForm.js # Job posting form
β βββ jobSearch.js # Job search component
β βββ navBar.js # Navigation bar
β βββ newsletter.js # Newsletter signup
β βββ PhoneInput.js # Phone number input
β βββ ... # Other components
β
βββ lib/ # Utility libraries
β βββ auth.js # Authentication helpers
β βββ authOptions.js # NextAuth configuration
β βββ categories.js # Job categories data
β βββ cloudinary.js # Cloudinary integration
β βββ countries.js # Countries data
β βββ db.js # MongoDB connection
β βββ elasticsearch-utils.js# Elasticsearch utilities
β βββ faq.js # FAQ data
β βββ GenerateCV.js # PDF CV generation
β βββ handlers.js # Event handlers
β βββ mailer.js # Email sending
β βββ mongodb.js # MongoDB helpers
β βββ news.js # News data
β βββ successStory.js # Success stories data
β
βββ public/ # Static assets
β βββ catagory/ # Category images
β βββ images/ # General images
β βββ landing/ # Landing page assets
β βββ portal-dashboard/ # Dashboard assets
β βββ sidebar/ # Sidebar icons
β
βββ scripts/ # Utility scripts
β βββ setup-elasticsearch.js # ES index setup
β βββ sync-elasticsearch.js # ES data sync
β
βββ data/ # Static data files
β βββ jobCategories.json # Job categories list
β βββ jobExperiences.json # Experience levels
β
βββ .env.example # Environment variables template
βββ .env.local # Local environment variables (gitignored)
βββ .eslintrc.json # ESLint configuration
βββ .gitignore # Git ignore rules
βββ jsconfig.json # JavaScript configuration
βββ next.config.mjs # Next.js configuration
βββ package.json # Dependencies
βββ postcss.config.mjs # PostCSS configuration
βββ tailwind.config.js # Tailwind CSS configuration
βββ README.md # This file
Admin (Full Access)
βββ Platform Management
βββ User Management
βββ Content Moderation
βββ Analytics Access
Recruiter
βββ Company Profile Management
βββ Job Posting & Management
βββ Application Management
βββ Candidate Viewing
βββ Recruiter Analytics
Job Seeker
βββ Profile Management
βββ Job Search & Application
βββ Application Tracking
βββ CV Management
| Feature | Admin | Recruiter | Job Seeker | Public |
|---|---|---|---|---|
| View Jobs | β | β | β | β |
| Apply to Jobs | β | β | β | β |
| Post Jobs | β | β | β | β |
| Manage Applications | β | β | β | β |
| View Candidate Profiles | β | β | β | β |
| Edit Own Profile | β | β | β | β |
| Platform Analytics | β | β | β | β |
| Recruiter Analytics | β | β | β | β |
| User Management | β | β | β | β |
| Content Moderation | β | β | β | β |
| Press Release Management | β | β | β | β |
| Support Ticket Management | β | β | β | β |
User Registration
βββ Job Seeker β Create User + Job Seeker Profile
βββ Recruiter β Create User + Recruiter Profile
βββ Admin β Create User + Admin Profile (admin only)
Login Methods
βββ Email/Password (Credentials)
βββ Google OAuth
βββ LinkedIn OAuth
Session Management
βββ JWT-based sessions
βββ Secure HTTP-only cookies
βββ Role-based access control
1. Job Seeker browses jobs
β
2. Applies to job with one click
β
3. Application created with status: "Pending"
β
4. Recruiter receives application notification
β
5. Recruiter reviews application
β
6. Recruiter updates status:
- Approve β Status: "Approved"
- Decline β Status: "Declined"
- Favorite β isFavourited: true
β
7. Job Seeker receives notification
β
8. Job Seeker can track all applications
1. Recruiter creates job posting
β
2. Job saved with isPublished: false
β
3. Recruiter reviews/edits job
β
4. Recruiter publishes job
β
5. Job appears in public listings
β
6. Admin can moderate/unpublish
β
7. Recruiter can unpublish/edit/delete
POST /api/auth/jobseekersignup
Content-Type: application/json
{
"firstName": "John",
"lastName": "Doe",
"email": "[email protected]",
"contactNumber": "+1234567890",
"password": "SecurePass123!",
"confirmPassword": "SecurePass123!"
}
Response: 201 Created
{
"message": "User and jobseeker created!"
}POST /api/auth/recruitersignup
Content-Type: application/json
{
"firstName": "Jane",
"lastName": "Smith",
"recruiterName": "Tech Corp",
"category": "Information Technology",
"employeeRange": "50-100",
"email": "[email protected]",
"contactNumber": "+1234567890",
"password": "SecurePass123!",
"confirmPassword": "SecurePass123!"
}
Response: 201 Created
{
"message": "User and recruiter created!"
}POST /api/auth/signin
Content-Type: application/json
{
"email": "[email protected]",
"password": "password"
}
Response: 200 OK
{
"user": {
"id": "...",
"email": "[email protected]",
"role": "jobseeker"
}
}GET /api/job/all?showAll=false&recruiterId=123
Response: 200 OK
{
"jobs": [...],
"count": 42
}GET /api/job/[id]
Response: 200 OK
{
"job": {
"_id": "...",
"jobTitle": "Software Engineer",
"location": "New York",
...
}
}POST /api/job/add
Authorization: Bearer <token>
Content-Type: application/json
{
"jobTitle": "Senior Developer",
"location": "San Francisco",
"jobCategory": "IT & Software",
"jobExperience": "5-7 Years",
"jobTypes": ["Full-Time", "Remote"],
"jobDescription": "...",
"keyResponsibilities": "...",
"shortDescription": "..."
}
Response: 201 Created
{
"message": "Job created successfully",
"jobId": "..."
}PUT /api/job/update
Authorization: Bearer <token>
Content-Type: application/json
{
"jobId": "...",
"jobTitle": "Updated Title",
...
}
Response: 200 OK
{
"message": "Job updated successfully"
}PATCH /api/job/[id]/publish
Authorization: Bearer <token>
Content-Type: application/json
{
"isPublished": true
}
Response: 200 OK
{
"message": "Job published successfully"
}GET /api/job/search?query=developer
Response: 200 OK
{
"jobs": [...]
}GET /api/job/filter?jobCategory=IT&jobExperience=3-5%20Years
Response: 200 OK
{
"jobs": [...]
}POST /api/jobapplication/add
Authorization: Bearer <token>
Content-Type: application/json
{
"jobId": "...",
"jobseekerId": "..."
}
Response: 201 Created
{
"message": "Application submitted successfully",
"applicationId": "..."
}GET /api/jobapplication/all?recruiterId=123
Response: 200 OK
{
"applications": [...],
"count": 15
}PUT /api/jobapplication/update
Authorization: Bearer <token>
Content-Type: application/json
{
"applicationId": "...",
"status": "Approved",
"isFavourited": true
}
Response: 200 OK
{
"message": "Application updated successfully"
}GET /api/users/get?id=123
Response: 200 OK
{
"user": {
"_id": "...",
"firstName": "John",
"email": "[email protected]",
"role": "jobseeker"
}
}PUT /api/users/update
Authorization: Bearer <token>
Content-Type: application/json
{
"userId": "...",
"firstName": "John",
"lastName": "Updated"
}
Response: 200 OK
{
"message": "User updated successfully"
}POST /api/users/uploadimage
Authorization: Bearer <token>
Content-Type: multipart/form-data
image: <file>
Response: 200 OK
{
"message": "Image uploaded successfully",
"imageUrl": "https://..."
}{
_id: ObjectId,
firstName: String,
lastName: String,
email: String (unique, indexed),
password: String (hashed),
profileImage: String (URL),
role: String ("admin" | "recruiter" | "jobseeker"),
createdAt: Date
}{
_id: ObjectId,
userId: ObjectId (ref: users),
email: String,
contactNumber: String,
dob: Date,
nationality: String,
languages: [String],
address: String,
age: Number,
maritalStatus: String,
religion: String,
ethnicity: String,
coverImage: String,
createdAt: Date
}{
_id: ObjectId,
userId: ObjectId (ref: users),
recruiterName: String,
category: String,
email: String,
employeeRange: String,
contactNumber: String,
website: String,
companyDescription: String,
industry: String,
location: String,
logo: String (URL),
coverImage: String,
facebook: String,
instagram: String,
linkedin: String,
x: String,
createdAt: Date
}{
_id: ObjectId,
recruiterId: ObjectId (ref: recruiters),
jobTitle: String (indexed),
location: String (indexed),
jobCategory: String (indexed),
jobExperience: String,
jobTypes: [String],
jobDescription: String (text),
keyResponsibilities: String (text),
shortDescription: String,
isPublished: Boolean (default: false, indexed),
createdAt: Date,
updatedAt: Date
}{
_id: ObjectId,
jobId: ObjectId (ref: jobs),
jobseekerId: ObjectId (ref: jobseekers),
recruiterId: ObjectId (ref: recruiters),
status: String ("Pending" | "Approved" | "Declined"),
isFavourited: Boolean (default: false),
appliedAt: Date,
updatedAt: Date
}{
_id: ObjectId,
jobseekerId: ObjectId (ref: jobseekers),
jobTitle: String,
companyName: String,
country: String,
city: String,
startDate: Date,
endDate: Date,
description: String
}{
_id: ObjectId,
jobseekerId: ObjectId (ref: jobseekers),
institutionName: String,
degree: String,
fieldOfStudy: String,
startDate: Date,
endDate: Date,
description: String
}{
_id: ObjectId,
jobseekerId: ObjectId (ref: jobseekers),
certificationName: String,
issuingOrganization: String,
receivedDate: Date,
expiryDate: Date,
credentialId: String
}{
_id: ObjectId,
userId: ObjectId (ref: users),
firstName: String,
lastName: String,
contactNumber: String,
email: String,
password: String (hashed),
profileImage: String,
createdAt: Date
}{
_id: ObjectId,
title: String,
description: String,
createdAt: Date,
updatedAt: Date
}{
_id: ObjectId,
userId: ObjectId (ref: users),
name: String,
email: String,
subject: String,
message: String,
status: String,
createdAt: Date
}{
_id: ObjectId,
title: String,
description: String,
image: String,
createdAt: Date
}{
_id: ObjectId,
recruiterId: ObjectId (ref: recruiters),
title: String,
description: String,
location: String,
date: Date,
time: String,
capacity: Number,
createdAt: Date
}{
_id: ObjectId,
ticketId: ObjectId (ref: tickets),
jobseekerId: ObjectId (ref: jobseekers),
enrolledAt: Date
}// Performance optimization indexes
db.users.createIndex({ email: 1 }, { unique: true });
db.jobs.createIndex({ isPublished: 1, createdAt: -1 });
db.jobs.createIndex({
jobTitle: "text",
jobCategory: "text",
location: "text",
});
db.jobapplications.createIndex({ jobId: 1, jobseekerId: 1 }, { unique: true });
db.jobapplications.createIndex({ recruiterId: 1, status: 1 });Netlify configuration has been removed; use Vercel or Docker for current deployments.
# Install Vercel CLI
npm install -g vercel
# Deploy
vercel
# Production deployment
vercel --prodCreate Dockerfile:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]Build and run:
docker build -t skills-careers .
docker run -p 3000:3000 --env-file .env.local skills-careers- Job seeker registration
- Recruiter registration
- Login with credentials
- Google OAuth login
- LinkedIn OAuth login
- Password reset flow
- Session persistence
- Profile creation/editing
- CV upload and generation
- Job search and filtering
- Job application submission
- Application tracking
- Recruiter profile viewing
- Company profile setup
- Job posting creation
- Job publishing/unpublishing
- Application management
- Candidate profile viewing
- Analytics dashboard
- User management
- Job moderation
- Platform analytics
- Press release management
- Announcement management
- Support ticket management
# Install testing tools
npm install -g lighthouse
# Run Lighthouse audit
lighthouse http://localhost:3000 --viewWe welcome contributions! Please follow these guidelines:
- 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
- Follow ESLint configuration
- Use Tailwind CSS for styling
- Write meaningful commit messages
- Add comments for complex logic
- Test your changes thoroughly
- Describe your changes clearly
- Reference any related issues
- Ensure all tests pass
- Update documentation if needed
This project is licensed under the MIT License - see the LICENSE file for details.
- Lead Developer: CodeZela Technologies
- Contributors: Diluksha Namal, Shamal Rajapaksha
- Next.js team for the amazing framework
- MongoDB for reliable database solutions
- All open-source contributors
- Documentation: Wiki
- Issues: GitHub Issues
- Email: [email protected]
- Website: skillscareers.lk
- β Core authentication system
- β Job posting and management
- β Application tracking
- β Admin dashboard
- β CV generation
- π Real-time notifications
- π Advanced analytics
- π AI-powered job recommendations
- π Calendar integration
- π Skills assessment tests
- π Company reviews
- π Dark mode
Made with β€οΈ by the Skills Careers Team