Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Tooom123/Hackathon_HrFlow.AI_2026-FirstRound

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

59 Commits
59 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FirstRound

FirstRound is an AI-powered technical pre-screening platform built during the HrFlow.AI 2026 hackathon.

The product covers the full early interview loop:

  • a recruiter creates a job from a raw job description
  • HrFlow.ai parses and indexes the job
  • the backend generates interview questions with a local LLM
  • a recruiter shares a candidate link
  • a candidate uploads a CV and completes a voice interview
  • the recruiter reviews the transcript, answer-by-answer scoring, and CV/job matching

What The Project Does

FirstRound has two user journeys.

Recruiter flow

  1. Paste a job description.
  2. Generate and validate interview questions.
  3. Create a session and share a candidate link.
  4. Review candidate profiles, matching score, transcript, and per-question evaluation.

Candidate flow

  1. Open the shared session link.
  2. Upload a CV as PDF.
  3. Allow microphone access.
  4. Complete the AI-led interview in the browser.

Main Features

  • Job parsing and indexing with HrFlow.ai
  • Candidate CV upload and profile parsing with HrFlow.ai
  • Interview question generation with a local Ollama model
  • Real-time voice interview over WebSocket
  • Speech-to-text with mlx-whisper
  • Voice activity detection with silero-vad
  • Text-to-speech with edge-tts
  • Recruiter dashboard to inspect results

Tech Stack

Layer Technology
Frontend React, TypeScript, Vite, Tailwind CSS
Backend FastAPI, WebSocket, Pydantic Settings
Job and CV parsing HrFlow.ai
LLM Ollama
STT mlx-whisper
VAD silero-vad
TTS edge-tts

Repository Structure

.
├── backend/
│   ├── app/
│   │   ├── api/v1/endpoints/   # REST and WebSocket endpoints
│   │   ├── core/               # app config and model loading
│   │   ├── dependencies/       # FastAPI dependencies
│   │   ├── schemas/            # Pydantic schemas
│   │   └── services/           # HrFlow, interview orchestration, AI services
│   ├── requirements.txt
│   └── scripts/
├── frontend/
│   ├── src/
│   │   ├── api/                # frontend API client
│   │   ├── components/
│   │   ├── pages/              # recruiter and candidate pages
│   │   └── styles/
│   ├── package.json
│   └── public/
└── docs/
    └── architecture.md

Runtime Architecture

For the live interview, audio is streamed from the browser to the backend through a WebSocket pipeline:

Candidate microphone
  -> VAD (detect end of speech)
  -> STT (transcribe spoken answer)
  -> LLM (score answer, evaluate, decide next question or follow-up)
  -> TTS (synthesize spoken response)
  -> audio streamed back to the browser

The project currently stores interview sessions in memory in the FastAPI process. That means:

  • sessions are lost when the backend restarts
  • this setup is suitable for local demo/hackathon usage
  • a database or Redis would be needed for production-grade persistence

Prerequisites

You need the following installed locally:

  • Python 3.12+
  • Node.js 18+
  • npm
  • Ollama installed locally
  • a working HrFlow.ai account
  • a HrFlow.ai API key
  • a HrFlow.ai board key for jobs
  • a HrFlow.ai source key for profiles

Clone The Repository

git clone git@github.com:Tooom123/Hackathon_HrFlow.AI_2026-FirstRound.git firstround
cd firstround

Environment Variables

The backend reads its configuration from backend/.env or .env at the repository root.

Create backend/.env with the following values:

API_KEY=your_hrflow_api_key
USER_EMAIL=your_hrflow_account_email
HRFLOW_BOARD_KEY=your_board_key
HRFLOW_SOURCE_KEY=your_source_key

FRONTEND_BASE_URL=http://localhost:5173

OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=llama3.2
OLLAMA_TEMPERATURE=0.3

WHISPER_MODEL=mlx-community/whisper-large-v3-turbo
WHISPER_LANGUAGE=fr

VAD_THRESHOLD=0.5
VAD_MIN_SILENCE_MS=700
VAD_MIN_SPEECH_MS=250
VAD_INPUT_SAMPLE_RATE=24000

TTS_VOICE=fr-FR-HenriNeural
TTS_SAMPLE_RATE=24000
TTS_CHUNK_SIZE=4096

Variable Reference

Variable Required Default Purpose
API_KEY yes none HrFlow.ai API key
USER_EMAIL yes none HrFlow.ai user email
HRFLOW_BOARD_KEY yes empty board used to index jobs
HRFLOW_SOURCE_KEY yes empty source used to index profiles
FRONTEND_BASE_URL no http://localhost:5173 used to generate candidate links
OLLAMA_BASE_URL no http://localhost:11434 Ollama server URL
OLLAMA_MODEL no llama3.2 local model name used for question generation and interview evaluation
WHISPER_MODEL no mlx-community/whisper-large-v3-turbo speech-to-text model
WHISPER_LANGUAGE no fr transcription language
TTS_VOICE no fr-FR-HenriNeural generated voice used during interview

