AI-powered career operating system — personalized roadmaps, resume analysis, skill gap insights, and project recommendations for students and early-career developers.
Students and job seekers struggle to identify skill gaps, plan learning paths, and know which projects to build for their target role. UpSkillX uses AI (with reliable fallbacks) to turn a resume and career goal into an actionable plan.
- Authentication — JWT signup/login with SQLite (Prisma)
- Onboarding — Name, target role, and skill selection persisted to profile
- Resume Analyzer — PDF upload → text extraction → Gemini analysis → structured JSON
- Readiness Score — 0–100 score with status labels (Needs Improvement / Almost Ready / Internship Ready)
- Skill Gap Analysis — Current vs. missing skills for your target role
- Personalized Roadmap — Weekly topics, objectives, and tasks
- Learning Resources — Curated links by missing skills
- Recommended Projects — Role-based portfolio projects with difficulty and rationale
- Dashboard — Unified view of progress, skills, roadmap preview, and recommendations
┌─────────────┐ REST API ┌─────────────┐ Prisma ┌──────────┐
│ Next.js │ ────────────────► │ Express │ ─────────────► │ SQLite │
│ Frontend │ localhost:5000 │ Backend │ │ dev.db │
└─────────────┘ └──────┬──────┘ └──────────┘
│
▼
┌─────────────┐
│ Gemini API │ (optional)
│ + Fallback │
└─────────────┘
Frontend stores session token, profile, and latest analysis in localStorage so data survives page refresh.
| Layer | Technologies |
|---|---|
| Frontend | Next.js 16, React 19, TypeScript, Tailwind CSS 4 |
| Backend | Node.js, Express 5, TypeScript |
| Database | Prisma, SQLite |
| AI | Google Gemini (with deterministic fallback) |
| Auth | bcrypt, jsonwebtoken |
| Upload | Multer (memory storage), pdf-parse |
UpSkillX/
├── frontend/ # Next.js app
│ └── src/
│ ├── app/ # Pages (dashboard, resume, roadmap, …)
│ ├── components/
│ ├── lib/ # API client, localStorage helpers
│ └── services/
├── backend/
│ └── src/
│ ├── routes/ # API endpoints
│ ├── services/ # Business logic, AI, fallbacks
│ ├── config/ # Multer, Gemini
│ └── prisma/ # Schema + SQLite DB
└── README.md
- Node.js 18+
- npm
cd backend
npm install
cp .env.example .env
# Edit .env — set JWT_SECRET; optionally set GEMINI_API_KEY
npx prisma generate
npx prisma db push
npm run devServer runs at http://localhost:5000
cd frontend
npm install
npm run devApp runs at http://localhost:3000
Optional: set NEXT_PUBLIC_API_URL=http://localhost:5000/api in frontend/.env.local
| Variable | Required | Description |
|---|---|---|
DATABASE_URL |
Yes | file:./dev.db for SQLite |
JWT_SECRET |
Yes | Secret for signing auth tokens |
GEMINI_API_KEY |
No | Google Gemini API key (AI features) |
PORT |
No | Default 5000 |
Never commit .env or real API keys.
cd backend
npx prisma generate
npx prisma db pushSQLite database file: backend/prisma/dev.db (gitignored).
- Open http://localhost:3000 → redirects to Login
- Sign up with email/password (min 6 chars)
- Complete Onboarding — name, career goal, skills
- View Dashboard — your selected skills and role (not hardcoded placeholders)
- Go to Resume → upload PDF → enter target role → Analyze
- Review readiness, skills, missing skills, roadmap, resources, projects
- Navigate Roadmap, Resources, Projects, Readiness, Assessment
- Refresh the page — profile and analysis persist via localStorage
| Method | Endpoint | Description |
|---|---|---|
| GET | / |
API info |
| GET | /api/health |
Health check |
| POST | /api/auth/signup |
Create account |
| POST | /api/auth/login |
Login, returns JWT |
| PUT | /api/auth/profile |
Update profile (Bearer) |
| POST | /api/resume |
Multipart: resume (PDF), targetRole, optional skills |
| POST | /api/roadmap |
Generate roadmap |
| POST | /api/projects |
Project recommendations |
| POST | /api/resources |
Learning resources |
| POST | /api/readiness |
Readiness status label |
{
"summary": "string",
"targetRole": "string",
"readiness": 0,
"skills": [],
"missingSkills": [],
"roadmap": [],
"resources": [],
"projects": [],
"source": "ai | fallback"
}If any of the following occur, the API returns valid structured demo data (never a generic 500):
GEMINI_API_KEYmissing or invalid- Gemini rate limit / quota / network error
- PDF parsing fails or text is too short
- AI returns markdown fences or invalid JSON
Fallback analysis is role-based and deterministic, using target role profiles and optional resume keyword extraction. Response includes "source": "fallback".
- PostgreSQL for production
- OAuth (Google/GitHub)
- Interview prep module
- Progress tracking on roadmap items
- Email notifications and streaks
- Admin dashboard
MIT — hackathon project.