Final year project website built with Next.js 14, TypeScript, and Tailwind CSS.
| Route | Description |
|---|---|
/ |
Landing page — public hero, how it works, job preview |
/jobs |
Browse all open positions |
/apply |
Candidate application form with CV upload |
/portal |
Candidate portal — applications & AI feedback |
/dashboard |
Recruiter dashboard — KPIs & recent activity |
/jobs/applicants |
Recruiter applicant review with feedback panel |
/analytics |
Bias analytics — charts, audit log, reports |
/api-integration |
Model integration hub — test, configure, docs |
/auth/login |
Sign in |
/auth/signup |
Register as recruiter or candidate |
npm install
npm run dev
# → http://localhost:3000MODEL_API_URL=http://localhost:8000# model_server.py
from fastapi import FastAPI
from pydantic import BaseModel
from your_model import predict
app = FastAPI()
class ScreenRequest(BaseModel):
resume: str
job_description: str
@app.post("/screen")
async def screen(req: ScreenRequest):
result = predict(req.resume, req.job_description)
return {
"score": result["score"], # float 0–1
"skills_match": result["skills"], # float 0–1
"experience_match": result["exp"], # float 0–1
"decision": result["decision"], # "shortlisted" | "rejected"
"feedback": result["feedback"], # string sent to candidate
"bias_flags": result["bias_flags"], # list of {type, description, severity}
"skill_gaps": result["skill_gaps"], # list of strings
"strengths": result["strengths"], # list of strings
}
# Run: uvicorn model_server:app --port 8000Uncomment the real model call block and remove the mock response block.
Use the Test Model tab to paste a resume + job description and see live model output.
fairhire/
├── app/
│ ├── page.tsx # Landing page
│ ├── dashboard/page.tsx # Recruiter dashboard
│ ├── jobs/page.tsx # Job listings
│ ├── jobs/applicants/page.tsx # Applicant review
│ ├── portal/page.tsx # Candidate portal
│ ├── apply/page.tsx # Application form
│ ├── analytics/page.tsx # Bias analytics
│ ├── api-integration/page.tsx # ← Model integration hub
│ ├── auth/login/page.tsx
│ ├── auth/signup/page.tsx
│ └── api/
│ ├── screen/route.ts # ← The model bridge
│ ├── jobs/route.ts
│ └── applications/route.ts
├── components/
│ ├── ui/
│ │ ├── Badge.tsx
│ │ ├── ScoreBar.tsx
│ │ └── FeedbackPanel.tsx
│ ├── layout/
│ │ ├── Navbar.tsx
│ │ └── Footer.tsx
│ └── shared/
│ └── JobCard.tsx
├── lib/
│ ├── mock-data.ts
│ └── utils.ts
└── types/index.ts
npm install prisma @prisma/client
npx prisma initAdd to schema.prisma — see the architecture doc for the full schema.
npm install next-authSee NextAuth.js docs for setup.