Skip to content

Repository files navigation

ELSA Speech Scorer

A full-stack web application for scoring candidate speech using the ELSA API. Supports two flows: a Recruiter Flow for admin-managed candidates and an Applicant Flow for self-submitted recordings.


Features

Recruiter Flow

  • Secure login with ELSA credentials (Staging / Production environments)
  • Create and manage candidate profiles
  • Upload meeting transcripts and recordings
  • Extract candidate speech segments using FFmpeg
  • Score audio via the ELSA score_audio_plus_elsa API
  • View detailed score breakdowns (EPS, fluency, pronunciation, integrity)

Applicant Flow

  • Public /apply page — no login required
  • In-browser audio recording (30 seconds minimum, 1 minute maximum)
  • Live waveform visualiser and countdown timer
  • Cycling prompts to guide the applicant
  • Submissions automatically linked to a single profile by email
  • Submission timestamps recorded for each entry

Candidate Dashboard

  • Sortable, filterable table view of all candidates
  • Filter by name, email, source (recruiter/applicant), EPS score range, and date
  • Colour-coded EPS scores
  • Click any row to view full candidate and meeting details

Tech Stack

LayerTechnology
FrontendReact 18 + TypeScript + Vite
BackendNode.js + Express
Audio extractionFFmpeg (via nix)
StorageJSON file (data/candidates.json) + local uploads/
Speech scoringELSA score_audio_plus_elsa API

Project Structure

├── client/ # React frontend (Vite)
│ └── src/
│ ├── pages/
│ │ ├── ApplyPage.tsx # Public applicant recording flow
│ │ ├── CandidatesPage.tsx # Recruiter candidate table + filters
│ │ ├── MeetingDetailPage.tsx
│ │ └── LoginPage.tsx
│ └── components/
├── server/ # Express backend
│ ├── index.js
│ └── routes/
│ ├── apply.js # Public POST /api/apply
│ ├── candidates.js # CRUD for candidates
│ └── scoring.js # FFmpeg extraction + ELSA scoring
├── data/
│ └── candidates.json # Persistent candidate data
└── uploads/ # Uploaded audio/transcript files

Setup

Prerequisites

  • Node.js 18+
  • FFmpeg (required for recruiter flow scoring)

Install & Run

# Install all dependencies
npm run build
# Start the server
npm start

The backend runs on port 3000, the frontend dev server on port 5173.

Environment

The app runs in two modes selectable at login:

  • Staging — connects to ELSA staging API
  • Production — connects to ELSA production API

API Endpoints

MethodPathAuthDescription
POST/api/auth/loginPublicLogin with ELSA credentials
GET/api/candidatesRequiredList all candidates
POST/api/candidatesRequiredCreate a candidate
GET/api/candidates/:idRequiredGet candidate + meetings
DELETE/api/candidates/:idRequiredDelete a candidate
POST/api/candidates/:id/meetingsRequiredAdd a meeting
POST/api/candidates/:id/meetings/:mId/uploadRequiredUpload transcript/recording
POST/api/candidates/:id/meetings/:mId/scoreRequiredScore a meeting
POST/api/applyPublicSubmit an applicant recording

Applicant Recording Rules

Elapsed timeAvailable actions
0 – 29 secondsStop & Re-record only
30 – 59 secondsRe-record or Stop & Submit
60 secondsAuto-stops → goes to review

Deployment

The app is configured for deployment on a VM (not serverless) because:

  • FFmpeg must be available at runtime
  • data/candidates.json and uploads/ require persistent disk storage
npm run build # installs deps + builds frontend
npm start # runs server/index.js

About

A full-stack web application for scoring candidate speech using the ELSA API. Supports two flows: a Recruiter Flow for admin-managed candidates and an Applicant Flow for self-submitted recordings.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages