Skip to content

Repository files navigation

πŸš€ JobVue AI

Your Complete Career Operating System

Find jobs. Practice interviews. Land offers.

A full-stack career platform blending a hyperlocal job marketplace with AI-powered interview prep and gamified progress tracking.


⚑ Tech Stack

Next.js React TypeScript Prisma PostgreSQL MongoDB Gemini AI Vapi


🎯 Why JobVue AI?

Students, freelancers, and early-career pros need one place to:

✨ Discover real local opportunities β†’ Browse, save, apply to jobs near you
πŸŽ™οΈ Practice with AI interviews β†’ Get instant feedback from Gemini
πŸ† Track progress & earn badges β†’ Streaks, tokens, leaderboards

Built as a production-style app with modern Next.js, typed server actions, and hybrid persistence (PostgreSQL + MongoDB) optimized for real-world workflows.


🧭 Core Product Areas

πŸ’Ό Job Marketplace

Find and post opportunities in your network
βœ… Browse jobs by role, skills, location
βœ… Save favorites and track applications
βœ… Manage postings (for employers)
βœ… Apply directly in-app

πŸŽ™οΈ Intervue AI (Interview Prep)

Generate questions β†’ Practice with voice AI β†’ Get scored feedback
βœ… Role-based question generation
βœ… Live Vapi voice interview sessions
βœ… Real-time transcript collection
βœ… Structured AI scoring (5 categories)
βœ… Auto-redirect to feedback page

πŸ† Profile & Gamification

Track mastery, earn rewards, climb leaderboards
βœ… Unified profile (skills, bio, preferences)
βœ… Token system for milestones
βœ… Streaks for consistency
βœ… Unlockable badges
βœ… Public leaderboards


πŸ—οΈ Architecture at a Glance

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Frontend: Next.js 15 + React 19   β”‚
β”‚   (TypeScript, Tailwind, Framer)    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                 β”‚
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚                 β”‚
   β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”
   β”‚PostgreSQLβ”‚     β”‚ MongoDB  β”‚
   β”‚(Prisma)  β”‚     β”‚(Mongoose)β”‚
   β”‚ ─────────│     β”‚ ─────────│
   β”‚ Users    β”‚     β”‚ Jobs     β”‚
   β”‚ Feedback β”‚     β”‚ Apps     β”‚
   β”‚ Badges   β”‚     β”‚ Saved    β”‚
   β”‚ Tokens   β”‚     β”‚          β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
                         β”‚
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”
        β”‚        β”‚       β”‚        β”‚      β”‚
   β”Œβ”€β”€β”€β”€β–Όβ”€β”€β” β”Œβ”€β”€β–Όβ”€β”€β”€β” β”Œβ”€β–Όβ”€β”€β”€β”€β”€β”€β”β”Œβ–Όβ”€β”€β”€β”β”Œβ”€β–Όβ”€β”€β”
   β”‚Gemini β”‚ β”‚Vapi  β”‚ β”‚Firebaseβ”‚β”‚Authβ”‚β”‚JWT β”‚
   β”‚(AI)   β”‚ β”‚Voice β”‚ β”‚(Legacy)β”‚β”‚    β”‚β”‚    β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”˜

πŸ“ Project Structure

jobvue/
β”œβ”€β”€ app/                    πŸ›£οΈ  Next.js routes & API handlers
β”‚   β”œβ”€β”€ (interview)/        Interview pages & flows
β”‚   β”œβ”€β”€ (auth)/             Auth pages
β”‚   β”œβ”€β”€ jobs/               Job marketplace
β”‚   β”œβ”€β”€ profile/            User profiles
β”‚   β”œβ”€β”€ api/                REST endpoints
β”‚   └── layout.tsx          Root layout
β”‚
β”œβ”€β”€ components/             βš›οΈ  React components
β”‚   β”œβ”€β”€ Agent.tsx           Interview session component
β”‚   β”œβ”€β”€ FeedbackClient.tsx  Feedback display
β”‚   β”œβ”€β”€ Navbar.tsx          Navigation
β”‚   └── ui/                 Radix-based primitives
β”‚
β”œβ”€β”€ lib/                    πŸ”§  Utilities & services
β”‚   β”œβ”€β”€ actions/            Server actions (Prisma, AI)
β”‚   β”œβ”€β”€ models/             Mongoose schemas
β”‚   β”œβ”€β”€ auth.ts             JWT + auth logic
β”‚   β”œβ”€β”€ prisma.ts           Prisma client
β”‚   └── vapi.sdk.ts         Vapi initialization
β”‚
β”œβ”€β”€ prisma/                 πŸ“Š  Database
β”‚   β”œβ”€β”€ schema.prisma       PostgreSQL schema
β”‚   β”œβ”€β”€ seed.ts             Demo data seeder
β”‚   └── migrations/         Schema versions
β”‚
β”œβ”€β”€ constants/              βš™οΈ  Config & schemas
β”‚   └── index.ts            Zod schemas, mappings
β”‚
└── public/                 πŸ“¦  Static assets

