AI‐powered mock interview platform that turns your resume and a target job description into realistic, feedback‐rich interview practice sessions.
Live: https://fiterview.com/
- Overview
- Key Features
- Architecture
- Tech Stack
- Monorepo Layout
- Getting Started
- Database
- Project Scripts
- Coding Standards
- Deployment
- Roadmap
- Contributing
- License
Fiterview helps candidates rehearse interviews end‐to‐end:
- Upload or paste your resume.
- Paste a job post (JD) you’re targeting.
- Generate a tailored interview plan (question bank by topic/seniority, behavioral + technical).
- Conduct a live mock with voice (STT/TTS) or text.
- Receive structured feedback and an improvement report.
The app is built with a clean, layered architecture to keep domain logic independent from adapters (UI, APIs, vendors). The App Router organizes routes and server actions, while Prisma + PostgreSQL persist user data and reports.
- JD‐aware question generation – prompts are conditioned on both the job post and resume to remove generic "one‐size‐fits‐all" questions.
- Behavioral + technical coverage – STAR/ABC prompts, system design, React/Next.js/web‐fundamentals tracks.
- Live or async practice – answer via microphone (speech‐to‐text) or type; text‐to‐speech for interviewer voice.
- Rubric‐based scoring – clarity, correctness, seniority signal, and actionable improvements per answer.
- Session history – store attempts, scores, and feedback for longitudinal progress tracking.
- Privacy‐first design – user artifacts are scoped to the account; secrets stored in envs.
Note: Some features may be behind feature flags while the product evolves.
┌──────────────────────────────┐
│ App UI │ Next.js (App Router), React, Tailwind
│ (app/*, components, hooks) │
└──────────────┬───────────────┘
│ Server Actions / API Routes (app/api/*)
┌──────────────▼───────────────┐
│ Application │ Use cases / services orchestrating flows
│ (backend/application/*) │
└──────────────┬───────────────┘
│ Calls into domain + adapters
┌──────────────▼───────────────┐
│ Domain │ Pure business entities, value objects
│ (backend/domain/*) │
└──────────────┬───────────────┘
│ Port interfaces
┌──────────────▼───────────────┐
│ Infrastructure │ Prisma repos, LLM/STT/TTS/email adapters
│ (backend/infrastructure/*) │
└──────────────┬───────────────┘
│
┌───────▼─────────┐ ┌───────────────┐
│ Prisma ORM │────▶│ PostgreSQL │
│ (prisma/*) │ │ (DATABASE) │
└─────────────────┘ └───────────────┘
- User submits resume + JD → server action builds a PromptContext.
- QuestionGenerator use case requests questions from the LLM adapter.
- User answers via text or mic → EvaluationService composes scoring rubrics and LLM feedback.
- Results stored via Prisma repositories.
- Web: Next.js (App Router), React 18, TypeScript, Tailwind CSS
- Auth: NextAuth.js (session/callbacks, providers)
- DB/ORM: PostgreSQL + Prisma
- AI: LLM(s) via provider SDK (configurable); planned multi‐model routing
- Speech: STT/TTS adapters (pluggable; e.g., Whisper‐like STT)
- State: React Query (server state) + Zustand (client state)
- Email/Notifs: Adapter‐based (e.g., Resend or SMTP)
- Tooling: ESLint, Prettier, commitlint, Husky
Exact vendors are abstracted via adapters in
backend/infrastructure/*to keep the core portable.
.
├─ app/ # Next.js App Router pages, layouts, server actions, API routes
├─ backend/ # Domain / application / infrastructure (Clean Architecture)
├─ prisma/ # Prisma schema, migrations, seed
├─ public/ # Static assets
├─ hooks/ stores/ # Reusable React hooks, Zustand stores
├─ lib/ utils/ # Shared libs, helpers, validators
├─ constants/ types/ # App‐wide constants and TypeScript types
├─ next.config.ts # Next.js config
├─ middleware.ts # Auth / routing middleware
└─ package.json # Scripts and workspaces config (if any)
- Node.js: 18.x or 20.x LTS
- Yarn or pnpm (project uses Yarn by default)
- PostgreSQL: local or cloud instance
Create a .env file at the project root:
| Name | Example | Description |
|---|---|---|
DATABASE_URL |
postgresql://user:pass@localhost:5432/fiterview |
Prisma connection string |
NEXTAUTH_URL |
http://localhost:3000 |
NextAuth base URL |
NEXTAUTH_SECRET |
... |
NextAuth secret (use openssl rand -base64 32) |
OPENAI_API_KEY |
sk-... |
LLM provider key for question gen & feedback |
SPEECH_TO_TEXT_API_KEY |
... |
STT provider key (if using speech mode) |
TEXT_TO_SPEECH_API_KEY |
... |
TTS provider key (if using voice interviewer) |
RESEND_API_KEY |
... |
Email adapter key (optional) |
GOOGLE_CLIENT_ID |
...apps.googleusercontent.com |
OAuth provider (if enabled) |
GOOGLE_CLIENT_SECRET |
... |
OAuth provider secret |
Some variables are optional depending on which adapters you enable.
# 1) Install deps $ yarn install # 2) Generate Prisma client $ npx prisma generate # 3) Provision DB & run migrations $ npx prisma migrate dev --name init # 4) (Optional) Seed local data $ npx prisma db seed # 5) Start dev server $ yarn dev # App runs on http://localhost:3000
If you change the Prisma schema, rerun
prisma generateand apply a new migration.
- Prisma schema lives in
prisma/schema.prisma. - Use
prisma/migrations/*for versioned changes. - Seed script (
prisma/seed.ts) can populate demo users and sample question banks.
Common commands:
# Inspect database in a browser npx prisma studio # Create a new migration from schema changes npx prisma migrate dev --name <change> # Push schema without creating a migration (non‐prod) npx prisma db push
Package scripts (run with yarn <script>):
dev– start Next.js in developmentbuild– typecheck and build production assetsstart– run the production serverlint– run ESLintformat– run Prettiertypecheck– runtsc --noEmitprisma:*– convenience wrappers around Prisma CLI
See
package.jsonfor the authoritative list of scripts.
- ESLint with TypeScript rules; Prettier for formatting.
- Commitlint + Husky enforce conventional commits (e.g.,
feat:,fix:) on commit/push. - Folder‐by‐layer structure; keep React components presentational where possible and push side‐effects into use cases/adapters.
- Recommended: Vercel for the Next.js frontend + serverless API routes.
- Ensure all required environment variables are set in the hosting provider.
- Use a managed PostgreSQL (e.g., Supabase, RDS, Neon) for production.
- Run
yarn build && yarn startfor a Node server deploy.