Skip to content

d-mahi14/JobLink-Inheritance

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

42 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

JobLink - AI-Powered Job Matching Platform

JobLink Logo

Connect talented professionals with leading companies through intelligent resume analysis and job matching

React Node.js Supabase Tailwind CSS


πŸ“‹ Table of Contents


🎯 Overview

JobLink is a modern job matching platform that leverages AI technology to streamline the recruitment process. It provides:

  • For Job Seekers: AI-powered resume analysis, personalized job recommendations, and application tracking
  • For Employers: Easy job posting, AI-matched candidate screening, and application management

The platform uses intelligent algorithms to extract skills from resumes, match candidates with relevant positions, and provide insights to both parties for better hiring decisions.


✨ Features

For Candidates

  • πŸ“„ Resume Upload & Analysis: AI-powered extraction of skills, contact information, and qualifications
  • πŸ” Smart Job Search: Search and filter jobs by title, location, and requirements
  • πŸ“Š Application Tracking: Monitor application status in real-time
  • 🎯 Match Scoring: See how well your skills match job requirements
  • πŸ‘€ Profile Management: Update profile information and profile pictures

For Employers

  • πŸ“ Job Posting: Create and manage job listings with detailed requirements
  • πŸ‘₯ Candidate Review: Review applications with AI-generated match scores
  • πŸ“ˆ Analytics Dashboard: Track job posting performance and applications
  • βœ… Application Management: Update candidate status (pending, reviewed, shortlisted, rejected, accepted)
  • 🏒 Company Profile: Manage company information and branding

General Features

  • πŸ” Secure Authentication: Email/password and Google OAuth support (ready for integration)
  • πŸ“± Responsive Design: Fully responsive UI that works on all devices
  • 🎨 Professional UI: LinkedIn-inspired design with DaisyUI components
  • ⚑ Real-time Updates: Instant feedback and state management with Zustand
  • πŸ”” Toast Notifications: User-friendly notifications for all actions

πŸ›  Tech Stack

Frontend

  • React 18.3.1 - UI library
  • Tailwind CSS 3.4.1 - Utility-first CSS
  • Vite 5.1.4 - Build tool and dev server

Backend (Expected)

  • Node.js - Runtime environment
  • Express.js - Web framework
  • Supabase - Database and authentication
  • PostgreSQL - Relational database
  • JWT - Token-based authentication
  • AI/ML Services - Resume parsing and skill extraction

Development Tools

  • PostCSS - CSS processing
  • Autoprefixer - CSS vendor prefixing

πŸ“ Project Structure

JobLink/
β”œβ”€β”€ frontend/
β”‚   β”œβ”€β”€ public/
β”‚   β”‚   β”œβ”€β”€ logo1.png
β”‚   β”‚   └── vite.svg
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ api/                    # API service layer
β”‚   β”‚   β”‚   β”œβ”€β”€ applications.api.js
β”‚   β”‚   β”‚   β”œβ”€β”€ auth.api.js
β”‚   β”‚   β”‚   β”œβ”€β”€ axios.js
β”‚   β”‚   β”‚   β”œβ”€β”€ jobs.api.js
β”‚   β”‚   β”‚   └── resumes.api.js
β”‚   β”‚   β”œβ”€β”€ components/             # Reusable components
β”‚   β”‚   β”‚   β”œβ”€β”€ auth/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ LoginForm.jsx
β”‚   β”‚   β”‚   β”‚   └── SignupForm.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ candidate/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ApplicationCard.jsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ContactInfo.jsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ JobCard.jsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ResumeCard.jsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ResumeUpload.jsx
β”‚   β”‚   β”‚   β”‚   └── SkillsDisplay.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ company/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ApplicationReviewCard.jsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ JobPostCard.jsx
β”‚   β”‚   β”‚   β”‚   └── JobPostForm.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ layout/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ Footer.jsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ Navbar.jsx
β”‚   β”‚   β”‚   β”‚   └── Sidebar.jsx
β”‚   β”‚   β”‚   └── shared/
β”‚   β”‚   β”‚       β”œβ”€β”€ Badge.jsx
β”‚   β”‚   β”‚       β”œβ”€β”€ EmptyState.jsx
β”‚   β”‚   β”‚       β”œβ”€β”€ LoadingSpinner.jsx
β”‚   β”‚   β”‚       β”œβ”€β”€ ProtectedRoute.jsx
β”‚   β”‚   β”‚       └── StatCard.jsx
β”‚   β”‚   β”œβ”€β”€ hooks/                  # Custom React hooks
β”‚   β”‚   β”‚   β”œβ”€β”€ useAuth.js
β”‚   β”‚   β”‚   └── useFileUpload.js
β”‚   β”‚   β”œβ”€β”€ pages/                  # Page components
β”‚   β”‚   β”‚   β”œβ”€β”€ candidate/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ BrowseJobs.jsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ CandidateDashboard.jsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ CandidateProfile.jsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ MyApplications.jsx
β”‚   β”‚   β”‚   β”‚   └── MyResumes.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ company/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ CompanyDashboard.jsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ CompanyProfile.jsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ CreateJob.jsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ EditJob.jsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ MyJobPostings.jsx
β”‚   β”‚   β”‚   β”‚   └── ViewApplications.jsx
β”‚   β”‚   β”‚   └── public/
β”‚   β”‚   β”‚       β”œβ”€β”€ LandingPage.jsx
β”‚   β”‚   β”‚       β”œβ”€β”€ LoginPage.jsx
β”‚   β”‚   β”‚       └── SignupPage.jsx
β”‚   β”‚   β”œβ”€β”€ store/                  # Zustand state management
β”‚   β”‚   β”‚   β”œβ”€β”€ applicationStore.js
β”‚   β”‚   β”‚   β”œβ”€β”€ authStore.js
β”‚   β”‚   β”‚   β”œβ”€β”€ jobStore.js
β”‚   β”‚   β”‚   └── resumeStore.js
β”‚   β”‚   β”œβ”€β”€ utils/                  # Utility functions
β”‚   β”‚   β”‚   β”œβ”€β”€ constants.js
β”‚   β”‚   β”‚   β”œβ”€β”€ formatters.js
β”‚   β”‚   β”‚   β”œβ”€β”€ skillsExtractor.js
β”‚   β”‚   β”‚   └── validators.js
β”‚   β”‚   β”œβ”€β”€ App.jsx                 # Main app component
β”‚   β”‚   β”œβ”€β”€ index.css               # Global styles
β”‚   β”‚   └── main.jsx                # App entry point
β”‚   β”œβ”€β”€ .gitignore
β”‚   β”œβ”€β”€ eslint.config.js
β”‚   β”œβ”€β”€ index.html
β”‚   β”œβ”€β”€ package.json
β”‚   β”œβ”€β”€ postcss.config.js
β”‚   β”œβ”€β”€ tailwind.config.js
β”‚   └── vite.config.js
└── backend/                        # (Backend implementation)
    └── (Your backend structure)