🌐 Key Routes & Features

🎯 User-Facing Pages

Route Feature
/ Home + hero
/jobs Browse marketplace
/jobs/[id] Job details
/jobs/post Post new listing
/jobs/manage Manage your postings
/profile View/edit profile
/interview Interview history
/interview/[id] Run interview
/interview/[id]/feedback View results
/quiz Practice quizzes
/leaderboard Rankings

πŸ”Œ API Endpoints

POST   /api/vapi/generate           Generate & start interview
GET    /api/jobs                    List jobs
POST   /api/jobs/[id]/apply         Submit application
GET    /api/me                      Current user
GET    /api/gamification/badges     User badges
GET    /api/gamification/leaderboard Global rankings

πŸš€ Get Started in 5 Minutes

1️⃣ Clone & Install

git clone https://github.com/your-org/jobvue.git
cd jobvue
npm install

2️⃣ Configure .env

Create a .env file in the root:

# πŸ—„οΈ  Databases
DATABASE_URL=postgresql://user:pass@host/db
DIRECT_URL=postgresql://user:pass@host/db
MONGODB_URI=mongodb+srv://user:pass@cluster.mongodb.net/jobvue

# πŸ” Security
JWT_SECRET=your-super-secret-key-min-32-chars

# πŸ€– AI & Voice
GEMINI_API_KEY=your-gemini-key
NEXT_PUBLIC_GEMINI_API_KEY=your-gemini-key
NEXT_PUBLIC_VAPI_WEB_TOKEN=your-vapi-token
NEXT_PUBLIC_VAPI_WORKFLOW_ID=your-workflow-id

⚠️ Never commit .env to version control. Use .env.local for local development.

3️⃣ Initialize Database

npm run prisma:generate    # Generate Prisma client
npm run prisma:push        # Sync schema
npm run seed               # Load demo data

4️⃣ Start Development

npm run dev

Server runs at http://localhost:3000 with Turbopack hot reload.

5️⃣ Open & Login

Visit the app and use demo credentials:

Email Password Role
demo@jobvue.com demo1234 Seeker + Poster
poster@jobvue.com poster1234 Poster

πŸ“¦ Available Commands

npm run dev              # Start dev server (Turbopack)
npm run build            # Production build
npm run start            # Run production server
npm run lint             # ESLint checks
npm run prisma:generate  # Regenerate Prisma client
npm run prisma:push      # Push schema to DB
npm run prisma:migrate   # Interactive migrations
npm run seed             # Seed PostgreSQL + MongoDB

πŸŽ™οΈ Interview Flow (End-to-End)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Interview Session Flow                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

1. User clicks "Call" β†’ Vapi session starts
   β”œβ”€ Questions loaded
   β”œβ”€ Voice agent initialized
   └─ Client listening for transcripts

2. Live conversation
   β”œβ”€ User speaks (captured by Vapi)
   β”œβ”€ Agent responds
   └─ Transcripts streamed to frontend

3. User clicks "End" β†’ Call terminates
   β”œβ”€ All messages collected
   └─ Sent to server action

4. Server processes feedback
   β”œβ”€ Gemini analyzes transcript
   β”œβ”€ Generates structured scores (5 categories)
   β”œβ”€ Saves to PostgreSQL
   └─ Creates/awards badges (non-blocking)

