A web-based AI interview coach that gives job seekers realistic behavioral interview practice with a voice-based AI avatar, structured feedback, and session analytics.
- Landing Page — Explains the product, shows how it works, captures waitlist signups
- Interview Setup — Pick your role (Software, Marketing, PM, General) and interview type (Behavioral, Technical-Lite)
- AI Interview — Voice-based (or text fallback) mock interview with "Alex Chen", an AI interviewer persona who asks 4 behavioral questions
- Instant Feedback — After each answer, get structured feedback on structure, clarity, and one specific improvement
- Session Summary — Overall score, strengths, key improvement area, question-by-question review
- Admin Dashboard — Password-protected analytics view showing sessions, completion rate, waitlist signups, and more
Required for assignment transparency.
| Tool / API | Purpose |
|---|---|
| Google Gemini 2.5 Flash | Generates interview questions, evaluates answers, provides structured feedback and session summaries |
| Web Speech API (browser-native) | Text-to-speech for the avatar's voice, speech recognition for user's spoken answers |
| Supabase (PostgreSQL) | Stores session tracking data, waitlist signups, and analytics events |
| Vercel Serverless Functions | Proxies LLM API calls (hides API key), handles tracking and analytics endpoints |
| Antigravity (AI coding assistant) | Assisted in building the full codebase |
- Node.js 18+
- A Google AI Studio API key (free)
- A Supabase account (free tier)
- A Vercel account (free tier)
- Go to supabase.com and create a new project
- Go to SQL Editor → New query
- Copy-paste the contents of
supabase-schema.sqland click Run - Go to Settings → API and copy:
Project URL→ this is yourSUPABASE_URLservice_rolekey → this is yourSUPABASE_SERVICE_ROLE_KEY. Keep it server-only; never add it to client code or aVITE_*variable.
- Go to Google AI Studio
- Create an API key
- This is your
GEMINI_API_KEY
- Push this repo to GitHub
- Go to vercel.com → New Project → Import your repo
- Add these Environment Variables:
| Variable | Value |
|---|---|
GEMINI_API_KEY |
Your Google AI Studio API key |
SUPABASE_URL |
Your Supabase project URL |
SUPABASE_SERVICE_ROLE_KEY |
Your Supabase service-role key (server-only; never expose it in the browser) |
ADMIN_KEY |
A long, private password for the admin dashboard |
- Click Deploy
- Your app is live! 🎉
- Visit your Vercel URL
- Try a full interview flow
- Check admin dashboard at
yoururl.vercel.app/#/admin
npm install
# Copy .env.example to .env, then fill in its values.
# Keep .env private; it is ignored by Git.
npm run devNote: The
/api/*serverless functions only work when deployed to Vercel. For local development, you can usevercel devinstead ofnpm run devto test the full stack:
npm i -g vercel
vercel dev├── api/ # Vercel serverless functions
│ ├── chat.js # LLM proxy (question generation, feedback, summary)
│ ├── track.js # Event tracking → Supabase
│ └── analytics.js # Admin analytics endpoint
├── src/
│ ├── components/
│ │ ├── Landing.jsx # Landing page
│ │ ├── InterviewSetup.jsx # Role/type selection
│ │ ├── InterviewSession.jsx # Core interview loop
│ │ ├── Avatar.jsx # SVG animated avatar
│ │ ├── SessionSummary.jsx # Post-interview summary
│ │ └── AdminDashboard.jsx # Analytics dashboard
│ ├── lib/
│ │ ├── speech.js # Web Speech API wrapper
│ │ ├── tracking.js # Client-side tracking
│ │ └── api.js # LLM API client
│ ├── App.jsx # Router
│ ├── main.jsx # Entry point
│ └── index.css # Design system
├── supabase-schema.sql # Database schema
├── vercel.json # Vercel routing config
└── README.md
PrepMate tracks the following metrics (stored in Supabase):
- Sessions started — How many users begin an interview
- Sessions completed — How many finish all questions
- Questions answered — Total interactions
- Repeat visitors — Users who come back for more practice
- Waitlist signups — Email captures
- Completion rate — Sessions completed / sessions started
Access the admin dashboard at /#/admin with your ADMIN_KEY. Analytics and waitlist signups show an error until Supabase is configured, rather than displaying mock data.
- ✅ AI disclosure visible on first load
- ✅ Never claims to be human
- ✅ Never guarantees job outcomes
- ✅ Only collects email (for waitlist) — no resumes, no sensitive data
- ✅ All interviews are clearly AI-simulated
MIT