Project Case Study · Voice Agents · Hiring Infrastructure
Oasis
Oasis is a voice-agent platform for automated interview phone screens. It gives staffing and recruiting teams a way to screen every candidate before submission: recruiters create assessments in the dashboard, candidates complete token-gated online interviews with an AI interviewer, and the system turns the full session into scored, searchable evidence.
Next.js 14 · FastAPI · PostgreSQL · Redis · Celery · Deepgram · ElevenLabs · Anthropic Claude · Google Gemini · OpenAI embeddings · AWS ECS · Vercel
1. The idea
Hiring teams usually rely on resumes, quick recruiter calls, and self-reported skills before sending candidates to clients. Oasis treats the phone screen as a structured assessment instead: every role gets a custom interview flow, every candidate goes through the same calibrated experience, and every result is backed by transcripts, workspace evidence, score rationales, and integrity signals.
The product has two main surfaces. The recruiter dashboard is where teams author assessments, invite candidates, review sessions, re-run scoring, search the talent pool, and monitor analytics. The candidate OA is a no-account assessment link: the candidate opens a tokenized route, accepts consent, moves through voice-interactive sections, works in an embedded workspace when needed, and submits the session for evaluation.
2. System shape
Oasis is split so the browser never talks directly to the internal voice service. The Next.js frontend proxies authenticated recruiter requests to FastAPI with short-lived server tokens. FastAPI owns persistence, orchestration, REST endpoints, and candidate WebSockets. The agents service sits behind the API and hosts the STT, LLM, and TTS providers. A Celery worker consumes completed sessions from Redis and writes evaluations back to Postgres.
3. Assessment authoring
Recruiters can create a full assessment from a short brief: role title, sector, skills, desired section types, time constraints, and optional clarification answers. The generator asks Claude for a structured config, then validates every section against the backend schema before it can be saved. The natural-language modifier uses the same discipline: it returns a whole-field JSON patch, checks allowed fields, validates section shapes, and produces a recruiter-facing summary of what changed.
4. Candidate voice flow
The production OA uses a cascaded voice pipeline: browser audio streams over a WebSocket to the API, the API forwards it to agents, Deepgram transcribes, Claude or Gemini generates the interviewer turn, ElevenLabs synthesizes speech, and the browser plays the reply. The implementation preserves interim captions for live feedback while committing one stitched final transcript per candidate turn, which keeps the evaluator from seeing duplicated speech.
5. Scoring and evidence
When a session completes, the scoring worker prepares the evidence before the evaluator runs. It can attach audio features, tag turns, preserve workspace timelines, roll section-level scores back onto each result, compute benchmark keys, update percentiles, and optionally notify Slack. The evaluator itself is multi-pass: it pins evidence, scores rubric dimensions, then builds a consistency-aware final report with AI-use and anti-gaming context.
- Capture the session. Store transcript turns, workspace state, candidate metadata, section status, consent, and behavioral events.
- Prepare signals. Extract audio features when recordings exist, tag turns, summarize engagement, and assemble the rubric-specific evidence block.
- Evaluate. Produce dimension scores, a composite score, decision tier, briefed summary, full report, AI-utilization grade, and risk level.
- Operationalize. Update benchmarks, expose analytics/search, support manual re-runs, and write back to ATS workflows when configured.
6. Search and analytics
The search layer is built for recruiters asking questions in natural language, not just filtering a table. A query parser converts text into structured filters and score thresholds, SQL narrows the candidate pool, pgvector ranks semantic matches across evaluation and transcript embeddings, and an LLM re-ranker returns a final list with reasoning. That means searches like "strong healthcare BD reps with good judgment but weak closing" can combine role metadata, rubric scores, and transcript meaning.
7. ATS and operations
Oasis is designed to sit inside staffing workflows rather than become another isolated dashboard. The backend includes integrations for candidate link dispatch, batch invitations, Slack notifications, ATS simulation, Merge.dev-style flows, Bullhorn polling, stage writeback, custom-field slots, PDFs, audit packets, and admin monitoring for usage, ATS health, and scoring lifecycle. The production architecture separates the public Next.js app on Vercel from the API, agents, worker, data stores, secrets, and observability on AWS.
Why it matters
Oasis is an attempt to make high-signal interviewing scalable without flattening candidates into resumes or keyword screens. Voice captures judgment, communication, adaptation, and pressure in a way static forms usually miss; structured rubrics and evidence trails make those signals auditable instead of vibes-based. The technical pattern is a full-stack agent system: real-time interaction, durable evidence capture, async evaluation, retrieval over results, and integrations that push the output back into the workflow where recruiters already operate.