PrepWise is an AI-powered interview preparation platform built with Next.js, Clerk, Gemini, Neon PostgreSQL, and Drizzle ORM. It helps users generate mock interviews, practice answers, review AI feedback, and create reusable question banks for targeted preparation.
PrepWise is designed for candidates who want a structured interview practice workflow rather than a simple question list. Users can:
- create a mock interview from a target role and tech stack
- answer interview questions in a guided session
- transcribe spoken responses
- receive AI-generated answer feedback and ratings
- build reusable question sets for company or domain-specific preparation
- review previous sessions and stored feedback
- AI-generated mock interviews based on job role, description, and experience
- AI-generated prep question banks for focused practice
- Clerk authentication for sign-in and protected dashboard routes
- interview session flow with webcam support and audio answer recording
- Gemini-based audio transcription and answer evaluation
- persistent interview history and saved feedback
- responsive dashboard, landing page, upgrade page, and how-it-works page
- light/dark theme support
- Next.js 14
- React 18
- Tailwind CSS
- Radix UI primitives
- Lucide icons
- Sonner for toast notifications
- next-themes for theme switching
- Clerk
- Google Gemini (
gemini-1.5-flash)
- Neon PostgreSQL
- Drizzle ORM
- Drizzle Kit
react-webcam- browser
MediaRecorder - browser Speech Synthesis API
- User enters role, stack, and experience.
- Gemini generates a JSON interview set.
- The interview is stored in PostgreSQL.
- User starts the session and answers questions.
- Audio is transcribed with Gemini.
- Gemini evaluates the answer and returns rating + feedback.
- Feedback is stored and shown in the final review screen.
- User enters role, company, experience, and question type.
- Gemini generates a reusable question set in JSON format.
- The result is stored in PostgreSQL.
- User can open and review it later from the dashboard.
app/
(auth)/
sign-in/
sign-up/
dashboard/
howit/
interview/[interviewId]/
pyq/[pyqId]/
question/
upgrade/
_components/
_components/
layout.js
page.js
components/
ui/
ModeToggle.jsx
ThemeProvider.tsx
utils/
db.js
GeminiAIModal.js
schema.js
drizzle/
schema.ts
relations.ts
meta/
The main application schema is defined in utils/schema.js.
Stores generated interview sets.
idjsonMockRespjobPositionjobDescjobExperiencecreatedBycreatedAtmockId
Stores generated prep question sets.
idMockQuestionJsonRespjobPositionjobDescjobExperiencetypeQuestioncompanycreatedBycreatedAtmockId
Stores interview answers and evaluation results.
idmockIdRefquestioncorrectAnsuserAnsfeedbackratinguserEmailcreatedAt
Stores contact form submissions.
idnewNamenewEmailnewMessagecreatedAt
Create a .env.local file in the project root.
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=
CLERK_SECRET_KEY=
NEXT_PUBLIC_GEMINI_API_KEY=
NEXT_PUBLIC_DRIZZLE_DB_URL=
NEXT_PUBLIC_INFORMATION=
NEXT_PUBLIC_QUESTION_NOTE=NEXT_PUBLIC_GEMINI_API_KEYis used by the current frontend-driven AI flow.NEXT_PUBLIC_DRIZZLE_DB_URLis used by the current database access layer.NEXT_PUBLIC_INFORMATIONandNEXT_PUBLIC_QUESTION_NOTEare used in the interview UI.
- Node.js 18 or newer
- npm
- Neon PostgreSQL database
- Clerk project
- Gemini API key
- Clone the repository:
git clone <your-repository-url>
cd PrepWise- Install dependencies:
npm install-
Create
.env.localand add the required environment variables. -
Push the database schema:
npm run db:push- Start the development server:
npm run dev- Open the app:
http://localhost:3000
npm run dev- start the Next.js development servernpm run build- create a production buildnpm run start- run the production servernpm run lint- run Next.js lintingnpm run db:push- push schema changes with Drizzle Kitnpm run db:studio- open Drizzle Studio
Clerk is used for authentication. Protected routes are enforced in middleware.js, primarily for:
/dashboard- nested dashboard pages
Auth screens live in:
app/(auth)/sign-in/[[...sign-in]]/page.jsxapp/(auth)/sign-up/[[...sign-up]]/page.jsx
The application uses a custom Tailwind-based UI system with:
- reusable primitives in
components/ui - global design tokens in
app/globals.css - theme switching through
next-themes
This project currently uses a frontend-heavy architecture:
- Gemini calls are initiated from the client
- database reads/writes are performed through the shared Drizzle utility imported in the app
- interview and question content are stored as JSON text blobs
This keeps the implementation simple, but for a production-hardening pass you may want to:
- move AI calls to server actions or API routes
- move database writes behind server-side authorization
- reduce reliance on
NEXT_PUBLIC_*for sensitive workflows - introduce stronger validation for AI JSON responses
If you see errors like:
Cannot find module './vendor-chunks/@clerk.js'Cannot find module './948.js'- missing files inside
.next/server/...
the issue is usually a corrupted or stale .next cache, especially when the project is inside OneDrive.
Recommended fix:
- stop the dev server
- delete the
.nextfolder - restart with
npm run dev
If possible, keep the project outside OneDrive-synced folders to avoid repeated cache corruption.
To deploy:
- configure the same environment variables in your deployment platform
- run
npm run build - run
npm run startor deploy through a platform like Vercel
Contributions are welcome.
Suggested flow:
- fork the repository
- create a feature branch
- make and test your changes
- open a pull request with a clear summary
Add a license file if you plan to distribute or open-source the project publicly.