An AI-powered career mentor platform for students and early-career professionals. Build a standout resume, discover skill gaps, generate personalized career roadmaps, practice AI mock interviews, track job applications, and chat with an AI mentor — all in one place.
- AI Resume Analyzer – Upload your resume (PDF/DOCX/text), get an ATS score, structured review, and personalized fixes.
- Resume Builder – Guided editor with live preview, three professional templates, and HTML export.
- Job Analyzer – Paste a job description and get a breakdown of required skills, a match score against your profile, and missing skills.
- Skill Gap Analysis – See which skills you're missing for your target role.
- Career Roadmap – Phase-by-phase personalized roadmap with progress tracking.
- Career Recommendations – Ranked role suggestions based on your skills and interests.
- Mock Interviews – AI-generated role-based questions, answer evaluation with scores, and a final performance report.
- Application Tracker – Track companies, applied dates, statuses, and analytics.
- AI Career Mentor – Conversational chat with an AI that knows your profile context.
- FastAPI + Pydantic v2
- SQLAlchemy 2.x ORM
- PostgreSQL (SQLite fallback for local development)
- JWT authentication (python-jose) + bcrypt password hashing
- Google Gemini for all AI features (pluggable provider)
- slowapi rate limiting, dependency injection, structured error handling
- React 18 + TypeScript
- Vite 6 + Tailwind CSS 3
- react-router-dom v7, axios, react-hook-form, zod
- Recharts data visualizations
- Full dark/light theme support
CareerPilot AI/
├── backend/
│ ├── app/
│ │ ├── ai/ # Gemini provider, prompts, feature engines
│ │ ├── api/routes/ # auth, profile, onboarding, resume, jobs,
│ │ │ # skills, career, interviews, applications,
│ │ │ # chat, dashboard
│ │ ├── core/ # config, security (JWT/bcrypt)
│ │ ├── database/ # DB session, models
│ │ ├── models/ # SQLAlchemy models
│ │ ├── schemas/ # Pydantic schemas
│ │ ├── services/ # profile context, completion scoring
│ │ └── utils/ # helpers
│ ├── tests/ # pytest API tests (mocked AI)
│ ├── requirements.txt
│ ├── Dockerfile
│ ├── run.py # uvicorn launcher (works with spaces in path)
│ └── seed.py # demo data (demo@careerpilot.ai / demo1234)
├── frontend/
│ ├── src/
│ │ ├── components/ # UI kit, Logo
│ │ ├── context/ # Auth, Theme, Toast providers
│ │ ├── hooks/ # useFetch, useRequireAuth
│ │ ├── layouts/ # Dashboard + Auth layouts
│ │ ├── pages/ # All feature pages
│ │ ├── services/ # typed API client
│ │ ├── types/ # shared TypeScript types
│ │ ├── charts/ # Recharts wrappers
│ │ ├── App.tsx # routing
│ │ └── main.tsx # entry point
│ ├── Dockerfile
│ └── vite.config.ts
├── docker-compose.yml
└── README.md
- Python 3.10+ (developed on 3.14)
- Node.js 18+ (developed on 25)
- (Optional) Docker + Docker Compose
cd backend
python -m venv .venv
.venv\Scripts\activate # Windows
# source .venv/bin/activate # macOS/Linux
pip install -r requirements.txt
copy .env.example .env # Windows
# cp .env.example .env # macOS/LinuxEdit backend/.env:
# Copy from .env.example and adjust
DATABASE_URL=sqlite:///./careerpilot.db # default local; see Postgres below
GEMINI_API_KEY=your_gemini_api_key # required for AI features
JWT_SECRET=change-me-to-a-long-random-string
RATE_LIMIT_ENABLED=false # true in productionStart the API:
python run.pyThe API runs at http://127.0.0.1:8000. Interactive docs: http://127.0.0.1:8000/docs.
AI features (resume analysis, job analysis, roadmap, interviews, chat) return a clear error message until
GEMINI_API_KEYis set.
cd frontend
npm install
npm run devOpen http://localhost:5173. Vite proxies /api to the backend.
cd backend
python seed.pyLog in with demo@careerpilot.ai / demo1234.
Create a database and set:
DATABASE_URL=postgresql+psycopg://USER:PASSWORD@localhost:5432/careerpilotTables are created automatically on startup.
cd backend
.venv\Scripts\python.exe -m pytest tests -qFrontend type-check and build:
cd frontend
npm run lint # tsc --noEmit
npm run build # tsc -b && vite builddocker compose up --buildpostgres– PostgreSQL 16 serverbackend– FastAPI on port 8000frontend– nginx serving the Vite build on port 8080
The frontend build is served by nginx with /api requests proxied to the backend service.
Set GEMINI_API_KEY and JWT_SECRET in the backend service environment (or a .env
file next to docker-compose.yml) before starting the AI features.
Base path: /api (auth via Authorization: Bearer <token>)
| Area | Endpoints |
|---|---|
| Auth | POST /auth/register, POST /auth/login, GET /auth/me |
| Profile | GET/PUT /profile, POST /onboarding, GET /onboarding/status |
| Resume | GET/POST /resume, PUT/DELETE /resume/{id}, POST /resume/analyze, GET /resume/analysis/history |
| Jobs | POST /jobs/analyze, GET /jobs/analysis/history |
| Skills | POST /skills/gap |
| Career | POST /career/roadmap, GET /career/roadmap/{id}, PUT /career/roadmap/{id}/progress, GET /career/roadmaps, POST /career/recommend |
| Interviews | POST /interviews, POST /interviews/{id}/answer, GET /interviews/{id}, POST /interviews/{id}/complete, GET /interviews |
| Applications | GET/POST /applications, PUT/DELETE /applications/{id}, GET /applications/stats |
| Chat | GET/POST /chat/conversations, GET/DELETE /chat/conversations/{id}, POST /chat/conversations/{id}/messages |
| Dashboard | GET /dashboard/overview |
| Health | GET /health |
| Variable | Description | Default |
|---|---|---|
DATABASE_URL |
SQLAlchemy database URL | sqlite:///./careerpilot.db |
GEMINI_API_KEY |
Google Gemini API key | (empty) |
GEMINI_MODEL |
Gemini model name | gemini-3.5-flash |
JWT_SECRET |
HMAC secret for JWT signing | random per install |
ACCESS_TOKEN_EXPIRE_MINUTES |
JWT lifetime | 10080 (7 days) |
RATE_LIMIT_ENABLED |
Enable slowapi rate limiting | false |
FRONTEND_ORIGINS |
Comma-separated allowed CORS origins | localhost:5173, localhost:8080 |
- Point
FRONTEND_ORIGINSat your production domain. - Set
RATE_LIMIT_ENABLED=trueunder load. - Use a strong random
JWT_SECRETand a managed PostgreSQL instance. - Serve
/docsbehind auth if exposing the API publicly, or disable it in production.