AI-powered study and voice interview preparation platform.
PrepStudio takes a topic and a deadline, builds a personalized day-by-day study curriculum, generates deep technical reading material, teaches it to you through an interactive ElevenLabs voice tutor, runs a full voice interview conducted by an AI interviewer, and gives you a detailed performance report — all saved to your account.
Most study tools are passive. PrepStudio is not.
Two ElevenLabs Conversational AI agents are at the core of the experience:
- Nova — an AI tutor who teaches each topic to you by voice. She doesn't read the article aloud; she explains it with analogies, examples, and real-time Q&A. You can interrupt her mid-lesson and ask anything.
- Alex — an AI interviewer who conducts a full technical voice interview based on your study plan. He asks questions one at a time, listens to your spoken answers, and when the interview is done, Gemini evaluates your complete transcript and generates a personalised score report.
Both agents are created dynamically per session with a custom system prompt injected at runtime — personalised to exactly what you are studying.
Tell PrepStudio what you want to learn and how many days you have. Gemini 2.5 Flash builds a complete day-by-day curriculum — each day broken down into specific topics with balanced, realistic session lengths. Your plan is saved to your account and accessible every time you return.
Open any topic and receive a full article-quality explanation: rich text with headings, code examples, analogies, and practical walkthroughs — generated by Gemini and permanently cached to your profile so the second load is instant.
Click Audio Lesson on any topic page. PrepStudio creates a live ElevenLabs Conversational AI agent — Nova — with the full topic content as her context. She teaches the material conversationally, adapts to your questions, and wraps up with three key takeaways. The session is fully bidirectional: speak to her at any time.
Click Start Voice Interview from your plan. The backend generates eight technical questions using Gemini, then creates a second ElevenLabs agent — Alex — who conducts the interview entirely by voice. When the interview concludes, the full conversation transcript is evaluated by Gemini, which scores every answer and returns:
- Overall score and grade
- Strengths and improvement areas
- Per-question breakdown with individual scores and assessments
From any topic page, open the article editor. Write rough study notes in plain text, hit Refine, and Gemini rewrites them into a polished, publication-ready Markdown article. Copy as full Markdown (for dev.to, Hashnode, or a personal blog) or as a formatted Twitter/X thread.
Firebase Authentication handles login with Google or email/password. Every plan, every piece of generated content, every article, and every interview result is stored in PostgreSQL under your user account. Nothing is lost between sessions.
1. Sign Up / Log In
└─> Firebase Auth (Google or email)
2. Dashboard
└─> See all existing plans, progress bars, quick links to interviews
3. Create New Plan (/new)
└─> Enter topic + number of days
└─> Gemini 2.5 Flash generates structured plan (days + topic titles)
└─> Plan saved to DB, redirect to Plan View
4. Plan View (/plan/:id)
└─> All days with progress indicators
└─> Click a day → see its topics
└─> Click a topic → open Topic View
5. Topic View (/plan/:id/day/:dayId/topic/:topicId)
└─> Full content loaded (generated on first open, cached permanently)
└─> Click "Audio Lesson" → ElevenLabs Nova tutor starts live voice session
└─> Ask Nova questions, get real-time voice responses
└─> Mark topic complete → updates day progress
└─> Click "Write Article" → Article Editor
6. Article Editor (/plan/:id/topic/:topicId/article)
└─> Type rough notes in plain text
└─> Click "Refine" → Gemini returns polished Markdown + Twitter thread
7. Voice Interview (/plan/:id/interview)
└─> Select number of questions (2, 4, or 8)
└─> ElevenLabs Alex interviewer asks for introduction, then questions
└─> Speak answers naturally — full voice conversation
└─> Alex says INTERVIEW_COMPLETE when done
└─> Gemini evaluates full transcript
└─> Score, grade, strengths, improvements, per-question breakdown displayed
└─> Can retake at any time
| Layer | Technology |
|---|---|
| Frontend | Next.js 14, TypeScript, Tailwind CSS |
| State | Zustand, TanStack Query |
| Backend | FastAPI, Python 3.10, SQLAlchemy 2.0 (async) |
| Database | PostgreSQL (Nile DB) |
| Auth | Firebase Authentication (Google OAuth + email) |
| AI — Content | Google Gemini 2.5 Flash |
| AI — Voice | ElevenLabs Conversational AI (@11labs/react) |
| Deployment | Vercel (frontend) + custom backend host |
- Node.js 18+
- Python 3.10+
- A Firebase project with Authentication enabled
- A Gemini API key — Google AI Studio
- An ElevenLabs API key — elevenlabs.io (ElevenAgents: Write permission required)
- A PostgreSQL database (Nile DB free tier works)
git clone https://github.com/yourname/PrepStudio
cd PrepStudio
# Frontend
cd frontend
npm install
# Backend
cd ../backend
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txtCopy backend/config.properties.example to backend/config.properties and fill in:
DATABASE_URL=postgresql+asyncpg://...
GEMINI_API_KEY=your_gemini_key
ELEVENLABS_API_KEY=your_elevenlabs_key
FIREBASE_PROJECT_ID=your_project_id
FIREBASE_CLIENT_EMAIL=...
FIREBASE_PRIVATE_KEY=...For the frontend, create frontend/.env.local:
NEXT_PUBLIC_API_URL=http://localhost:8000
NEXT_PUBLIC_FIREBASE_API_KEY=...
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=...
NEXT_PUBLIC_FIREBASE_PROJECT_ID=...# Terminal 1 — Backend
cd backend && uvicorn app.main:app --reload --port 8000
# Terminal 2 — Frontend
cd frontend && npm run devOpen http://localhost:3000.
PrepStudio/
├── frontend/ # Next.js 14 app
│ └── src/
│ ├── app/ # Routes (App Router)
│ │ ├── page.tsx # Landing page
│ │ ├── dashboard/ # User dashboard
│ │ ├── new/ # Plan creation
│ │ └── plan/[id]/ # Plan, topic, interview views
│ ├── components/ # Shared UI components
│ ├── hooks/ # useVoice, useElevenLabsConversation
│ ├── lib/ # Firebase init, Axios API client
│ └── store/ # Zustand stores (auth, interview)
│
└── backend/ # FastAPI app
└── app/
├── core/ # Config, DB session, Firebase auth middleware
├── models/ # SQLAlchemy ORM models
├── schemas/ # Pydantic request/response types
├── routers/ # plans, topics, articles, interviews
└── services/ # gemini_service, elevenlabs_service
All routes require Authorization: Bearer <firebase_id_token>.
| Method | Route | Description |
|---|---|---|
| POST | /plans |
Create plan — triggers Gemini curriculum generation |
| GET | /plans |
List all plans for the authenticated user |
| GET | /plans/:id |
Full plan with days and topics |
| GET | /topics/:id |
Topic content (lazy-generated by Gemini, then cached) |
| PATCH | /topics/:id/complete |
Toggle topic complete |
| POST | /topics/:id/lesson-session |
Create ElevenLabs Audio Lesson session |
| POST | /articles |
Save raw article text |
| POST | /articles/:id/refine |
Refine article to Markdown + Twitter thread via Gemini |
| POST | /interviews |
Start text-based interview session |
| POST | /interviews/:id/answer |
Submit answer, get next question + score |
| POST | /plans/:id/voice-interview-session |
Create ElevenLabs Voice Interview session |
| POST | /interviews/:id/evaluate-transcript |
Evaluate full voice interview transcript via Gemini |
| GET | /interviews/:id |
Full interview result with score and feedback |
PrepStudio uses ElevenLabs Conversational AI for two features:
Audio Lessons — POST /topics/:id/lesson-session
The backend fetches the topic content, builds a system prompt instructing Nova to teach rather than recite, then calls the ElevenLabs Agents API to create a live agent and returns a signed WebSocket URL. The frontend connects using @11labs/react.
Voice Interviews — POST /plans/:id/voice-interview-session
The backend generates questions via Gemini, creates an Alex interviewer agent with those questions embedded in the system prompt, and returns a signed WebSocket URL. The frontend runs the full interview via voice. When Alex says INTERVIEW_COMPLETE, the transcript is sent to Gemini for evaluation.
Required ElevenLabs API permission: ElevenAgents → Write.
The core thesis: voice makes learning stick. Reading about a topic is passive. Being asked to explain it aloud — under the pressure of a real-sounding interviewer — is how you find out what you actually know.