/**
* HireAI — AI recruitment platform, review core
* @author Roshan Aryan Majhi · jobs & candidates contributor
*/
Every hire.
Earned, not guessed.
HireAI centralizes the hiring pipeline — job posts, CV uploads, AI match scores with rationales, and a review workspace that renders one candidate pool as queue, kanban and table. I built across the jobs and candidates domains on a seven-person team.
// design_system
System first, screens second.
color/tokens
accent
#C9FF6B
ai
#B488FC
info
#4C9DFF
success
#3FD68F
ink
#0F0F0F
line
#FFFFFF12
type/scale
Aa
DM Sans / JetBrains Mono
Heading 20
Body 14 · hiring-calm
mono 11 · scores & stages
radius/0.625rem
cards lg · score pills full
components/ui
{ "match": 92, "why": "5y react + dnd-kit", "risk": "none seen" }
J/K move1–3 stageS shortlist
+49 more in package.json
// why_it_exists
Spreadsheets don't hire people.
CVs in inboxes, candidates in spreadsheets, decisions in gut feelings — hiring ran on memory and bias, and every round started from zero context.
HireAI keeps the whole loop in one place. Every candidate scored, staged and searchable: jobs and companies managed, CVs parsed on upload, AI matches explained, and reviewers moving people with single keystrokes.
// feature_modules
What ships inside.
review_workspace
One candidate pool rendered as queue, kanban and table — drag-and-drop between stages, keyboard shortcuts for every action, and workflows that refuse illegal jumps.
ai_matching
Every candidate-job pair carries a 0–100 match score with an explainable rationale — shortlisting starts from evidence, not gut feel.
jobs_companies
Company and job CRUD with real-time search, filters, logo and CV uploads — jobs carry enhanced and raw descriptions side by side.
candidate_pipeline
Candidate detail pages with accept / reject / shortlist actions, application history and status timelines moving through enforced stages.
api_layer
Eleven domain service modules over one Axios instance — auth headers, error normalization and auto-logout on 401 in a single place.
auth_access
JWT login with user-detail hydration, role-guarded routes, logout everywhere, and forgot / reset password flows.
command_search
A cmdk palette searching companies, jobs and candidates at once — the fastest way to jump anywhere in the hiring OS.
deploy_pipeline
Multi-stage Docker builds (Node 20 Alpine → Nginx Alpine) with SPA routing, linted and type-checked in CI.
// engineering_decisions
Worth noting.
- +Three views, one pool — queue for triage speed, kanban for pipeline feel, table for scanning — all reading the same Query cache.
- +Scores must explain themselves — a bare number invites distrust, so every match ships with its rationale next to it.
- +Status is a state machine — stages advance through legal transitions only — the UI refuses jumps the process forbids.
- +One axios, eleven modules — auth, errors and 401 logout live in the interceptor; domain modules stay thin and boring.
- +Optimistic everywhere — accepts, rejects and stage moves apply instantly and roll back on failure, because hiring moves fast.
// my_role
What I built.
Jobs and candidates domain owner on the jobs-roshan line — tables, detail pages, uploads and auth — on a seven-person team.
$jobs_domain
- Job table, job detail page and edit-job with filters
- Company detail jobs table with missing-date handling
- description_enhanced + description_raw keys on job details
- Overflow and layout fixes across job surfaces
$candidates_domain
- Candidate detail actions: accept, reject, shortlist
- CV upload wired into the candidate flow
- Applications endpoints feeding the detail page
- Candidate table refactor and review-page groundwork
$auth_shell
- Login, logout and current-user hydration
- Axios instance updated for token handling
- Loaders and minor refactors across auth screens
// in_one_line
Hiring without spreadsheets — every candidate scored, staged and one keystroke away.