Project Info
Inspiration
Preparing for technical interviews is a high-stress experience. While several AI practice platforms exist, we found they often feel robotic, lack conversational depth, or fail to provide the immediate, specific feedback that actually helps a developer improve. We were inspired to build jask to bridge that gap, creating a more realistic, responsive, and truly helpful practice partner that simulates the pressure and feedback of a live interview.
What it does
jask is an AI-powered technical interviewer that provides live, interactive feedback. A user joins a real-time video and audio session, just like a real remote interview. The AI-interviewer presents a coding challenge and as the user types their solution into the shared editor, jask analyzes their code live. It provides instant feedback on correctness, logic, efficiency, and style, allowing the user to correct their mistakes and explain their thought process in real-time.
How we built it
LiveKit: We used LiveKit's open-source platform to handle all real-time WebRTC communication. We also used Anthropic's Claude API for real-time code analysis and error checking. Every 10s when the user pauses for at least 10s, our backend sends a request to the anthropic agent to analyze the user's current code and gauge where the user may be stuck/confused. This agent sends the code analysis to the livekit agent which will then ask the user if they need help and give them assistance/feedback based on the analysis.
Challenges we ran into
Passing the user's keystrokes from the frontend editor, sending that code to our Node.js backend for analysis by the AI, and then streaming the AI's feedback back to the user via LiveKit's data channels—all in a split second—required careful state management. Overcoming the initial latency to make the feedback feel truly instantaneous was a major breakthrough.
Accomplishments we're proud of
Our biggest accomplishment is the end-to-end feedback loop. Integrating the Claude API calls with the seamless flow of conversation was the toughest part, as we needed to find the best triggers for generating this analysis in a way that is both descriptive and performant.
What we learned
This project was a deep dive into the architecture of real-time applications. We didn't just learn "how to use LiveKit"; we learned the core principles of WebRTC, how to effectively manage real-time data channels, and the complexities of building stateful, low-latency, and interactive web applications from the ground up.
What's next
Expand Question Types: Move beyond algorithm questions to include System Design, database, and behavioral interview modules. User Progress Dashboard: Implement user accounts and a dashboard to save interview history, track progress on specific topics, and identify areas for improvement. Advanced Feedback: Integrate feedback on non-technical aspects, such as communication clarity, speech patterns, and filler words, to provide holistic interview coaching.
Mock Interview App
A simple mock interview application that uses LiveKit for real-time voice conversations during technical interviews.
Features
- Landing Page: Submit a LeetCode-style coding question
- Live Interview: Real-time voice conversation with AI interviewer
- Code Editor: Write your solution while discussing your approach
- Simple Setup: Minimal dependencies, powered by LiveKit
Setup
1. Install Web App Dependencies
npm install
2. Configure LiveKit
- Sign up for a free account at LiveKit Cloud
- Create a new project
- Copy your API Key, API Secret, and WebSocket URL
- Create a
.env.localfile:
cp .env.example .env.local
- Edit
.env.localwith your LiveKit credentials:
LIVEKIT_API_KEY=your_api_key_here
LIVEKIT_API_SECRET=your_api_secret_here
NEXT_PUBLIC_LIVEKIT_URL=wss://your-project.livekit.cloud
3. Set Up the AI Agent (Python)
The AI interviewer runs as a separate Python service:
-
Install Python dependencies (requires Python 3.11+):
cd agent pip install -e . -
Configure API keys in
agent/.env.local:# Already has LiveKit credentials ASSEMBLYAI_API_KEY=your_assemblyai_key_here OPENAI_API_KEY=your_openai_key_here CARTESIA_API_KEY=your_cartesia_key_here -
Get API keys:
- AssemblyAI - Speech-to-text
- OpenAI - GPT-4 mini for conversation
- Cartesia - Text-to-speech
4. Run the Application
Terminal 1 - Web App:
npm run dev
Terminal 2 - AI Agent:
cd agent
python agent.py dev
Open http://localhost:3000 in your browser.
How It Works
-
Enter Question: On the landing page, enter a coding question (e.g., "Write a function to find the longest palindromic substring")
-
Start Interview: Click "Start Interview" to enter the interview room
-
Enable Microphone: Allow microphone access when prompted
-
Code & Talk: Write your solution in the code editor while discussing your approach out loud
-
AI Interaction: The LiveKit room enables voice communication (you'll need to implement the AI agent separately using LiveKit's Agent Framework)
Tech Stack
- Next.js 15 - React framework with App Router
- TypeScript - Type safety
- Tailwind CSS - Styling
- LiveKit - Real-time voice communication
- @livekit/components-react - Pre-built LiveKit UI components
Project Structure
jask/
├── app/
│ ├── api/
│ │ └── livekit-token/ # Token generation endpoint
│ ├── interview/ # Interview room page
│ ├── globals.css
│ ├── layout.tsx
│ └── page.tsx # Landing page
├── agent/
│ ├── agent.py # LiveKit AI agent
│ ├── pyproject.toml # Python dependencies
│ └── .env.local # Agent API keys
├── .env.example
├── .env.local
├── package.json
└── README.md
How the Agent Works
The AI interviewer (JASK) automatically joins interview rooms and:
- Greets the candidate and asks about their background
- Listens to the candidate's voice explanations
- Provides guidance and hints without giving away the solution
- Evaluates problem-solving skills and technical communication
- Uses AssemblyAI for speech recognition
- Uses OpenAI GPT-4 for intelligent responses
- Uses Cartesia for natural-sounding voice output
License
MIT
Analysis
View
Metric
- 2
- 2
- 1
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- CSSIn code
- JavaScriptIn code
- Next.jsIn code
- PythonIn code
- ReactIn code
- Tailwind CSSIn code
- TypeScriptIn code
7 of 7 appear in the indexed code.
AI coding agents
- Claude CodeConfig
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
18 KB
Source files
10
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
Neamal/jask
24 files · 728 KB · @ 84f94ff
Structure
Interface
4 files · 17%Screens, components and styles rendered to the user.
API & routing
1 file · 4%Request entry points: routes, handlers and controllers.
Application logic
4 files · 17%Domain rules, services and shared utilities.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- TypeScript67%
- Markdown20%
- Python12%
- JavaScript1%
- CSS0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
package.json
npm · 15- @livekit/components-react
- livekit-client
- livekit-server-sdk
- next
- react
- react-dom
- +9 more
agent/pyproject.toml
pypi · 3- livekit-agents[silero,turn-detector]
- livekit-plugins-noise-cancellation
- python-dotenv
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.