Comprehensive career management platform with gamification, personalized CV building, and job offer tracking.
- Overview
- Objective
- Key Features
- Modules
- Tech Stack
- Architecture
- Configuration
- Project Structure
- Security
- Development
JobQuest is a modern web platform designed to help professionals manage their careers comprehensively. It combines practical CV management and job offer tracking tools with gamification elements that motivate and reward user progress.
The main objective of JobQuest is to provide a complete solution for job-seeking professionals, enabling them to:
- Build personalized CVs tailored to each job offer
- Manage job offers in an organized way with a Kanban system
- Get AI insights about their CV and suggested improvements
- Stay motivated through a gamification system with XP, levels, and badges
- Track progress of their applications with interviews, contacts, and notes
- Experience points (XP) system for actions performed
- Progressive levels with rewards
- Badge system with over 50 different achievements
- Real-time progress notifications
- Dashboard with gamification statistics
- Multiple sections: Experience, Education, Certifications, Languages, Volunteering, Projects
- Intuitive editing with modals
- Automatic text improvement with AI
- CV analysis with AI insights
- Interactive chat with AI for CV queries
- Customized PDF export per offer
- Kanban view with drag & drop
- List view with advanced filters
- Customizable statuses: Saved, Contacted, Applied, Interview, Offer, Rejected, Accepted
- Complete detail view for each offer
- CV section selection per offer
- Customized CV generation per offer
- Automatic company logo extraction
- Interview management with calendar
- Contact management per offer
- Complete CV analysis with Gemini AI
- Improvement recommendations per section
- Interactive chat about the CV
- Automatic CV section suggestions for offers
- Text improvement with spelling correction and suggestions
- Overview of progress
- Current level and points
- Upcoming badges
- This week's interviews
- Pending job offers to apply
- Contacts to review
- Important notes
- Google OAuth authentication via Supabase
- User profile management
- Initial onboarding
- Custom avatar
- Personal and professional information
Main files:
src/app/(protected)/profile/page.tsxsrc/app/api/profile/route.tssrc/app/api/user/route.tssrc/components/OnboardingModal.tsx
- XP and levels system
- Badge system
- Events and rewards
- Progress and statistics
Main files:
src/app/(protected)/gamification/page.tsxsrc/app/api/gamification/route.tssrc/config/gamification/src/hooks/useGamification.tssupabase_gamification.sql
Main events:
profile.updated- Profile updatecv.*- CV events (add, update sections)job_offer.*- Job offer eventsai.*- AI usage events- And many more...
- Management of all CV sections
- Editing modals per section
- AI improvement per section
- CV preview
Main files:
src/app/(protected)/cv-builder/page.tsxsrc/components/cv/(all section components)src/app/api/cv/*/route.ts(endpoints per section)supabase_cv_builder.sql
Sections:
- Work Experience
- Education
- Certifications
- Languages
- Volunteering
- Projects
- Kanban view with drag & drop
- List view with filters
- Create/edit modal
- Detailed offer view
- Interview management
- Contact management
- CV section selection
- Customized CV generation
Main files:
src/app/(protected)/job-openings/page.tsxsrc/components/job-offers/src/app/api/job-offers/route.tssrc/app/api/interviews/route.tssrc/app/api/contacts/route.tssupabase_job_offers.sqlsupabase_interviews.sqlsupabase_job_offer_contacts.sql
- Complete CV analysis
- Interactive chat
- Text improvement per section
- Automatic suggestions
Main files:
src/components/cv/AIInsightsModal.tsxsrc/hooks/useAIInsights.tssrc/hooks/useAISectionImprover.tssrc/lib/ai/gemini.tssrc/config/ai/prompts.tssrc/app/api/ai/insights/route.tssupabase_ai_insights.sql
- Overview of status
- Gamification statistics
- Pending offers
- Upcoming interviews
- Contacts to review
- Important notes
Main files:
src/app/(protected)/dashboard/page.tsxsrc/app/api/dashboard/route.ts
- Automatic company logo extraction
- Integration with logo.dev API
- Fallback to company website
Main files:
src/lib/logo-extraction.tssrc/app/api/logo-extraction/route.ts
- Next.js 16 - React framework with App Router
- TypeScript - Static typing
- Tailwind CSS - Utility-first styling
- React Hooks - State management
- Material Symbols - Iconography
- Next.js API Routes - Server endpoints
- Supabase - Backend as a service
- PostgreSQL - Database
- Row Level Security (RLS) - Row-level security
- Storage - File storage (avatars)
- Auth - OAuth authentication
- PostgreSQL (via Supabase)
- Triggers and Functions - Business logic in DB
- RLS Policies - Row-level security
- Google Gemini AI - CV analysis and improvement
- Logo.dev API - Company logo extraction
- Upstash Redis - Rate limiting and cache
- Docker & Docker Compose - Containerization
- ESLint - Code linting
- Turbopack - Fast bundler
- CSRF Protection - CSRF attack protection
- Rate Limiting - Request limiting
- Input Validation - Input validation
- XSS Protection - Sanitization with DOMPurify
- UUID Validation - ID validation
- Error Handling - Secure error handling
JobQuest/
├── src/
│ ├── app/ # Next.js App Router
│ │ ├── (protected)/ # Protected routes
│ │ │ ├── dashboard/ # Main dashboard
│ │ │ ├── profile/ # User profile
│ │ │ ├── cv-builder/ # CV builder
│ │ │ ├── job-openings/ # Job offers
│ │ │ ├── gamification/ # Gamification
│ │ │ └── layout.tsx # Protected layout
│ │ ├── api/ # API Routes
│ │ │ ├── user/ # User
│ │ │ ├── profile/ # Profile
│ │ │ ├── gamification/ # Gamification
│ │ │ ├── cv/ # CV (all sections)
│ │ │ ├── job-offers/ # Offers
│ │ │ ├── interviews/ # Interviews
│ │ │ ├── contacts/ # Contacts
│ │ │ ├── ai/ # AI
│ │ │ ├── logo-extraction/ # Logos
│ │ │ └── dashboard/ # Dashboard
│ │ ├── auth/ # Authentication
│ │ └── layout.tsx # Root layout
│ ├── components/ # React components
│ │ ├── cv/ # CV components
│ │ ├── job-offers/ # Job offer components
│ │ ├── Sidebar.tsx # Sidebar
│ │ ├── OnboardingModal.tsx # Onboarding modal
│ │ └── CSRFProvider.tsx # CSRF provider
│ ├── contexts/ # React contexts
│ │ └── ToastContext.tsx # Notification system
│ ├── hooks/ # Custom Hooks
│ │ ├── useGamification.ts # Gamification hook
│ │ ├── useAIInsights.ts # AI insights hook
│ │ └── useAISectionImprover.ts # AI improvement hook
│ ├── lib/ # Utilities and services
│ │ ├── supabase/ # Supabase client
│ │ ├── ai/ # AI service
│ │ ├── auth/ # Authentication actions
│ │ ├── logo-extraction.ts # Logo extraction
│ │ └── utils/ # Utilities
│ │ ├── csrf.ts # CSRF
│ │ ├── rate-limit.ts # Rate limiting
│ │ ├── error-handler.ts # Error handling
│ │ ├── uuid-validator.ts # UUID validation
│ │ ├── input-validator.ts # Input validation
│ │ └── request-validator.ts # Request validation
│ ├── config/ # Configurations
│ │ ├── gamification/ # Gamification config
│ │ └── ai/ # AI prompts
│ ├── middleware.ts # Next.js middleware
│ └── middleware/ # Custom middlewares
│ ├── csrf.ts # CSRF middleware
│ └── rate-limit.ts # Rate limit middleware
├── supabase_*.sql # Supabase SQL scripts
├── docker-compose.yml # Docker Compose
├── Dockerfile # Dockerfile
├── package.json # Dependencies
└── README.md # This file
- User signs in with Google OAuth
- Supabase handles authentication
- Middleware verifies session on each request
- Protected routes require authentication
- API routes validate user with Supabase
Client (React)
↓
Next.js API Routes
↓
Supabase Client (Server)
↓
PostgreSQL (with RLS)
-
Middleware Layer
- CSRF protection
- Rate limiting
- Session validation
-
API Layer
- Authentication checks
- Input validation
- UUID validation
- Ownership validation
- Error sanitization
-
Database Layer
- Row Level Security (RLS)
- Policies per table
- Triggers for business logic
Create a .env.local file with the following variables:
# Supabase
NEXT_PUBLIC_SUPABASE_URL=your_supabase_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
SUPABASE_SERVICE_ROLE_KEY=your_service_role_key
# Google Gemini AI
GEMINI_API_KEY=your_gemini_api_key
GEMINI_MODEL=gemini-2.5-flash
# Logo.dev
LOGO_DEV_API_KEY=your_logo_dev_api_key
# Upstash Redis (for rate limiting)
UPSTASH_REDIS_REST_URL=your_upstash_redis_url
UPSTASH_REDIS_REST_TOKEN=your_upstash_redis_tokenSee CONFIGURACION_VARIABLES_ENTORNO.md for more details.
Execute the following SQL scripts in Supabase (in order):
supabase_setup.sql- Initial setupsupabase_gamification.sql- Gamification modulesupabase_cv_builder.sql- CV buildersupabase_job_offers.sql- Job offerssupabase_interviews.sql- Interviewssupabase_job_offer_contacts.sql- Contactssupabase_ai_insights.sql- AI insightssupabase_job_offers_website_migration.sql- Website migration
# Install dependencies
npm install
# Run in development
npm run dev
# Build for production
npm run build
# Run in production
npm start
# Linting
npm run lint# Build image
docker-compose build
# Run container
docker-compose up
# Run in background
docker-compose up -d-
CSRF Protection
- CSRF tokens in cookies
- Validation in middleware
- Required headers for mutations
-
Rate Limiting
- Upstash Redis for rate limiting
- Limits per endpoint type
- Memory fallback in development
-
Input Validation
- Type validation
- Length validation
- UUID validation
- URL and email validation
- Enum validation
-
XSS Protection
- DOMPurify for sanitization
- HTML validation before rendering
-
Error Handling
- Generic messages in production
- Secure logging
- No exposure of sensitive information
-
Row Level Security (RLS)
- Policies per table
- Users only access their data
- Ownership validation in API
-
File Upload Security
- MIME type validation
- Size validation
- Random file names
Components follow a modular structure:
- Pages:
src/app/(protected)/*/page.tsx - Components:
src/components/*/ - Hooks:
src/hooks/*.ts - API Routes:
src/app/api/*/route.ts
- Create table in Supabase
- Create API route in
src/app/api/cv/[section]/route.ts - Create component in
src/components/cv/[Section]Section.tsx - Create modal in
src/components/cv/[Section]Modal.tsx - Add to
src/app/(protected)/cv-builder/page.tsx - Add gamification events
- Add event in
src/config/gamification/events.ts - Add XP reward
- Call
recordEventin the appropriate place
- Rate Limiting:
/test-rate-limit - Toasts:
/test-toasts
This project is private and for personal use.
Developed as a personal project for career management.
Last updated: December 2024