πŸš€ Installation

Prerequisites

  • Node.js (v16 or higher)
  • npm or yarn
  • Git
  • Supabase Account (for database)

Clone Repository

git clone https://github.com/d-mahi14/JobLink-Inheritance.git
cd JobLink-Inheritance

Frontend Setup

cd frontend
npm install

Backend Setup (if applicable)

cd backend
npm install

βš™οΈ Configuration

Frontend Environment Variables

Create a .env file in the frontend directory:

# API Configuration
VITE_API_URL=http://localhost:5000/api

# For production
# VITE_API_URL=https://your-api-domain.com/api

Supabase Configuration (if using Supabase directly)

VITE_SUPABASE_URL=https://your-project-ref.supabase.co
VITE_SUPABASE_ANON_KEY=your-anon-key-here

Backend Environment Variables (Example)

Create a .env file in the backend directory:

# Database
DATABASE_URL=postgresql://user:password@localhost:5432/joblink

# JWT
JWT_SECRET=your-jwt-secret-key

# Server
PORT=5000
NODE_ENV=development

# Google OAuth (Optional)
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
GOOGLE_CALLBACK_URL=http://localhost:5000/api/auth/google/callback

πŸƒ Running the Application

Development Mode

Frontend:

cd frontend
npm run dev

The app will run at http://localhost:3000

Backend:

cd backend
npm run dev

The API will run at http://localhost:5000

Production Build

Frontend:

cd frontend
npm run build
npm run preview

πŸ“‘ API Documentation

Authentication Endpoints

POST /api/auth/signup

Register a new user (candidate or company)

Request Body:

{
  "email": "user@example.com",
  "password": "password123",
  "fullName": "John Doe",
  "userType": "candidate" // or "company"
}

POST /api/auth/login

Login user

Request Body:

{
  "email": "user@example.com",
  "password": "password123"
}

Response:

{
  "session": {
    "access_token": "jwt-token"
  },
  "user": {
    "id": "uuid",
    "email": "user@example.com"
  },
  "profile": {
    "user_type": "candidate",
    "full_name": "John Doe"
  }
}

Resume Endpoints

POST /api/resumes

Upload and analyze resume

Request Body:

{
  "resumeFile": "base64-encoded-file",
  "fileName": "resume.pdf"
}

GET /api/resumes

Get user's resumes

DELETE /api/resumes/:id

Delete a resume

Job Endpoints

GET /api/jobs

Get all jobs (with optional filters)

Query Parameters:

  • page: Page number
  • search: Search term
  • location: Location filter

POST /api/jobs

Create job posting (Company only)

Request Body:

{
  "title": "Senior Software Engineer",
  "description": "Job description...",
  "requirements": ["React", "Node.js"],
  "location": "Remote",
  "salaryRange": "β‚Ή80k - β‚Ή120k",
  "status": "active"
}

