How himavarshithreddy/interviewos works
1. Overall shape
- InterviewOS is a two-process application: a React/Vite frontend in the repo root and a Node.js backend under server/.
- The app is centered on one workflow: upload resume → configure panelists → run a live interview → analyze performance → render a report/dashboard.
2. Frontend composition
- The main UI is split into feature components in components/: ResumeUploader, PanelConfiguration, LiveInterview, and Dashboard.
- App.tsx is the top-level composition point, while index.tsx and index.html bootstrap the browser app.
- Supporting UI robustness comes from src/components/ErrorBoundary.tsx.
3. Client-side state and interaction layer
- src/services/apiClient.ts is the browser-to-server boundary for REST calls.
- src/hooks/useVAD.ts and src/hooks/useVideoAnalysis.ts handle real-time client behavior: voice activity detection and periodic video capture/upload for analysis.
- src/utils/sessionStorage.ts suggests session persistence for interview state, while src/utils/reportDownload.ts supports exporting the final report.
4. Live interview data path
- The live interview is not just request/response; it is a streaming browser session.
- Browser audio is processed with public/worklets/audio-processor.js and utilities in utils/audioUtils.ts, then used for low-latency voice interaction.
- The browser connects directly to Gemini Live for conversational audio, while also sending transcript/session signals to the backend orchestration channel.
5. Backend entrypoint and boundaries
- server/src/index.ts is the backend bootstrap for the HTTP API and WebSocket server.
- The backend is responsible for resume parsing, panelist generation, analysis, and final reporting.
- It is intentionally not in the media path for the live audio stream; that path stays mostly browser-to-Gemini for latency reasons.
6. Backend service layer
- server/src/services/geminiService.ts is the core Gemini integration used for structured generation and evaluation.
- interviewOrchestrator.ts maintains interview state, topic coverage, depth progression, and panel flow.
- emotionAnalyzer.ts, presentationCoach.ts, and industrySpecialist.ts provide specialized analysis and domain-specific question/evaluation logic.
7. WebSocket orchestration
- server/src/websocket/liveInterviewHandler.ts hosts the live interview WebSocket channel.
- This socket is for orchestration metadata, not audio transport: transcript snapshots, next-question hints, and interview coordination.
- That separation is important architecturally because it keeps the low-latency media stream independent from the control plane.
8. Evaluation and reporting flow
- The final assessment is generated server-side from interview transcript/session data, with Gemini used for deep reasoning and scoring.
- The report aggregates technical, communication, culture-fit, and panel feedback signals, then the dashboard renders the outcome.
- The repository’s README indicates body-language and some temporal/voice analytics are partially sample-driven when API limits apply.
9. Shared types and constants
- types.ts defines shared domain shapes used across UI and server-facing data.
- src/constants/index.ts centralizes fixed values such as categories, labels, and likely scoring or config defaults.
- This shared model is key for keeping resume parsing, panel generation, and report rendering aligned.
10. Deployment and runtime
- The app is built for a browser frontend plus a long-running Node backend.
- deploy/nginx.conf, deploy/deploy.sh, and deploy/oracle-setup.sh show that production deployment is expected to be reverse-proxied and hosted on a Linux VM or similar environment.
- server/.env.example indicates external API keys/configuration are injected at runtime, especially for Gemini access.
11. What to draw as the main boundaries
- Draw three primary boxes: Browser UI, Backend API/WebSocket orchestration, and Gemini external services.
- Inside the browser, separate static UI, live media processing, and analysis/report UI.
- Inside the backend, separate HTTP analysis/report endpoints from the WebSocket orchestration service and the Gemini-powered service layer.
12. Most important architectural idea
- The repo combines two very different interaction modes:
- a real-time conversational path optimized for latency and user experience, and
- a server-mediated evaluation path optimized for structured analysis and reporting.
- That split is the core architectural decision behind the project.
Main entry points: App.tsx App shell · LiveInterview.tsx Live interview · interviewOrchestrator.ts Interview flow · index.ts Server entry
Components 24
Browser UI
React/Vite client that drives interview flow and displays outcomes.
- App shell · Top-level client composition for the interview experience.
App.tsx - Browser entry · Browser startup entry point for mounting the app.
index.tsx - Resume upload · Initial flow for uploading candidate resume data.
components/ResumeUploader.tsx - Panel setup · Configures interview panelists and interview settings.
components/PanelConfiguration.tsx - Live interview · Runs the active conversational interview experience.
components/LiveInterview.tsx - Dashboard · Displays the final interview report and analysis summary.
components/Dashboard.tsx - Error boundary · Catches client rendering failures and protects the app shell.
src/components/ErrorBoundary.tsx - API client · Browser-to-server request layer for structured backend calls.
src/services/apiClient.ts - Voice activity · Client-side voice activity detection for live session behavior.
src/hooks/useVAD.ts - Video analysis · Periodic capture and upload path for visual analysis signals.
src/hooks/useVideoAnalysis.ts - Session state · Persists interview state in browser storage across the session.
src/utils/sessionStorage.ts - Report export · Exports the final report from the browser UI.
src/utils/reportDownload.ts - Audio worklet · Low-latency browser audio processing for the live interview stream.
public/worklets/audio-processor.js - Audio utils · Shared browser audio helpers used by the live media path.
utils/audioUtils.ts
Backend Orchestration
Node API, WebSocket control plane, and Gemini-powered analysis services.
- Server entry · Starts the backend HTTP API and WebSocket server.
server/src/index.ts - Live socket · Orchestrates live interview metadata and coordination messages.
server/src/websocket/liveInterviewHandler.ts - Interview flow · Tracks interview state, topic depth, and panel progression.
server/src/services/interviewOrchestrator.ts - Gemini service · Core Gemini access for generation, reasoning, and structured scoring.
server/src/services/geminiService.ts - Emotion analysis · Specialized emotional and behavioral signal analysis.
server/src/services/emotionAnalyzer.ts - Presentation coach · Evaluates delivery and presentation quality.
server/src/services/presentationCoach.ts - Industry specialist · Provides domain-specific panel questions and evaluation logic.
server/src/services/industrySpecialist.ts
Deploy
Runtime and deployment assets for hosting behind a reverse proxy.
- Nginx config · Production proxy configuration for serving the app and backend.
deploy/nginx.conf - Deploy script · Deployment automation for provisioning and rollout.
deploy/deploy.sh - Oracle setup · Host setup script for the target Linux VM environment.
deploy/oracle-setup.sh
Connections 27
- Browser entry → App shell: mounts · Browser bootstrap mounts the React application.
- App shell → Resume upload: renders · App shell composes the resume upload flow.
- App shell → Panel setup: renders · App shell composes panel configuration.
- App shell → Live interview: renders · App shell composes the live interview experience.
- App shell → Dashboard: renders · App shell composes the report dashboard.
- App shell → Error boundary: wraps · Client app is protected by an error boundary.
- Resume upload → API client: uploads · Resume data is sent to backend services.
- Panel setup → API client: configures · Panel settings flow through the API client.
- Live interview → Voice activity: detects speech · Live interview uses voice activity detection.
- Live interview → Video analysis: captures video · Live interview periodically captures visual signals.
- Live interview → Session state: persists · Session state is stored locally during the interview.
- Live interview → Audio worklet: processes audio · Browser audio is processed in a worklet for low latency.
- Audio worklet → Audio utils: uses · The worklet relies on shared audio helpers.
- Live interview → Live socket: orchestrates · Live interview uses WebSocket control messages.
- Dashboard → Report export: exports · Dashboard supports report download.
- API client → Server entry: calls · REST traffic reaches the backend server.
- Server entry → Live socket: hosts · Backend entrypoint exposes the live interview socket.
- Server entry → Interview flow: routes · Backend routes interview analysis and coordination.
- Interview flow → Gemini service: invokes · Flow orchestration delegates reasoning to Gemini.
- Interview flow → Emotion analysis: evaluates · Orchestrator incorporates emotional signal analysis.
- Interview flow → Presentation coach: evaluates · Orchestrator incorporates presentation feedback.
- Interview flow → Industry specialist: specializes · Orchestrator can branch into domain-specific evaluation.
- Live socket → Interview flow: syncs state · Socket exchanges interview metadata with orchestration.
- Dashboard → API client: fetches report · Dashboard retrieves structured report data from backend.
- Deploy script → Nginx config: configures · Deployment script installs or updates the proxy setup.
- Deploy script → Oracle setup: prepares · Deployment targets an Oracle-hosted Linux environment.
- Server entry → Gemini service: uses · Backend services rely on Gemini credentials at runtime.