Deep Conversations, Automated Insights.
Open-source AI interview platform for voice, chat, and video.
Website Β Β·Β Video Intro Β Β·Β Docs Β Β·Β Deploy
Design an interview in plain language. Share a link. Aural's AI conducts the conversation β
asking questions, probing with follow-ups, and generating detailed analysis when the session ends.
Try Cloud β Β Β Β Self-Host Guide β
| π Voice, Chat & Video AI-driven interviews across all channels with real-time adaptation |
π§ AI Generation Describe goals in plain language β get a complete interview with questions and criteria |
π» Live Coding Monaco editor and Excalidraw whiteboard for technical assessments |
π Auto Reports Per-question scores, highlights, and improvement areas generated by AI |
| π‘ Anti-Cheating Tab monitoring, paste blocking, multi-screen detection, integrity logs |
π₯ Team Management Organizations, projects, and role-based access control |
π Multilingual English and Chinese with pluggable locale system |
π Pluggable LLMs OpenAI, Gemini, Moonshot Kimi, MiniMax β or any OpenAI-compatible API |
| π Quick Start Templates Pre-built interview templates for technical, behavioral, research, and more |
π£ Practice Interviews Voice-first rehearsal with context, AI feedback, suggested answers, and score tracking |
π Share & Preview Share interviews with a link and preview as a candidate before going live |
π Developer API Full REST API with OpenAPI spec for programmatic interview management |
| π Activity Tracking Session activity segments and multi-segment audio recordings |