PUT /api/jobs/:id

Update job posting

DELETE /api/jobs/:id

Delete job posting

Application Endpoints

POST /api/applications

Apply for a job

Request Body:

{
  "jobId": "uuid",
  "resumeId": "uuid"
}

GET /api/applications/my-applications

Get candidate's applications

GET /api/applications/job/:jobId

Get applications for a job (Company only)

PUT /api/applications/:id/status

Update application status

Request Body:

{
  "status": "shortlisted",
  "matchScore": 85
}

πŸ—„οΈ Database Schema

Users Table

CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  email VARCHAR(255) UNIQUE NOT NULL,
  password VARCHAR(255), -- nullable for OAuth users
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

Profiles Table

CREATE TABLE profiles (
  id UUID PRIMARY KEY REFERENCES users(id),
  full_name TEXT NOT NULL,
  user_type VARCHAR(50) CHECK (user_type IN ('candidate', 'company')),
  profile_pic TEXT,
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

Resumes Table

CREATE TABLE resumes (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  user_id UUID REFERENCES users(id),
  file_name TEXT NOT NULL,
  file_size INTEGER,
  resume_url TEXT NOT NULL,
  analysis_data JSONB,
  created_at TIMESTAMP DEFAULT NOW()
);

Job Postings Table

CREATE TABLE job_postings (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  company_id UUID REFERENCES users(id),
  title TEXT NOT NULL,
  description TEXT,
  requirements TEXT[],
  location TEXT,
  salary_range TEXT,
  status VARCHAR(50) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

Applications Table

CREATE TABLE applications (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  job_id UUID REFERENCES job_postings(id),
  candidate_id UUID REFERENCES users(id),
  resume_id UUID REFERENCES resumes(id),
  status VARCHAR(50) DEFAULT 'pending',
  match_score INTEGER,
  match_details JSONB,
  applied_at TIMESTAMP DEFAULT NOW()
);

πŸ” Authentication

JobLink supports two authentication methods:

1. Email/Password Authentication

  • Users sign up with email and password
  • Passwords are hashed and stored securely
  • JWT tokens are used for session management

2. Google OAuth (Ready for Integration)

  • Google Sign-In/Sign-Up buttons are implemented
  • OAuth flow components are ready
  • Requires backend OAuth setup (see Supabase setup files)

To enable Google OAuth:

  1. Follow SUPABASE_SETUP_GUIDE.md (provided separately)
  2. Configure Google OAuth in Supabase Dashboard
  3. Update environment variables
  4. Uncomment OAuth routes in backend

πŸ‘₯ User Roles

Candidate

  • Upload and manage resumes
  • Browse and search jobs
  • Apply for positions
  • Track application status
  • View match scores

Company

  • Post and manage jobs
  • Review applications
  • Update candidate status
  • Assign match scores
  • Manage company profile

🎨 UI/UX Features

  • LinkedIn-Inspired Design: Professional and familiar interface
  • Responsive Layout: Works seamlessly on mobile, tablet, and desktop
  • DaisyUI Components: Pre-built, customizable components
  • Toast Notifications: Real-time feedback for user actions
  • Loading States: Spinners and skeleton screens for better UX
  • Empty States: Helpful messages when no data is available
  • Form Validation: Client-side validation for all forms

πŸ§ͺ Testing

# Run frontend tests (if configured)
cd frontend
npm test

# Run backend tests (if configured)
cd backend
npm test

🚒 Deployment

Frontend Deployment (Vercel/Netlify)

  1. Build the project:

    npm run build
  2. Deploy the dist folder to your hosting service

  3. Set environment variables in hosting dashboard

Backend Deployment (Heroku/Railway/Render)

  1. Push code to Git repository
  2. Connect repository to hosting service
  3. Set environment variables
  4. Deploy

Database (Supabase)

  1. Create Supabase project
  2. Run migrations
  3. Configure authentication providers
  4. Update connection strings

πŸ›£οΈ Roadmap

  • Enhanced AI matching algorithm
  • Video interview integration
  • Chat/messaging system
  • Email notifications
  • Advanced analytics dashboard
  • Mobile app (React Native)
  • Resume builder
  • Company verification system
  • Payment integration for premium features
  • Multi-language support

πŸ› Known Issues

  • AI resume parsing may require backend service configuration
  • Google OAuth requires additional setup (guide provided)
  • File upload size limited to 5MB

🀝 Contributing

Contributions are welcome! Please follow these steps:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

Coding Standards

  • Use ESLint configuration provided
  • Follow React best practices
  • Write meaningful commit messages
  • Add comments for complex logic
  • Update documentation as needed

πŸ“ License

This project is licensed under the MIT License - see the LICENSE file for details.


πŸ‘¨β€πŸ’» Authors


πŸ™ Acknowledgments


πŸ”— Links


Made with ❀️ by the JobLink Team

⭐ Star this repo if you find it helpful!

About

Deployed app on vercel

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors