Orange replaces the busywork of recruiting. Describe a role, drop in the CVs, and it reads every one, ranks the shortlist, and shows its work. Sourcing to offer, run by AI.
Early prototype. The core loop works end to end today. Everything under Roadmap is where we take it next.
You describe the role. Orange does the reading: it parses every résumé into a clean profile, scores each candidate against the job across skills, experience, education, and logistics, and writes out the reasoning behind every ranking. The scores are real and every one is auditable, with the model quoting the exact lines from the CV that justify it. No forms. No keyword filters. No black box.
Uploads land on a queue, so ranking runs in the background. The recruiter never waits on the model.
flowchart TD
subgraph Client["Recruiter web app · Next.js"]
direction LR
A["Job chat"]
B["Pipeline Kanban"]
C["Candidate profile"]
end
Client -->|REST| API["API layer · route handlers (BFF)"]
API -->|commands| ORCH["Orchestrator"]
API -->|upload| OBJ[("Object storage · CV files")]
API -->|reads| PG[("PostgreSQL + pgvector")]
ORCH -->|enqueue| Q[["Job queue · async parse + rank"]]
Q -->|consume| AI
subgraph AI["AI agent service · FastAPI"]
direction LR
JA["Job Architect"]
CV["CV Parser"]
RK["Ranker"]
end
AI -->|LLM calls| LLM(["LLM API · Claude / OpenAI"])
AI -->|read / write| PG
We start where hiring hurts most and expand until the whole pipeline runs itself.
- Read, score, and rank candidates with reasoning you can act on
- ATS sync: Greenhouse, Lever, Workday
- Inbound capture and outbound follow-ups over email and WhatsApp
- AI first-round interviews, scored and auto-advanced
- Orange in the room: a live copilot for human technical interviews
- Sourcing to offer, end to end
The goal: the hiring team, in software.
Lean now so it ships fast. Built to grow into a stack that scales.
| Now (prototype) | At scale | |
|---|---|---|
| Web | Next.js · TypeScript · Tailwind | Next.js |
| API and services | Next.js route handlers (BFF) | Go services |
| Agents | Python · FastAPI | Python · FastAPI |
| Reasoning | Claude / OpenAI | Claude / OpenAI + tuned models |
| Vector search | Postgres + pgvector |
dedicated vector DB (Qdrant / Pinecone) |
| Queue and cache | in-process queue | Redis + event stream |
| Data | PostgreSQL | PostgreSQL + read replicas |
| Infra | Vercel · Railway | AWS · Docker · Kubernetes |
Prerequisites: Node 22+, uv, and Docker.
git clone https://github.com/saadhtiwana/orange.git
cd orange
cp .env.example .env # add your ANTHROPIC_API_KEY1. Database — Postgres with pgvector, on port 5432:
docker compose up -d postgres2. AI service — FastAPI on localhost:8000:
cd ai
cp ../.env.example .env # needs ANTHROPIC_API_KEY
uv sync
uv run uvicorn app.main:app --reloadCheck it: curl localhost:8000/health
3. Web app — Next.js on localhost:3000:
cd web
cp ../.env.example .env # needs DATABASE_URL and AI_SERVICE_URL
npm install
npx prisma migrate deploy # create the tables
npm run devOpen localhost:3000 — it lands on the Job Architect. Describe a role and you get a structured job description back, saved to Postgres.
# web/
npm run lint && npm run format:check && npm run typecheck && npm test && npm run build
# ai/
uv run ruff check . && uv run ruff format --check . && uv run mypy app scripts && uv run pytestCI runs exactly these on every push and PR. Tests mock the LLM, so they need no API key and cost nothing.
After changing a contract in ai/app/contracts/models.py, regenerate the artifacts:
cd ai && uv run python scripts/export_schemas.py
cd web && npm run gen:contractsSee docs/contracts.md for what the contracts are and CONTRIBUTING.md for the branch and commit conventions.
@saahtiwana · @ahmadmustafa02 · @abdullahxdev
© 2026 Orange