The open-source AI interview-prep platform โ multi-LLM mock interviews, BYOK, self-host, no subscription
A free, self-hostable alternative to Final Round AI, Interview Coder & Pramp. Bring your own API key (Claude / GPT / Gemini) or run 100% local & offline with Ollama. Your data stays yours.
โถ 60-second demo โ GIF coming soon (see
BANNER.mdfor the recording brief).
Most interview-prep tools lock you into one AI vendor, charge a monthly subscription, and keep your practice data on their servers. JobPrep flips all three.
| JobPrep | Final Round AI / Interview Coder / Pramp | |
|---|---|---|
| Price | $0 โ self-host / BYOK | ~$96โ$149 / month |
| AI models | Claude ยท GPT ยท Gemini ยท Ollama (swap per request) | Single vendor, fixed |
| API keys | Bring your own (or run local) | Vendor-controlled |
| Self-host | โ Cloudflare / Docker / your box | โ |
| Run offline / local | โ Ollama, fully private | โ |
| Source code | โ Source-available, auditable | โ Closed |
| Your data | โ Stays in your own DB | โ On their servers |
| Mock interviews | โ Live video (LiveKit) + AI feedback | โ |
| CV builder + coding arena | โ Included | Partial / extra |
The pitch in one line: the practice quality of a $149/mo product, for $0, with your keys and your data.
No vendor account, no subscription โ just your own API key (or none, with local Ollama):
git clone https://github.com/aliammari1/JobPrep.git && cd JobPrep
bun install
cp .env.example .env # add ONE key: provider credential (or OPENAI / GEMINI)
bun run prisma:generate && bun run prisma:migrate
bun run dev # โ http://localhost:3000Zero API keys? Set AI_COACH_DEFAULT_MODEL=ollama:llama3.2 and run a local
Ollama โ JobPrep then runs fully offline and private.
The only required vars are DATABASE_URL + BETTER_AUTH_SECRET; everything else
(AI, video, billing) is optional and feature-gated.
JobPrep is a GitHub template repository โ hit Use this template to spin up your own multi-LLM interview-prep app (or any BYOK AI product) with auth, billing, Prisma, rate-limiting and observability already wired. Then deploy your own copy:
The web app runs on Cloudflare Workers/Pages (see docs/DEPLOYMENT.md);
the long-running LiveKit avatar agent runs on a container next to LiveKit Cloud.
- ๐ค Multi-LLM AI coach โ Claude, GPT-4, Gemini, or local Ollama, switchable per request (BYOK)
- ๐ฅ Live video mock interviews โ LiveKit WebRTC + AI feedback on answers, tone & body language
- ๐ ATS-friendly CV builder โ 3 templates, LinkedIn import (Chrome extension), multi-format export
- ๐ป Coding arena โ practice in 15+ languages with instant evaluation
- โ๏ธ AI cover letters tailored to a job description
- ๐ Progress analytics + ๐ passkey auth & 2FA
The AI Coach resolves a model at request time from a single
<provider>:<model> id, so you switch between Claude, GPT, Gemini, or a
self-hosted Ollama model โ including fully local/offline โ without touching any
feature code.
| Wantโฆ | Pick |
|---|---|
| Fast & cheap (default) | anthropic:claude-haiku-4-5 |
| Highest quality | anthropic:claude-sonnet-4-5 / openai:gpt-4o |
| Free/local & private | ollama:llama3.2 |
# Stream a coaching reply (omit "model" to use the default)
curl -N -X POST http://localhost:3000/api/ai/coach \
-H 'content-type: application/json' \
-d '{"messages":[{"role":"user","content":"STAR-review my answer"}],"model":"anthropic:claude-haiku-4-5"}'List available models at GET /api/ai/models. Adding a new provider is a
three-line change in src/lib/ai/providers.ts.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Frontend Layer โ
โ Next.js 15 โข React 19 โข TypeScript โข Tailwind CSS โข shadcn/ui โ
โโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ API Routes Layer โ
โ /api/ai โข /api/interviews โข /api/cv โข /api/challenges โ
โโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ AI Services Layer โ
โ Gemini โข OpenAI โข Claude โข Ollama โข HeyGen โข MediaPipe โ
โโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Real-time Services โ
โ LiveKit (Video) โข Liveblocks โข Socket.io โ
โโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Data & Storage Layer โ
โ PostgreSQL (Prisma) โข Appwrite โข Cloudinary โข Stripe โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| Feature | Description |
|---|---|
| Multi-AI Support | Choose between Gemini, GPT-4, Claude, or local Ollama |
| Real-time Video | LiveKit-powered HD video/audio with screen sharing |
| Smart Questions | AI generates role-specific technical & behavioral questions |
| Instant Feedback | Get detailed analysis of answers, tone, and body language |
| Voice Analysis | Speech-to-text transcription with emotion detection |
| Recording | Save interviews for review and improvement tracking |
| Scheduling | Google Calendar integration for practice sessions |
| Feature | Description |
|---|---|
| 3 Templates | Professional, modern, and creative ATS-optimized designs |
| LinkedIn Import | Chrome extension auto-fills CV from LinkedIn profile |
| Smart Suggestions | AI-powered improvements for bullet points and keywords |
| Multi-format Export | PDF, DOCX, JSON with customizable styling |
| Version Control | Save multiple versions, track changes over time |
| Real-time Preview | Live updates as you type with mobile-responsive view |
| Feature | Description |
|---|---|
| 15+ Languages | Java, Python, JavaScript, C++, Go, Rust, and more |
| Difficulty Levels | Easy, Medium, Hard with curated problem sets |
| Real-time Execution | Piston API-powered instant code evaluation |
| Test Cases | Run against multiple test cases with detailed feedback |
| Leaderboard | Compete with others, track rankings and statistics |
| Time Tracking | Practice under interview conditions with timers |
AI-powered cover letter creation tailored to job descriptions using Gemini & GPT-4 with customizable tone and multiple revisions.
One-click LinkedIn CV import - automatically extracts work experience, education, skills, and certifications into JobPrep format.
- Next.js 15.5 - React framework with App Router & Server Components
- React 19.1 - UI library with React Compiler
- TypeScript 5 - Type safety
- Tailwind CSS 4.0 - Utility-first styling
- shadcn/ui - Beautiful accessible components
- Framer Motion - Smooth animations
- Node.js 20+ - JavaScript runtime
- Prisma 6.17 - Type-safe ORM
- PostgreSQL - Primary database
- Better Auth 1.3 - Authentication with passkeys & 2FA
- Google Gemini - Primary AI for interviews & CV analysis
- OpenAI GPT-4 - Advanced reasoning & code evaluation
- Anthropic Claude - Alternative AI provider
- Ollama - Local AI models (optional)
- HeyGen - AI avatar generation
- MediaPipe - Body language & emotion analysis
- LiveKit - WebRTC video/audio conferencing
- Socket.io - Real-time notifications
- Liveblocks - Collaborative features
- Appwrite - File storage & backend services
- Cloudinary - Image optimization & CDN
- Stripe - Payment processing & subscriptions
- pdf-lib - PDF manipulation
- mammoth - DOCX parsing
- Piston API - Multi-language code runner (15+ languages)
See โก Try it in minutes (BYOK) above for the
2-minute path. Prerequisites: Bun 1.x (this repo is Bun, not npm/pnpm),
PostgreSQL 14+, Git. Optional: uv for the Python
avatar agent in functions/.
Environment variables: the canonical, commented list lives in
.env.example. Only DATABASE_URL + BETTER_AUTH_SECRET are
required; AI providers (BYOK), LiveKit video, Stripe billing, Upstash
rate-limiting and Sentry are all optional and feature-gated.
JobPrep/
โโโ src/
โ โโโ app/ # Next.js App Router
โ โ โโโ (auth)/ # Auth pages (login, register)
โ โ โโโ (dashboard)/ # Protected dashboard routes
โ โ โโโ api/ # API routes (35+ endpoints)
โ โ โ โโโ ai/ # AI chat & processing
โ โ โ โโโ interviews/ # Mock interview endpoints
โ โ โ โโโ cv/ # CV builder & export
โ โ โ โโโ challenges/ # Code challenge submission
โ โ โ โโโ livekit/ # Video conferencing
โ โ โ โโโ stripe/ # Payment webhooks
โ โ โโโ layout.tsx # Root layout
โ โโโ components/ # React components (150+)
โ โ โโโ ui/ # shadcn/ui components
โ โ โโโ interviews/ # Interview-related components
โ โ โโโ cv/ # CV builder components
โ โ โโโ challenges/ # Code editor components
โ โโโ lib/ # Utilities & helpers
โ โ โโโ prisma.ts # Database client
โ โ โโโ auth.ts # Auth configuration
โ โ โโโ ai/ # AI service integrations
โ โโโ styles/ # Global styles
โโโ prisma/
โ โโโ schema.prisma # Database schema (25+ models)
โโโ chrome-extension/ # LinkedIn CV importer
โ โโโ manifest.json
โ โโโ content.js # LinkedIn scraper
โ โโโ popup.html # Extension UI
โโโ public/ # Static assets
โโโ package.json # Dependencies (80+)
model User {
id String @id @default(cuid())
email String @unique
name String?
image String?
interviews Interview[]
cvs CV[]
submissions Submission[]
subscription Subscription?
createdAt DateTime @default(now())
}
model Interview {
id String @id @default(cuid())
userId String
user User @relation(fields: [userId], references: [id])
jobTitle String
jobDescription String
difficulty Difficulty
aiProvider AIProvider
questions Question[]
responses InterviewResponse[]
recordingUrl String?
score Float?
feedback String?
status InterviewStatus @default(PENDING)
scheduledAt DateTime?
completedAt DateTime?
createdAt DateTime @default(now())
}
model CV {
id String @id @default(cuid())
userId String
user User @relation(fields: [userId], references: [id])
template String
personalInfo Json
experience Json[]
education Json[]
skills Json[]
certifications Json[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Challenge {
id String @id @default(cuid())
title String
description String
difficulty Difficulty
language String
testCases Json[]
submissions Submission[]
tags String[]
createdAt DateTime @default(now())
}
model Subscription {
id String @id @default(cuid())
userId String @unique
user User @relation(fields: [userId], references: [id])
plan Plan
status String
stripeId String @unique
currentPeriodEnd DateTime
}- ๐ Modern auth โ Better Auth with passkeys & 2FA
- ๐ซ Rate limiting โ Upstash sliding-window limits on the AI + LiveKit endpoints when Redis is configured (
src/lib/rate-limit.ts) - ๐งฐ Typed env โ boot-time validation via
@t3-oss/env-nextjs+ Zod (src/env.ts) - ๐ Security headers / CSP โ HSTS, X-Frame-Options,
script-srcwithoutunsafe-evalin prod (next.config.mjs) - ๐ณ Idempotent Stripe webhooks โ duplicate-delivery ledger so retries are safe
- ๐ Observability โ Sentry + OpenTelemetry, with AI-SDK telemetry (token/cost) โ all no-ops unless configured
- โ SQL-injection resistant (Prisma) ยท XSS mitigation (React/CSP); route-specific CSRF and authorization review remains in progress
- ๐ Automated scanning โ CodeQL, gitleaks, Trivy, dependency-review + OpenSSF Scorecard in CI
- Interactive (Scalar): run the app and open
/api-docs. - OpenAPI document:
/api/openapi(also generated toopenapi.jsonviabun run openapi:generate). - New endpoints are documented by adding a
@swaggerJSDoc block above the route handler โnext-swagger-docpicks them up automatically.
The Next.js app deploys to Cloudflare via @opennextjs/cloudflare, with
PostgreSQL reached through Hyperdrive. Config lives in wrangler.jsonc +
open-next.config.ts; deployment is gated behind a manual workflow.
bun add -D @opennextjs/cloudflare
bunx @opennextjs/cloudflare build
bunx wrangler deploy
โ ๏ธ Two-part deploy. The Python LiveKit/Simli avatar agent (functions/) is a long-running WebRTC process โ it cannot run on Cloudflare Workers. The web app runs on Cloudflare; the agent runs on a container next to LiveKit Cloud (free Build tier). Full host comparison (LiveKit Cloud agents, Railway, Render, Fly.io, Koyeb โ researched for 2026) is indocs/DEPLOYMENT.md.
More docs: Deployment ยท Architecture ยท Chrome Web Store publishing ยท Banner / social preview ยท Launch checklist
- Bun + Biome (no ESLint/Prettier). One fast toolchain for install, lint, and
format;
biome ciruns in CI with a blocking format check. - Source-Available license kept (SPDX
LicenseRef-Source-Available-1.0) โ JobPrep is a commercial product, not a permissive OSS sample. - Provider-agnostic AI on the Vercel AI SDK with a model registry, rather than hard-wiring one vendor โ enables Claude/GPT/Gemini/Ollama and offline use.
- Hyperdrive, not D1, for the database: the Prisma schema is Postgres-specific and Better-Auth uses the Postgres adapter, so a SQLite port would be high-risk.
- Lazy Stripe init so
next builddoesn't require live billing keys in CI. - Scoped, ratcheting test coverage instead of a global 80% gate that failed CI.
- Avatar agent on a container (uv + ruff + pytest), honestly documented as a non-Workers workload.
- AI-powered mock interviews with multi-provider support
- Professional CV builder with 3 templates
- Code challenge arena (15+ languages)
- Chrome extension for LinkedIn import
- Real-time video interviews (LiveKit)
- Stripe payment integration
- Dashboard & analytics
- ๐ AI interview coaching with personalized tips
- ๐ Advanced analytics & skill gap analysis
- ๐ฎ Gamification & achievement system
- ๐ Multi-language support (i18n)
- ๐ฑ Mobile responsive improvements
- ๐ฅฝ VR Interview simulation
- ๐ฑ iOS & Android mobile apps
- ๐ฅ Peer interview matching
- ๐ Interview coaching marketplace
- ๐ง Emotion detection & personality analysis
- ๐ข Company-specific prep (FAANG, startups)
- ๐ค ATS integration & job application tracking
Contributions are welcome! See our Contributing Guide for details.
# Fork & clone
git clone https://github.com/YOUR_USERNAME/JobPrep.git
# Create branch
git checkout -b feature/amazing-feature
# Commit changes
git commit -m 'feat: add amazing feature'
# Push & create PR
git push origin feature/amazing-featurefeat:New featurefix:Bug fixdocs:Documentationrefactor:Code refactoringtest:Adding testschore:Maintenance
This project is licensed under the Source-Available License 1.0
(SPDX: LicenseRef-Source-Available-1.0).
- Free for: Personal use, education, research, non-profits, and security research
- Commercial use: Requires a Commercial License. Contact ammari.ali.0001@gmail.com
This is a source-available license. It is NOT an Open Source Initiative (OSI) approved open-source license.
Copyright (c) 2026 Ali Ammari
Special thanks to:
- Next.js - The React Framework
- Cloudflare - Edge deployment & hosting
- Prisma - Next-gen ORM
- shadcn/ui - Beautiful Components
- LiveKit - Real-time Video
- Better Auth - Modern Auth
- Google AI - Gemini API
- OpenAI - GPT Models
- Stripe - Payments
If JobPrep saves you a $149/mo subscription, the best thank-you is a star:
- โญ Star the repo so others discover the free alternative
- ๐ฆ Share it with anyone grinding interviews
- โ Buy me a coffee
Part of a wider open-source ecosystem โ if JobPrep is useful, these might be too:
- ๐ readrealm โ open-source AI book-chat (Speechify / Blinkist alternative)
- ๐ฉบ pulmocare โ open-source, self-hostable chest-X-ray AI agent
- ๐ github-traffic-analytics โ keep your repo traffic past GitHub's 14-day window
- ๐งฐ awesome-ai-tools โ a curated index of ~400 AI tools
Built with โค๏ธ by Ali Ammari
Helping job seekers land their dream jobs, one interview at a time ๐

