Know what the algorithm sees.
ATS simulation · Algorithmic bias detection · Research-backed
RecruitLens is an AI-powered tool that shows job seekers exactly how an Applicant Tracking System (ATS) processes their resume — and flags resume elements that peer-reviewed research identifies as proxies for protected characteristics.
Most ATS systems are black boxes. Candidates submit resumes without knowing whether they'll survive automated keyword filtering, and without knowing that completely neutral elements — their name, their address, their graduation year — can cause an algorithm to silently filter them out before a human ever reads their application.
RecruitLens makes that process transparent.
Upload a resume and a job description. In seconds, you get:
- An ATS score (0–100) simulating keyword and skills matching
- A pass / fail prediction with plain-English reasoning
- Extracted entities — what an ATS actually sees: skills, education, experience
- Keyword gaps — hard skills, soft skills, and certifications missing from your resume
- Bias signal detection — 8 research-backed proxy discrimination patterns flagged with citations
- Actionable suggestions — specific rewrites, not generic advice
This tool is the practical implementation of a peer-reviewed study published in REVIZOR — Journal for Organization Management, Finance and Audit.
Pavlović, M., Glišović, L., & Mirčetić, V. (2026). Uticaj veštačke inteligencije na savremene prakse regrutacije i selekcije [The Impact of Artificial Intelligence on Contemporary Recruitment and Selection Practices]. REVIZOR, 28(4). https://doi.org/10.46793/Rev25112.091P
The paper documents how AI recruitment systems perpetuate historical discrimination through proxy bias — using seemingly neutral data points as stand-ins for protected characteristics. It identifies 8 specific patterns, each grounded in independent algorithmic bias research:
| Signal | Proxies for | Severity | Source |
|---|---|---|---|
| Graduation year | Age | Medium | Köchling & Wehner (2020) |
| Foreign name | Ethnicity / national origin | High | Mehrabi et al. (2021) |
| Home address | Socioeconomic status | Low | Raghavan et al. (2020) |
| Employment gap | Disability or caregiving | Medium | Glazko et al. (2024) |
| Disability language | Disability status | High | Glazko et al. (2024) |
| Photo reference | Gender, ethnicity, age | High | Bogen & Rieke (2018) |
| University prestige | Socioeconomic class | Low | Raghavan et al. (2020) |
| Gendered language | Gender | Medium | Köchling & Wehner (2020) |
RecruitLens detects all 8. Every flagged result includes the triggering excerpt, a plain-English explanation, and the academic citation — making the analysis fully transparent and explainable.
| Layer | Technology |
|---|---|
| Frontend | React 18 · Vite 5 · React Router v6 |
| Backend | Python 3.11 · FastAPI · Uvicorn |
| AI | Google Gemini 2.5 Flash |
| Document parsing | pdfplumber · python-docx |
| Security | Magic-byte file validation · CSP headers · CORS · Rate limiting |
| Hosting | Vercel (frontend) · Render (backend) |
- Node.js 18+
- Python 3.11+
- A Google AI Studio API key (free tier: 1,500 req/day)
git clone https://github.com/matejapp/recruit-lens.git
cd recruit-lenscd server
pip install -r requirements.txtCreate server/.env:
GEMINI_API_KEY=your_api_key_here
MODEL_NAME=gemini-2.5-flash
ALLOWED_ORIGIN=http://localhost:5173Start the server:
uvicorn main:app --reload
# API running at http://localhost:8000
# Swagger docs at http://localhost:8000/docscd client
npm installCreate client/.env.local:
VITE_API_URL=http://localhost:8000Start the dev server:
npm run dev
# App running at http://localhost:5173- Import the repo on vercel.com
- Set Root Directory to
client - Add environment variable:
VITE_API_URL = https://your-app.onrender.com - Deploy — Vercel auto-detects Vite
The repo includes a render.yaml Blueprint. On render.com:
- New → Blueprint → connect this repo
- Set two environment variables manually in the dashboard:
GEMINI_API_KEY— your Google AI Studio keyALLOWED_ORIGIN— your Vercel deployment URL
No Docker required — Render runs the FastAPI server natively.
Note: Render's free tier sleeps after 15 minutes of inactivity. The first request after sleep takes ~30 seconds. The frontend's 90-second timeout handles this gracefully.
RecruitLens is stateless by design. No resume data, job description text, or analysis results are stored, logged, or persisted anywhere. Every request is fully isolated and processed in memory only.
RecruitLens is decision support — not a hiring decision. All findings are based on peer-reviewed research on algorithmic bias in recruitment. Results should always be combined with human judgment.
MIT — see LICENSE.


