Inspiration
As a graduate software engineer, I faced challenges during my job search, particularly when preparing for technical interviews. Each interview required targeted preparation, but I often spent significant time searching for relevant questions that matched my level and the specific tech stack. Even more challenging was the lack of structured feedback. I had no clear way to evaluate my answers, identify my strengths and weaknesses, or understand how to improve. This gap inspired me to build IntervAI, an AI-powered interview simulator designed to generate realistic technical questions and provide structured evaluation, helping developers practice more efficiently and improve with every session.
What it does
IntervAI is an AI-powered technical interview simulator that helps developers practice and improve their interview skills in a realistic environment.
The application allows users to:
- Start a simulated technical interview tailored to a specific role, tech stack, and difficulty level
- Choose between different AI interviewer personas (e.g., strict FAANG-style, friendly startup, or junior-friendly mentor)
- Answer dynamically generated technical questions in real time
- Receive structured evaluation and feedback at the end of the interview
The system uses AI models to:
- Generate adaptive interview questions based on the user’s responses
- Analyze the full interview transcript
- Provide a detailed score, strengths, weaknesses, and improvement suggestions
All interview sessions and results are stored, allowing users to track their progress over time and continuously improve their performance.
How I Built It
IntervAI was built over 3 weeks as a solo project, from requirements analysis and cloud architecture design to covering every layer of the stack, from backend architecture to AI integration and frontend experience.
Backend - Spring Boot
The backbone of the application is a Spring Boot 3.3 REST API secured with Spring Security + JWT. The data layer uses JPA/Hibernate connected to a DigitalOcean Managed MySQL database, persisting users, interview sessions, Q&A history, and AI-generated feedback.
AI Integration - Spring AI + Gradient AI
Rather than calling the Gradient AI API manually with raw HTTP requests, I used Spring AI (spring-ai-openai-spring-boot-starter) as the abstraction layer. Since Gradient AI exposes an OpenAI-compatible endpoint, pointing Spring AI to https://inference.do-ai.run was all it took to unlock the full ChatClient API prompt templates, message history, and model switching included.
Two models handle two distinct responsibilities:
| Task | Model | Temperature |
|---|---|---|
| Question Generation | openai-gpt-oss-20b |
0.7 |
| Answers Evaluation | openai-gpt-oss-120b |
0.4 |
Prompt Engineering
A significant part of the development time went into designing the prompt system. Two dedicated builder classes handle this:
PersonaPromptBuilder : constructs a three-part system prompt for every question generation call:
- Persona block: the interviewer's identity, background, tone, and name.
- Context block: candidate's tech stack and seniority level.
- Instruction block: behavioral rules (one question at a time, no hints, no repetition, persona-specific difficulty)
EvaluationPromptBuilder: constructs the evaluation prompt sent at interview end, containing:
- The full interview transcript (all Q&A pairs).
- An explicit scoring guide anchored to the 0–100 scale.
- Anti-bias instructions to prevent the model from inventing weaknesses just to appear thorough.
- A strict JSON output format for reliable parsing.
Message History Strategy
Every question generation call reconstructs the full conversation history from the database and injects it as a message list into the AI call. This ensures the model never repeats a question and stays contextually aware across all 8 rounds of the session.
AI Personas
Three distinct interviewer personalities were engineered through prompt design alone no fine-tuning, no external tools:
- 👨💼 Alex: FAANG Strict: deep technical questions, challenges vague answers, demands precision.
- 🧑💻 Jordan: Friendly Startup CTO: scenario-based, pragmatic, values engineers who can ship.
- 🤵🏻♀️ Sam: Junior Friendly Mentor: focuses on fundamentals and encourages candidates who are just starting out.
Each persona produces measurably different questions, tone, and feedback style from the same underlying model.
Building the Frontend
The frontend was built with Angular and CSS, designed as a chat-based interface to make the interview feel natural and conversational. Key screens include:
- Dashboard: gives the user a quick overview of their activity: average score, highest score, total completed interviews, and the 3 most recent sessions at a glance
- Interviews page: lists all sessions (completed and in progress) with details like interviewer persona, tech stack, level, and score. Users can view full AI-generated feedback or delete a session from here
- Setup wizard: step-by-step selection of stack, interviewer persona, and level.
- Interview room: chat-based interface with a countdown timer, message history, and action buttons.
- Feedback screen: displays the full evaluation with score, strengths, weaknesses, and improvement suggestions per session.
Session Resilience
Interviews are time-bound to 30 minutes. If a user closes the tab mid-session, the backend preserves the full state.
On return, a GET /api/interviews/{id}/resume call restores the complete Q&A history and calculates the exact remaining time from endTime - now(), no client-side timer storage needed.
Deployment
The entire application runs on DigitalOcean App Platform, with the backend and frontend deployed as separate services. The managed database Mysql is isolated inside a VPC, accessible only to the App Platform services, never exposed to the public internet.
Challenges I ran into
Getting Spring AI to work correctly with Gradient AI took more time than expected. The default HTTP client was throwing a confusing auth error that wasn't obvious to debug. Also, model names had to be typed exactly as listed in the DO tier a small typo returns a vague 401 with no useful message.
The evaluation model kept being overly critical even for correct answers. It took several rounds of prompt adjustments adding a scoring guide and explicit instructions before the feedback felt fair and balanced.
Handling the case where a user closes the tab mid-interview was tricky. Storing the timer on the client doesn't persist after a page refresh, so I moved time tracking entirely to the backend, using a stored deadline and computing remaining time on each resume request.
Making all the decisions alone, architecture, prompts, backend, frontend within 3 weeks was challenging but a good learning experience.
Accomplishments that we're proud of
Honestly, the thing I'm most proud of is shipping a fully working product solo in 3 weeks, with backend, AI integration, prompt engineering, and frontend all done alone. Beyond that, seeing the three AI personas actually behave differently from each other using the same underlying model was satisfying, and getting the evaluation to feel fair rather than artificially harsh took real effort that paid off.
What we learned
This hackathon introduced me to Spring AI and DigitalOcean Gradient AI, which I hadn't used together before. The biggest takeaway was how much prompt engineering actually matters small wording changes in a system prompt can completely change the model's behavior and tone. I also learned that integrating AI into a real application goes beyond just calling an API; you have to think about consistency, fairness, session state, and how the AI fits into the overall user experience.
What's next for AI Technical Interview Simulator For S.Engineers - IntervAI
- Per-question feedback : instead of one evaluation at the end, give instant feedback after each answer
- Voice mode : let candidates speak their answers instead of typing, making it feel closer to a real interview
Built With
- angular.js
- app-platform
- css
- digitalocean
- gpt-ai-models
- gradientai
- java
- managed-database
- springai
- springboot
- springsecurity
- tailwindcss
- vpc

Log in or sign up for Devpost to join the conversation.