IF1EIGHT0STY
srchire_core.ai

/**
* 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.

design_system.fig

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

sm
md
lg
4xl

cards lg · score pills full

components/ui

ShortlistReject92J
Search candidates…/
Tokens → components, no hard-coded hex
modes.stat
3
review modes
services.stat
11
api modules
score.json
{
  "match": 92,
  "why": "5y react + dnd-kit",
  "risk": "none seen"
}
Explainable score
review.demo
MMira JoshiDevOps Engineer95
AAarav SharmaFrontend Engineer92
EElena GurungProduct Manager88
DDiya KarkiBackend Engineer87

J/K move1–3 stageS shortlist

One pool, three rhythms
ai.engine
Match 0–10092
RationaleCITED
Shortlist1-KEY
keys.map
JKmove in queue
123set stage
Sshortlist
/search all
Hands on keys
services.api
candidatesscoring + pipeline
jobscrud + filters
companieslogos + search
authjwt + interceptors
+7 more modules
auth.jwt
Login / logouthydrated user
Route guardsrole-checked
Forgot / resettoken links
JWT in, JWT out
commits.log
23 commits · jobs & candidates
package.json
react19.2.5
@dnd-kit/core6.3.1
@tanstack/react-query5.83.0
recharts3.8.1
react-hook-form7.61.1
zod3.25.76

+49 more in package.json

The stack
ship.docker
node:20-alpinebuild
nginx:alpineserve
spa routingfallback
Zero-downtime deploys

// 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.

3 modesdnd-kitkeyboard-first

ai_matching

Every candidate-job pair carries a 0–100 match score with an explainable rationale — shortlisting starts from evidence, not gut feel.

match scoresrationale

jobs_companies

Company and job CRUD with real-time search, filters, logo and CV uploads — jobs carry enhanced and raw descriptions side by side.

file uploadlive search

candidate_pipeline

Candidate detail pages with accept / reject / shortlist actions, application history and status timelines moving through enforced stages.

detail viewsstage machine

api_layer

Eleven domain service modules over one Axios instance — auth headers, error normalization and auto-logout on 401 in a single place.

interceptors11 modules

auth_access

JWT login with user-detail hydration, role-guarded routes, logout everywhere, and forgot / reset password flows.

jwtroute guards

command_search

A cmdk palette searching companies, jobs and candidates at once — the fastest way to jump anywhere in the hiring OS.

cmdkglobal

deploy_pipeline

Multi-stage Docker builds (Node 20 Alpine → Nginx Alpine) with SPA routing, linted and type-checked in CI.

dockernginx spa

// 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.

23
commits
151
source files
11
api modules

$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.
React 19TypeScriptTanStack Querydnd-kitRHF + ZodRechartscmdkAxiosVitestDockershadcnFramer Motion