An AI-powered resume screening tool. Paste a job description, let the AI extract scoring criteria, upload resumes to score them, then refine results with natural-language feedback.
- 📋 Criteria extraction — paste a job description; the AI extracts 4–6 structured scoring criteria with a human-in-the-loop approval step
- 📊 Resume scoring — upload PDF resumes; each is scored against the criteria and displayed as
score / maxwith a summary - 🔄 Feedback loop — give natural-language feedback (e.g. "weight cloud experience more heavily") and the AI re-scores all resumes, remembering your preferences across rounds
- 🖥️ Split-panel UI — criteria and resume scores on the left, conversational interface on the right
| Layer | Library |
|---|---|
| Frontend | React + TypeScript (Vite) |
| Backend | FastAPI + Server-Sent Events |
| LLM orchestration | LangGraph |
| LLM provider | OpenAI GPT-4o-mini |
| Checkpoint storage | Neon PostgreSQL (psycopg_pool) |
| Data validation | Pydantic |
Prerequisites: Python 3.12+, uv, Node.js 18+, an OpenAI API key, a Neon database URL.
# Install dependencies
uv sync
# Create .env in the project root
OPENAI_API_KEY=sk-...
NEON_DATABASE_URL=postgresql://...
# Start the backend (port 8000)
uv run --env-file .env python scripts/run_server.pycd frontend
npm install
npm run devThen open http://localhost:5173.
- Click Fill JD in the right panel and paste the job description
- Review the extracted criteria; reply with
approveor send revisions - Click Upload Resumes and select PDF files
- Scores appear in the left panel as
score / maxwith a one-line summary per resume - Enter feedback in the right panel to re-score; the AI updates scores and remembers your preferences
hire-panel/
├── backend/
│ ├── main.py # FastAPI app + lifespan (DB init/close)
│ ├── routers/ # HTTP + SSE route handlers
│ ├── services/ # Business logic (session, JD, resume, feedback)
│ │ └── db.py # Postgres connection pool + checkpointer
│ └── pipeline/ # LangGraph pipelines
│ ├── jd_graph.py # JD → criteria extraction (with HR approval interrupt)
│ ├── resume_graph.py # Resume scoring
│ ├── feedback_graph.py # Feedback processing + re-scoring
│ ├── nodes/ # Individual graph node implementations
│ ├── prompts/ # LLM prompt templates
│ └── schemas/ # Pydantic structured-output schemas
├── frontend/
│ └── src/
│ ├── App.tsx # Root layout (split panel)
│ ├── api.ts # Typed API + SSE client
│ ├── components/ # CriteriaList, ResumeTable, JdFlow, ResumeUpload, FeedbackChat
│ └── hooks/ # useSession, useJdFlow, useResumeUpload, useFeedback
├── tests/
│ └── e2e/ # Integration test scripts
├── scripts/
│ └── run_server.py # Dev server launcher
└── pyproject.toml

