Skip to main content
Roshan Aryal
All projects

AI · 2026

HireIQ — AI Candidate Intelligence Platform

Full-stack AI application for Apprento, a NZ/AU sales recruitment and training firm, automating their candidate-assessment pipeline end-to-end. Document ingestion (PDF / DOCX) → structured Claude prompting → role-aware scoring → client-ready report covering executive summary, scorecard, fit analysis, and targeted interview probes. Stateless processing, human-in-the-loop review, and an API fallback path for resilience.

<30sSource private
PythonFastAPIClaude APIReactDockerAWS

The problem

Apprento’s candidate-assessment pipeline was entirely manual: a recruiter would read a CV plus an interview transcript, then write a structured report covering executive summary, scorecard, role-fit analysis, and follow-up probe questions. Per candidate, that was 30–45 minutes of focused work — the bottleneck on how many candidates a recruiter could move through the funnel each week.

Two constraints shaped everything. First, under New Zealand’s Privacy Act 2020, candidate documents are sensitive personal data with real retention obligations — whatever I built had to minimise what was stored, where, and for how long. Second, the client was non-technical: every architectural decision had to be explainable in plain English before it was approved.

Approach

The system has three layers. A document ingestion pipeline using pdfplumber and python-docx handles CVs and GRW AI interview transcripts — any format, normalised text out. A structured prompting layer against the Anthropic Claude API emits a typed JSON report shape: executive summary, per-dimension scorecard, fit analysis, and targeted probe questions. And a framework and role routing layer selects the appropriate assessment rubric at runtime — three seniority-level frameworks (career starters, experienced salespeople, sales leaders) combined with ten role-type overlays (SDR, AE, BDM, CSM, and others) without duplicating prompt logic.

Schema validation and retry logic handle malformed LLM responses. A Groq fallback path keeps the workflow available when the primary API degrades. FastAPI on the backend, React on the frontend, Docker for the deploy, Vercel and AWS for hosting.

Before finalising the UX, I spent time with Apprento’s recruiting team to understand the actual day-to-day workflow — what they look at first, where they lose time, what a report needs to say for them to trust it enough to send to a client.

Key decisions

  • Stateless processing — minimise data at rest

    Privacy Act 2020 obligations bite hardest on data you keep. Since candidate CVs already live in Apprento’s ATS (JobAdder), HireIQ was architected as a pure processing layer — documents in, report out, nothing stored. This eliminated an entire compliance surface and significantly simplified the system.

  • Human-in-the-loop, not human-on-the-loop

    AI drafts the assessment; a recruiter reviews and approves before any candidate outcome is actioned. The model is a force-multiplier on a recruiter, not a substitute. The failure mode of an unreviewed bad assessment has real-person consequences.

  • Fallback API path for live workflows

    Recruiters use this inside their daily flow. A single provider outage can’t mean they’re blocked — the fallback path keeps the workflow available when the primary degrades.

  • Role-aware rubrics over a one-size prompt

    Assessing a career-starter against the same criteria as a sales leader produces noise. Three framework variants and ten role-type overlays are injected at runtime — same engine, appropriate scoring for every candidate type.

Outcome

Live in Apprento’s recruiter workflow. Report generation went from 30–45 minutes of manual work to under 30 seconds end-to-end. Recruiters keep the review-and-approve step — the throughput win is in the drafting, not the decision. JobAdder API integration is in progress for the next phase, which will eliminate the manual upload step entirely.

What I’d do differently

I’d invest earlier in an eval layer — a test suite of known CV/report pairs to catch prompt regressions when rubrics change. I built the prompting layer iteratively against real example reports, but without automated evals, rubric changes require manual spot-checking every time. For a product where output quality directly affects hiring decisions, that’s the gap worth closing first.