The frontend optionally supports:

VITE_API_BASE=http://localhost:8000

If you do not define it, the frontend defaults to http://localhost:8000.

How To Run The Project Locally

1. Start Ollama

Make sure Ollama is installed and running, then pull the model used by the backend:

ollama pull llama3.2

If you want to use another local model, update OLLAMA_MODEL in backend/.env.

2. Start The Backend

From the repository root:

cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload

The backend will be available at:

  • API root: http://localhost:8000
  • healthcheck: http://localhost:8000/health
  • Swagger UI: http://localhost:8000/docs

3. Start The Frontend

In another terminal:

cd frontend
npm install
npm run dev

The frontend will be available at:

  • app: http://localhost:5173

Recommended Local Startup Order

Use this order to avoid most local issues:

  1. Start Ollama.
  2. Start the backend.
  3. Check http://localhost:8000/health.
  4. Start the frontend.
  5. Open http://localhost:5173.

How To Use The App Locally

Recruiter Demo

  1. Open http://localhost:5173.
  2. Create a new interview flow from a job description.
  3. Review or edit the generated questions.
  4. Generate a candidate session link.
  5. Copy the candidate link and open it in another browser tab or window.

Candidate Demo

  1. Open the session link.
  2. Upload a PDF CV.
  3. Allow microphone access in the browser.
  4. Complete the voice interview.

Review Results

After the candidate finishes, the recruiter side can inspect:

  • parsed candidate profile
  • job/profile matching score
  • transcript of answers
  • per-question score and evaluation
  • overall session score

Main API Endpoints

Health

  • GET /health: basic health check

HrFlow / jobs

  • GET /hrflow/ping: test HrFlow.ai connectivity
  • GET /hrflow/jobs: list indexed jobs
  • POST /hrflow/jobs/parse: parse raw job text
  • POST /hrflow/jobs/setup: parse, index, and generate interview questions
  • PUT /hrflow/jobs/questions: save validated questions to job metadata
  • POST /hrflow/jobs/{job_key}/scoring: score profiles against a job

Profiles

  • POST /profiles/apply?job_key=...: upload a candidate CV
  • GET /profiles/{reference}/status: poll CV parsing status
  • GET /profiles/job/{job_key}: list profiles attached to a job

Interview

  • GET /interview/sessions?job_key=...: retrieve waiting session for a job
  • POST /interview/sessions?job_key=...: create a session
  • POST /interview/sessions/{session_id}/join?profile_reference=...: attach candidate to session
  • GET /interview/sessions/{session_id}: get session status and results
  • WS /interview/ws/{session_id}: live interview socket

Local Development Notes

  • CORS is configured for http://localhost:5173.
  • Candidate CV upload only accepts PDF files.
  • Maximum CV file size is 10 MB.
  • The browser must be allowed to access the microphone.
  • The frontend expects the backend on port 8000 unless VITE_API_BASE is overridden.

Troubleshooting

Backend does not start

Check:

  • your virtual environment is activated
  • dependencies were installed with pip install -r requirements.txt
  • backend/.env exists and contains valid HrFlow.ai credentials

HrFlow requests fail

Check:

  • API_KEY is valid
  • USER_EMAIL matches the HrFlow.ai account
  • HRFLOW_BOARD_KEY and HRFLOW_SOURCE_KEY point to existing resources
  • GET /hrflow/ping returns a successful response

Ollama errors or missing model

Check:

  • Ollama is running locally
  • the configured model exists locally
  • OLLAMA_BASE_URL matches the local Ollama server

Useful command:

ollama list

Candidate cannot start interview

Check:

  • the backend is running
  • the session exists and has not been lost after a backend restart
  • the browser granted microphone access
  • the candidate uploaded a valid PDF file

No audio or broken interview flow

Check:

  • browser microphone permissions
  • local audio output
  • WebSocket connectivity to ws://localhost:8000/interview/ws/<session_id>
  • model loading logs in the backend terminal

Project Limits

This repository is currently optimized for demo/local usage rather than production. Important limits:

  • no persistent storage for sessions
  • no authentication layer
  • no deployment configuration
  • no job queue for long-running AI tasks
  • no production hardening around retries, observability, or scaling

Additional Documentation

Quick Start

If you just want the shortest path to a local demo:

# terminal 1
ollama pull llama3.2

# terminal 2
cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload

# terminal 3
cd frontend
npm install
npm run dev

Then open http://localhost:5173.

About

B2B SaaS for AI-driven technical interviews and automated candidate evaluation

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Morty Proxy This is a proxified and sanitized view of the page, visit original site.