Click to watch the 3-minute product demo on YouTube
Aural is an AI-powered interview platform that conducts structured interviews autonomously. You design an interview, share a link, and Aural's AI handles the conversation β asking questions, probing with follow-ups, and generating detailed analysis when the session is complete.
Describe what you want to learn in plain language. The AI generates a complete interview with questions, assessment criteria, and recommended settings β or build one manually with the flexible editor.
Customize questions by type: open-ended, single/multiple choice, live coding with Monaco editor, or whiteboard drawing with Excalidraw.
Fine-tune interview settings β AI personality, tone, follow-up depth, language, and communication channels (chat, voice, video). Control access with public shareable links or invite-only mode.
Turn any existing interview into a focused practice workspace. Add role context, rehearse by voice, get streamed coaching feedback after every answer, generate suggested answers from the JD/resume context, and track practice runs separately from real candidate sessions.
Add candidates one at a time, bulk-import from an Excel spreadsheet, or upload PDF resumes and let AI extract the details. Each candidate gets a unique invite link.
Add a candidate manually or extract from resume |
Batch-import from PDF resumes |
Candidates complete a pre-interview checklist (photo capture, microphone test, screen sharing) and then enter the live session.
Share a link and candidates join via chat, voice, or video. The AI adapts in real time β adjusting follow-up depth, tone, and direction based on responses.
Built-in coding and whiteboard modes for technical interviews:
Coding questions with Monaco editor |
Whiteboard questions with Excalidraw |
Enable anti-cheating mode to enforce camera, microphone, and screen sharing. The system monitors tab switches, blocks external paste, and detects multi-monitor setups β all logged in a per-session integrity report.
Real-time violation warning |
Per-session integrity log |
Every completed session produces an AI-generated report with per-question scores, key highlights, and areas for improvement.
Per-question evaluation |
Multi-dimensional assessment scores |
Track all your interviews, sessions, and candidates from a unified dashboard. Organize work across organizations and projects with role-based access.
- Technical hiring β coding and system design interviews with built-in editor and whiteboard
- User research β in-depth research interviews with AI follow-ups that surface deeper insights
- Behavioral interviews β voice-based conversations that feel natural and scale to hundreds of candidates
- Interview practice β candidates practice with AI feedback before their real interview
| Layer | Technology |
|---|---|
| Framework | Next.js 14 (App Router) |
| Language | TypeScript |
| Database | Supabase (PostgreSQL + Auth + Storage + RLS) |
| API | tRPC |
| AI / LLM | OpenAI, Google Gemini, Moonshot Kimi, MiniMax β pluggable provider system |
| Voice | WebSocket relay servers (Volcengine Doubao, Azure OpenAI Realtime) |
| UI | Tailwind CSS + shadcn/ui + Radix |
| Code Editor | Monaco Editor |
| Whiteboard | Excalidraw |
| Charts | Recharts |
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Browser β
β βββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββ β
β β Dashboard β β Interview β β Session UI β β
β β & Admin β β Builder β β (Chat / Voice / Video) β β
β βββββββ¬ββββββ ββββββββ¬ββββββββ ββββββββββββ¬ββββββββββββββ β
β β β β β
β βββββββββββββ¬ββββ βββββββββββββ β
β β β WebSocket β
ββββββββββββββββββββββΌββββββββββββββΌββββββββββββββββββββββββββββ
β tRPC / REST β
βΌ βΌ
ββββββββββββββββββββββββββ ββββββββββββββββββββ
β Next.js Server β β Voice Relay β
β β β Servers β
β ββββββββββββββββββββ β β ββββββββββββββ β
β β tRPC Routers β β β β Volcengine β β
β β (typed RPC API) β β β β Doubao S2S β β
β ββββββββββββββββββββ€ β β ββββββββββββββ€ β
β β REST API Routes β β β β Azure OAI β β
β β /api/ai/* β β β β Realtime β β
β β /api/voice/* β β β ββββββββββββββ β
β β /api/auth/* β β ββββββββββββββββββββ
β ββββββββββββββββββββ€ β
β β AI Provider β β
β β Registry β β
β β ββββββββββββββββ β β
β β βOAI Gemini β β β
β β βKimi MiniMax β β β
β β ββββββββββββββββ β β
β ββββββββββββββββββββ β
ββββββββββββββ¬ββββββββββββ
β
βΌ
ββββββββββββββββββββββββββ
β Supabase β
β ββββββββ ββββββββββββ β
β β Auth β βPostgreSQLβ β
β ββββββββ€ ββββββββββββ€ β
β β RLS β β Storage β β
β ββββββββ ββββββββββββ β
ββββββββββββββββββββββββββ
| Module | Location | Responsibility |
|---|---|---|
| App Router | src/app/ |
Pages and layouts organized into route groups: (auth) for login/register, (dashboard) for the main app, (docs) for documentation, i/ for public interview links, and practice/ for practice sessions. |
| tRPC Routers | src/server/routers/ |
Typed API layer handling interviews, sessions, analysis, organizations, projects, candidates, and access control. |
| REST API Routes | src/app/api/ |
Endpoints for AI operations (chat, generate, refine, summarize), practice feedback/hints/follow-ups, voice token/save/TTS, auth, session lifecycle (complete/leave), and file uploads. |
| Developer API (v1) | src/app/api/v1/ |
Full REST API for programmatic interview management β CRUD for interviews, questions, sessions, candidates, publish, and usage. Authenticated via dlv_ API keys with rate limiting. OpenAPI 3.1 spec at /api/v1/openapi.json. |
| AI Provider Registry | src/lib/ai/ |
Pluggable LLM system with a provider registry, per-task model selection, and prompt templates for interviewing, generation, and report summarization. |
| Voice Relay | server/ |
Standalone WebSocket servers that proxy audio between the browser and speech-to-speech APIs (Volcengine Doubao or Azure OpenAI Realtime). |
| Practice / Prep Module | src/app/(dashboard)/practices/, src/app/practice/, src/components/prep/, src/lib/prep/, src/server/routers/prep.ts |
Interview practice workspace with JD/resume context, voice or text answers, streamed feedback, suggested answers, follow-up coaching, practice attempt history, and resumable sessions. |
| Components | src/components/ |
React components split by domain β session/ (chat/voice/video UI, anti-cheating), interview/ (builder, question cards), auth/, layout/, and ui/ (shadcn primitives). |
| Supabase Layer | src/lib/supabase/ |
Client/server/admin helpers for database access, auth, and storage. Row-Level Security enforces data isolation per user and organization. |
You can use Aural as a managed cloud service or self-host the entire platform on your own infrastructure.
The fastest way to get started. No setup required β sign up and start creating interviews immediately.
Get started at aural-ai.com β
- Fully managed infrastructure
- Automatic updates and maintenance
- Built-in voice relay servers
- No LLM keys or Supabase setup needed
Run Aural on your own servers for full control over data, configuration, and customization.
- Node.js 18+ and npm
- Supabase project (cloud or local via
supabase start) - LLM API key β at least one of: OpenAI, Google Gemini, Kimi (Moonshot), or MiniMax
- Voice relay credentials β Volcengine Doubao (primary) or Azure OpenAI (backup), if you want voice interviews or voice practice
git clone https://github.com/1146345502/aural-oss.git
cd aural-oss
npm installOption A β Supabase Cloud
- Create a project at supabase.com
- Copy your project URL and keys
Option B β Local Supabase
Requires Docker running on your machine.
npx supabase startThis pulls the Supabase Docker images, starts all services, and automatically applies all migrations from supabase/migrations/. When it finishes, it prints connection details including the API keys (look for the Publishable and Secret keys).
- Local Supabase: migrations are applied automatically during
supabase startβ skip this step. - Supabase Cloud: push the migrations to your remote project:
npx supabase db pushOr apply migrations manually from supabase/migrations/.
cp .env.example .env.localEdit .env.local with your credentials. At minimum you need:
- Supabase URL and keys
- One LLM provider API key (
OPENAI_API_KEYrecommended for the main app;GEMINI_API_KEYrecommended for relay summarization and fallback generation) - Voice credentials only if you want voice interviews or voice practice (
DOUBAO_*for the recommended relay, orAZURE_OPENAI_*for the backup relay)
Local Supabase key mapping β map the keys from supabase status output to your .env.local:
| Supabase CLI output | .env.local variable |
|---|---|
Project URL (http://127.0.0.1:54321) |
NEXT_PUBLIC_SUPABASE_URL and SUPABASE_URL |
| Publishable key | NEXT_PUBLIC_SUPABASE_ANON_KEY and SUPABASE_ANON_KEY |
| Secret key | SUPABASE_SERVICE_ROLE_KEY |
| Database URL | DATABASE_URL |
# Start the Next.js dev server
npm run dev
# Start the primary voice relay (Volcengine Doubao)
npm run dev:voice
# Or start the backup voice relay (Azure OpenAI Realtime)
npm run dev:openai-voiceOpen http://localhost:3000/login to sign in, or http://localhost:3000/register to create a new account.
aural/
βββ src/
β βββ app/ # Next.js App Router pages and API routes
β β βββ (auth)/ # Login, register, password reset
β β βββ (dashboard)/ # Dashboard, interviews, practices, projects, settings
β β βββ (docs)/ # Documentation pages
β β βββ api/ # API routes (AI, auth, prep, voice, session, etc.)
β β β βββ v1/ # Developer REST API (interviews, sessions, etc.)
β β βββ i/ # Public interview and invite links
β β βββ practice/ # Public practice preview/session routes
β βββ components/ # React components
β β βββ auth/ # Auth forms
β β βββ interview/ # Interview builder, question cards
β β βββ prep/ # Practice context, feedback, hints, and voice input
β β βββ session/ # Voice/chat interface, anti-cheating
β β βββ layout/ # Header, sidebar
β β βββ ui/ # shadcn/ui primitives
β βββ hooks/ # Custom React hooks
β βββ lib/ # Shared utilities
β β βββ ai/ # LLM provider registry and implementations
β β βββ prep/ # Practice scoring, audio, feedback, and resume state helpers
β β βββ supabase/ # Supabase client/server/admin helpers
β β βββ voice/ # Voice relay types and utilities
β β βββ api-key-auth.ts # Developer API key validation
β β βββ api-rate-limit.ts # Per-key rate limiter
β β βββ interview-templates.ts # Quick start interview templates
β βββ server/ # tRPC routers
β βββ content/ # Documentation content
βββ server/ # Voice relay WebSocket servers
βββ supabase/ # Database migrations and config
βββ tests/ # Unit and functional tests
βββ public/ # Static assets
The practice module lets interview authors and candidates rehearse against an interview without creating real candidate sessions. It is intentionally part of the OSS app and does not depend on private billing or usage-control infrastructure.
| Area | Location | Notes |
|---|---|---|
| Dashboard list | src/app/(dashboard)/practices/ |
Cross-interview practice history and quick access. |
| Interview tab | src/app/(dashboard)/interviews/[id]/edit/prep/ |
Per-interview Practices tab with stats, filters, context, and launch controls. |
| Practice session | src/app/(dashboard)/interviews/[id]/prep/, src/app/practice/[id]/ |
Text or voice rehearsal flow with resumable attempts. |
| UI components | src/components/prep/ |
Context drawer, answer cards, streamed feedback, suggested answers, follow-ups, and voice input. |
| API layer | src/server/routers/prep.ts, src/app/api/prep/ |
tRPC data mutations plus streaming feedback, follow-up, hint, and leave endpoints. |
| Data model | supabase/migrations/004_interview_prep.sql |
Adds interview context fields plus prep_sessions and prep_attempts tables with RLS. |
Practice feedback uses the same LLM provider chain as interview generation. Voice practice also uses the voice relay and Doubao TTS settings from .env.local; answer audio is stored in the existing private recordings bucket.
Aural uses a pluggable LLM provider architecture. You need at least one provider configured. The system auto-selects the first available provider in this order: OpenAI > Gemini > Kimi > MiniMax.
| Provider | Env Variable | Default Model | Get API Key |
|---|---|---|---|
| OpenAI (recommended) | OPENAI_API_KEY |
gpt-4o-mini |
platform.openai.com/api-keys |
| Google Gemini | GEMINI_API_KEY |
gemini-3.1-flash-lite |
aistudio.google.com |
| Moonshot Kimi | KIMI_API_KEY |
moonshot-v1-8k |
platform.moonshot.cn |
| MiniMax | MINIMAX_API_KEY |
MiniMax-Text-01 |
platform.minimaxi.com |
You can also use any OpenAI-compatible API (e.g., local models via Ollama or LiteLLM) by setting OPENAI_BASE_URL.
Aural uses LLMs for several distinct tasks, each selecting the best available model:
| Task | What It Does | OpenAI Model | Gemini Model | Kimi Model | MiniMax Model |
|---|---|---|---|---|---|
| Chat interviewing | Powers the AI interviewer during live sessions β asks questions, generates follow-ups, adapts tone | gpt-4o-mini |
gemini-3.1-flash-lite |
moonshot-v1-8k |
MiniMax-Text-01 |
| Interview generation | Generates a complete interview (questions, criteria, settings) from a plain-language description | gpt-4o-mini |
gemini-3.1-flash-lite |
moonshot-v1-8k |
MiniMax-M2.1-lightning |
| Question refinement | Improves or refines existing interview questions based on feedback | gpt-4o-mini |
gemini-3.1-flash-lite |
moonshot-v1-8k |
MiniMax-M2.1-lightning |
| Practice coaching | Scores practice answers, streams feedback, generates follow-up coaching, and suggests improved answers | gpt-4o-mini |
gemini-3.1-flash-lite |
moonshot-v1-8k |
MiniMax-M2.1-lightning |
| Report & analysis | Generates post-interview reports with per-question scores, highlights, and improvement areas | gpt-4o |
gemini-3.1-flash-lite |
kimi-k2.5 |
MiniMax-M2.1-lightning |
Report generation uses a higher-capability model when OpenAI or Kimi is configured because it requires synthesizing an entire conversation into structured analysis. Chat interviewing uses each provider's default model unless overridden per-interview in the settings. Interview generation and practice coaching use a fallback chain, so configuring more than one provider improves resilience.
Aural supports real-time AI voice interviews via WebSocket relay servers. Two relay implementations are provided.
Recommendation: We strongly recommend using Volcengine Doubao as your primary voice relay. It delivers a noticeably better interview experience than the OpenAI Realtime model β lower latency, more natural speech-to-speech flow, superior Chinese language support, and built-in server-side auto-reconnect for reliability. The OpenAI relay is provided as a backup for environments where Volcengine credentials are unavailable.
The recommended voice relay for production use. It provides full-featured Speech-to-Speech capabilities with per-question interview flow, LLM-powered context summarization, native Chinese language support, and automatic server-side reconnection (up to 3 retry attempts with backoff) for resilient voice sessions.
npm run dev:voice # starts on port 8766Required env vars: either DOUBAO_APP_ID + DOUBAO_ACCESS_TOKEN, or DOUBAO_API_KEY.
Recommended supporting env vars:
GEMINI_API_KEYfor the relay LLM default (gemini-3.1-flash-lite)RELAY_LLM_PROVIDER=geminiRELAY_LLM_MODEL=gemini-3.1-flash-liteNEXT_PUBLIC_VOICE_RELAY_PRIMARY=voiceDOUBAO_ASR_RESOURCE_ID=volc.seedasr.sauc.durationDOUBAO_TTS_RESOURCE_ID=seed-tts-2.0DOUBAO_TTS_PCM_SAMPLE_LAYOUT=int16le
An alternative relay using Azure OpenAI's Realtime API (gpt-realtime-1.5 by default). Use this when Volcengine credentials are unavailable or for English-only deployments. Note that the OpenAI relay may have higher latency and less natural conversational flow compared to Volcengine.
npm run dev:openai-voice # starts on port 8767Required env vars: AZURE_OPENAI_ENDPOINT, AZURE_OPENAI_API_KEY, AZURE_OPENAI_DEPLOYMENT
Tip: You can run both relays simultaneously. The frontend uses
NEXT_PUBLIC_VOICE_RELAY_PRIMARYto choose the first relay and automatically falls back to the alternate relay if the primary cannot connect.
Aural includes a full REST API for programmatic access to interviews, questions, sessions, and candidates. Use it to integrate Aural into your existing workflows, automate interview creation, or build custom integrations.
All API requests require a developer API key in the Authorization header:
Authorization: Bearer dlv_your_key_here
Create and manage API keys from Settings > API Keys in the dashboard.
| Method | Path | Description |
|---|---|---|
GET |
/api/v1/interviews |
List interviews (paginated) |
POST |
/api/v1/interviews |
Create interview |
GET |
/api/v1/interviews/{id} |
Get interview with questions |
PATCH |
/api/v1/interviews/{id} |
Update interview |
DELETE |
/api/v1/interviews/{id} |
Archive interview |
POST |
/api/v1/interviews/{id}/publish |
Publish interview (shareable link) |
GET/POST |
/api/v1/interviews/{id}/questions |
List or add questions |
PATCH/DELETE |
/api/v1/questions/{id} |
Update or delete a question |
GET |
/api/v1/interviews/{id}/sessions |
List sessions (paginated) |
GET |
/api/v1/sessions/{id} |
Get session with transcript |
GET/POST |
/api/v1/interviews/{id}/candidates |
List or create candidates |
GET |
/api/v1/usage |
Current usage snapshot |
GET |
/api/v1/openapi.json |
OpenAPI 3.1 specification |
API requests are rate-limited to 60 requests per minute per API key. Exceeded requests receive a 429 response with Retry-After header.
# Create an interview
curl -X POST http://localhost:3000/api/v1/interviews \
-H "Authorization: Bearer dlv_your_key" \
-H "Content-Type: application/json" \
-d '{"title": "Backend Engineer Screen", "voiceEnabled": true}'
# Add questions
curl -X POST http://localhost:3000/api/v1/interviews/{id}/questions \
-H "Authorization: Bearer dlv_your_key" \
-H "Content-Type: application/json" \
-d '[{"text": "Describe your experience with distributed systems"}]'
# Publish and get shareable link
curl -X POST http://localhost:3000/api/v1/interviews/{id}/publish \
-H "Authorization: Bearer dlv_your_key"| Command | Description |
|---|---|
npm run dev |
Start Next.js dev server |
npm run build |
Build for production |
npm run start |
Start production server |
npm run lint |
Run ESLint |
npm run test:web |
Run web tests |
npm run test:functional |
Run Playwright-backed functional browser tests |
npm run dev:voice |
Start primary voice relay (Volcengine Doubao) |
npm run dev:openai-voice |
Start backup voice relay (Azure OpenAI) |
npm run db:types |
Regenerate Supabase TypeScript types |
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License β see the LICENSE file for details.
Built by AuraTerra Nexus β Every voice heard, every insight captured.



















