Haira – AI Hiring Platform
Resume screening and AI-led technical interviews
- Role
- Technical Lead (Backend, AI & Full-Stack)
- Client
- The Special Character

An AI hiring platform that parses resumes, scores candidates against a job specification and runs conversational technical interviews. I led the architecture and the team: FastAPI services, LLM agents with function calling, pgvector matching and a Next.js frontend.
- Designed the whole system: FastAPI services, Celery queues, PostgreSQL data model, authentication and the Next.js frontend.
- Built AI agent workflows on OpenAI and Claude tool/function calling with strict JSON schemas. Output that fails schema validation is retried instead of reaching downstream steps.
- Added pgvector embeddings and cosine similarity search to score candidates against job requirements.
- Streamed interview responses over Server-Sent Events, with conversation state cached in Redis so a dropped connection can resume.
- Led the backend and frontend teams: sprint planning, design reviews, code review, mentoring, automated tests and CI/CD.
- Python
- FastAPI
- AI Agents
- PostgreSQL
- pgvector
- Redis
- Celery
- Next.js
- TypeScript
- Docker
Problem and objectives
Screening resumes by hand is slow and inconsistent, and it does not scale with application volume. Haira was built to take in resumes, extract structured skills and experience, score each candidate against the job requirements, and run an interactive text or voice interview, with a person reviewing the result instead of doing the first pass.
Architecture

Diagram: Haira's async multi-agent pipeline.
The backend is a set of asynchronous FastAPI services. A new application returns a job token immediately and the work continues in Celery workers backed by Redis. Resumes are parsed into a strict JSON schema with LLM function calling, then embedded and stored in PostgreSQL with pgvector so matching can combine keyword filters with semantic similarity.
The interview orchestrator runs multi-turn agents with session state held in Redis, and streams model output to the Next.js client over Server-Sent Events so answers appear as they are generated.
Tradeoffs
Every step that makes a decision (scoring a resume, flagging a concern, scoring an answer) returns constrained, schema-validated output. The interview dialogue itself is left open-ended. Mixing those up in either direction, constraining the conversation or freeing the scoring, caused most of the reliability problems during development.
Matching has the same shape. Keyword filters alone missed strong candidates who described a skill in different words, and semantic similarity alone over-ranked resumes that missed hard requirements, so Haira uses both.