5. Auto-redirect β†’ /interview/[id]/feedback
   β”œβ”€ Client automatically navigated
   └─ Feedback page displays scores & analysis

Interview Scoring Categories

Category Focus
πŸ—£οΈ Communication Skills Clarity, articulation, structure
πŸ’‘ Technical Knowledge Depth of understanding
🧩 Problem Solving Analysis & solution design
πŸ‘₯ Cultural Fit Values alignment & collaboration
πŸ’ͺ Confidence & Clarity Assertiveness & decisiveness

Each scores 0–100, with detailed comments and actionable improvement areas.


πŸ›‘οΈ Recent Fixes & Improvements

βœ… Schema Validation β€” Fixed AI output category naming to match strict Zod schema
βœ… Dependency Updates β€” Upgraded @daily-co/daily-js and @vapi-ai/web
βœ… Badge System β€” Made non-blocking with lazy badge creation
βœ… Auto-Redirect β€” Interview completion now reliably routes to feedback page
βœ… Windows EPERM β€” Resolved native module lock issues with clean install script


⚑ Performance & Reliability

  • Server Actions β€” Type-safe, compiled Prisma queries
  • Streaming β€” Next.js streaming for fast TTFB
  • Error Boundaries β€” Graceful fallbacks for badge/gamification failures
  • Database Optimization β€” Indexes on frequently queried fields (userId, interviewId)
  • Native Modules β€” Proper lightningcss and Prisma engine management

πŸ”’ Security Checklist

βœ… Use strong, unique JWT_SECRET (min 32 chars)
βœ… Rotate API keys every 90 days
βœ… Never commit .env files
βœ… Restrict DB users with least-privilege access
βœ… Enable HTTPS in production
βœ… Validate all user inputs with Zod


πŸ› Troubleshooting

❌ Native Module Errors (Windows EPERM)

# Kill node processes
taskkill /F /IM node.exe

# Clean & reinstall
rm -r .next node_modules package-lock.json
npm ci
npm run build

❌ Feedback Not Generating

  1. Check Gemini API key in .env
  2. Verify PostgreSQL connectivity
  3. Confirm interview transcript collection
  4. Check server logs for Zod validation errors

Fix: Category names must match exactly:

  • "Problem Solving" (not "Problem-Solving")
  • "Cultural Fit" (not "Cultural & Role Fit")
  • "Confidence and Clarity" (not "Confidence & Clarity")

❌ Voice Call Not Connecting

  1. Verify NEXT_PUBLIC_VAPI_WEB_TOKEN
  2. Verify NEXT_PUBLIC_VAPI_WORKFLOW_ID
  3. Check Vapi dashboard for endpoint status
  4. Confirm browser microphone permissions

❌ Database Connection Failed

# Verify PostgreSQL
psql $DATABASE_URL -c "SELECT 1"

# Verify MongoDB
mongosh "$MONGODB_URI" --eval "db.adminCommand('ping')"

# Reset Prisma
npm run prisma:generate
npm run prisma:push

πŸ“Š Deployment Checklist

Before shipping to production:

  • All environment variables configured
  • prisma generate succeeds in CI/CD pipeline
  • npm run build completes without errors
  • Database connectivity tested (PostgreSQL + MongoDB)
  • Gemini & Vapi API keys verified
  • JWT_SECRET is strong & unique
  • CORS properly configured
  • Rate limiting enabled on API routes
  • Monitoring & error tracking set up (Sentry, etc.)

πŸš€ Next Steps & Roadmap

Future enhancements in progress:

πŸ”„ Peer interviews β€” Practice with real people
πŸ“ˆ Interview analytics β€” Trend tracking over time
🎯 Personalized learning paths β€” Adaptive question generation
🀝 Mentorship matching β€” Connect with industry professionals
πŸ“± Mobile app β€” React Native companion


πŸ“„ License

MIT License - Free to use, modify, and distribute.


🀝 Contributing

We welcome PRs! Please:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit changes (git commit -m 'Add amazing feature')
  4. Push to branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

πŸ’¬ Support & Community


🌟 Built for practical outcomes, not demo-only workflows.

⬆ Back to top

About

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages