Talent Intelligence & Success Platform prototype. A dual-track web app that fuses DNLA psychometrics, AI-driven interview evaluation, and human coaching into a closed-loop assessment journey for candidates, institutes, recruiters, and coaches.
- Next.js 15 (App Router) + React 19
- Tailwind CSS 3
- Google Gemini API
gemini-2.5-flashfor resume parsing, interview turns, and Fit Score synthesisgemini-3.1-flash-live-previewfor Gemini Live token provisioning
- pnpm
pnpm install
cp .env.example .env.local # then set GEMINI_API_KEY
PORT=4040 pnpm devOpen http://localhost:4040.
Create a .env.local file in the project root (copy from below or create manually):
# Required: Gemini API key for all AI features
GEMINI_API_KEY=your_gemini_api_key_here
GEMINI_TEXT_MODEL=gemini-2.5-flash
GEMINI_LIVE_MODEL=gemini-3.1-flash-live-preview- Go to Google AI Studio
- Click "Create API Key"
- Copy the key (starts with
AIza...) - Paste it in your
.env.localfile as shown above
Note: This repo is Gemini-only. It does not require third-party LLM router or non-Google provider packages.
| Variable | Purpose |
|---|---|
GEMINI_API_KEY |
Required for resume parsing, interview questions, Fit Score synthesis, and Gemini Live token provisioning. Without it, AI endpoints return 503 instead of fake results. |
GEMINI_TEXT_MODEL |
Text/multimodal Gemini model. Defaults to gemini-2.5-flash. |
GEMINI_LIVE_MODEL |
Live API model. Defaults to gemini-3.1-flash-live-preview. |
The Phase 1 interview uses a text fallback and browser speech input while Gemini Live credentials are being provisioned. /api/gemini/live-token mints short-lived tokens for the Live API once GEMINI_API_KEY is present.
- Start session →
POST /api/interview/start - Send text answer →
POST /api/interview/voice - Receive the next question
- Repeat until
isDone: true - Get final results →
POST /api/interview/results
- Browser speech recognition can fill the text answer field.
- Server audio upload is intentionally disabled; use Gemini Live with ephemeral tokens for production audio sessions.
All /api/interview/* routes require studentId, role, and mode.
POST /api/interview— multi-turn interview question generation (text-based, existing)POST /api/interview/start— start a voice session, returnssessionIdPOST /api/interview/voice— receive a text answer and return the next questionPOST /api/gemini/live-token— mint a Gemini Live ephemeral tokenGET /api/interview/status?sessionId=...— get current session statePOST /api/interview/results— get final scores (only afterisDone: true)POST /api/parse-resume— PDF resume parsingPOST /api/generate-dnla— disabled until DNLA provider import is connectedPOST /api/generate-fit-score— Final Fit Score report synthesis
Candidate flow (no top nav, focused experience):
/onboarding— Step 01 Profile + Goal + Context (PDF resume parsed by Gemini 2.5 Flash)/student/[id]— Candidate workspace/student/[id]/interview/technical— Step 02 AI Technical Interview (Gemini 2.5 Flash)/student/[id]/dnla— Step 03 DNLA import placeholder/student/[id]/interview/behavioural— Step 04 AI Behavioural Interview (Gemini 2.5 Flash)/student/[id]/fit-score— Step 05 Fit Score Reveal (Gemini-generated, PRD §9 rubric)/student/[id]/development— Step 06 Development Pathway
Marketing and B2B surfaces (with top nav):
/— Landing (ClaimKeys-style sign-in split layout)/exam/[id]— Competitive Exam aspirant/institute/[id]— Placement / Exam institute dashboard/recruiter/[id]— Recruiter console with filtering/coach/[id]— Coach workspace/coach-ai— hidden Phase 2 route with unavailable screen
API:
POST /api/interview— multi-turn interview question generationPOST /api/parse-resume— PDF resume parsingPOST /api/generate-dnla— disabled until DNLA provider import is connectedPOST /api/generate-fit-score— Final Fit Score report synthesis
curl -X POST http://localhost:3000/api/interview/start \
-H "Content-Type: application/json" \
-d '{"studentId":"priya","role":"Full-stack Software Engineer","mode":"technical"}'
# → Returns: { "ok": true, "sessionId": "session_...", "mode": "technical" }curl -X POST http://localhost:3000/api/interview/voice \
-H "Content-Type: application/json" \
-d '{"sessionId":"<session_id>","text":"I built a full-stack app using React and Node.js"}'
# → Returns: { "ok": true, "nextQuestion": "...", "isDone": false }curl -X POST http://localhost:3000/api/gemini/live-token
# → Returns 503 without GEMINI_API_KEY, or a short-lived token when configuredcurl "http://localhost:3000/api/interview/status?sessionId=<session_id>"
# → Returns: { "ok": true, "turnIndex": 1, "transcript": [...], ... }Send enough responses until isDone: true, then:
curl -X POST http://localhost:3000/api/interview/results \
-H "Content-Type: application/json" \
-d '{"sessionId":"<session_id>"}'
# → Returns: { "ok": true, "generated": { "technical_score": 72, "fit_score": 70, ... } }lib/data.ts currently provides anonymized local workspace shells only. Production persistence, auth, and organization-specific records should be connected before real users are onboarded.
pnpm dev # next dev
pnpm build # next build
pnpm start # next start