An AI-powered career growth platform helping students and professionals discover skills, learn efficiently, and land their dream jobs.
π Live Demo β’ π Documentation β’ π Report Bug β’ β¨ Request Feature
Click to expand/collapse
π οΈ Additional Features (Click to expand)
| Feature | Description | Status |
|---|---|---|
| β ATS Resume Checker | Optimize for Applicant Tracking Systems | π’ Live |
| π€ Code Twin AI | Your AI-powered coding assistant | π’ Live |
| π Progress Tracking | Visual insights into your learning journey | π’ Live |
| π Smart Job Search | Filter, save, and quick-apply to jobs | π’ Live |
| π― Goal Milestones | Set and track career objectives | π’ Live |
| π Dark Mode | Beautiful dark/light theme support | π’ Live |
| π§ Email Verification | Secure account verification | π’ Live |
| πΎ Save Jobs | Bookmark jobs for later | π’ Live |
| π± Responsive Design | Works on all devices | π’ Live |
Before you begin, ensure you have the following installed:
β
Node.js 18+ (Download from https://nodejs.org/)
β
npm, yarn, or pnpm package manager
β
MongoDB (Local installation or MongoDB Atlas account)
β
Git (For version control)Step 1: Clone the Repository
# HTTPS
git clone https://github.com/Abdulbasit219/Ai-Coding-Assistant-FYP.git
# SSH
git clone git@github.com:Abdulbasit219/Ai-Coding-Assistant-FYP.git
# GitHub CLI
gh repo clone Abdulbasit219/Ai-Coding-Assistant-FYP
cd Ai-Coding-Assistant-FYPStep 2: Install Dependencies
# Using npm
npm install
# Using yarn
yarn install
# Using pnpm
pnpm installStep 3: Environment Configuration
Create a .env.local file in the root directory:
# ποΈ Database Configuration
MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/upskaleai
# Alternative: For local MongoDB
# MONGODB_URI=mongodb://localhost:27017/upskaleai
# π Authentication
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=your-super-secret-key-here-min-32-chars
# π€ Google AI Configuration (for AI features)
GOOGLE_API_KEY=your-google-ai-api-key-here
# π§ Email Service (Nodemailer)
EMAIL_USER=your_email@gmail.com
EMAIL_PASSWORD=your_app_specific_password
# π§ Alternative: Resend (Optional)
RESEND_API_KEY=your-resend-api-key
# βοΈ Cloudinary (for file uploads)
CLOUDINARY_CLOUD_NAME=your_cloud_name
CLOUDINARY_API_KEY=your_api_key
CLOUDINARY_API_SECRET=your_api_secret
# π API Configuration
NEXT_PUBLIC_API_URL=http://localhost:3000/apiπ‘ Pro Tips:
- Use
openssl rand -base64 32to generate a secureNEXTAUTH_SECRET- For Gmail, use App Passwords
- Get Google AI API key from Google AI Studio
- Sign up for Cloudinary for free image hosting
Step 4: Start Development Server
# Development mode
npm run dev
# Development with Turbopack (faster)
npm run dev -- --turbopack
# Production build
npm run build
npm run startπ Success! Navigate to http://localhost:3000
Step 5: Setup Python Microservices (Optional/Recommender)
# Navigate to the recommender service
cd python-services/recommender_service
# Create and activate virtual environment
python -m venv venv
# Windows:
.\venv\Scripts\activate
# Linux/Mac:
# source venv/bin/activate
# Install requirements
pip install -r requirements.txt
# Start the service
uvicorn main:app --reload --port 8000π Success! Navigate to http://localhost:3000 for the main app and http://localhost:8000/docs for the AI API docs.
Click to view detailed structure
Ai-Coding-Assistant-FYP/
β
βββ π src/
β βββ π app/ # Next.js App Router (UI & Auth)
β βββ π api/ # Next.js Serverless Functions
β βββ π components/ # React UI Components (Shadcn/UI)
β βββ π lib/ # Database & API Configs
β βββ π models/ # Mongoose User/Job Models
β βββ π store/ # Redux State Management
β
βββ π python-services/ # Python Microservices
β βββ π recommender_service/ # AI Job Matching (FastAPI)
β βββ π resume_service/ # PDF Parsing Logic
β βββ π ai_service/ # LLM Integration Helpers
β
βββ π public/ # Static assets
βββ π emails/ # Nodemailer Templates
βββ βοΈ .env.local # Environment variables
βββ π¨ tailwind.config.js # Tailwind configuration
βββ π README.md # This file
AuthUser Model
{
username: String (unique, required),
email: String (unique, required),
password: String (hashed, required),
isAdmin: Boolean (default: false),
isVerified: Boolean (default: false),
verifyCode: String,
verifyCodeExpiry: Date,
timestamps: true
}Job Model
{
title: String (required),
company: String (required),
logo: String (default: "πΌ"),
location: String (required),
remote: Boolean (default: false),
type: Enum ["Full-time", "Part-time", "Contract", "Internship"],
experience: String (required),
salary: String (required),
description: String (required),
requirements: [String],
responsibilities: [String],
skills: [String] (required),
featured: Boolean (default: false),
urgent: Boolean (default: false),
category: Enum ["tech", "intern", "remote", "design", "marketing", "sales", "other"],
status: Enum ["active", "closed", "draft"],
applicants: Number (default: 0),
postedBy: ObjectId (ref: AuthUser),
companyWebsite: String,
applicationDeadline: Date,
benefits: [String],
timestamps: true
}Indexes:
- Text search:
title,company,description - Compound:
category + status,remote,createdAt
JobApplication Model
{
job: ObjectId (ref: Job, required),
user: ObjectId (ref: AuthUser, required),
coverLetter: String (required),
resume: String (URL, required),
status: Enum ["pending", "reviewing", "shortlisted", "rejected", "accepted"],
answers: Map<String, String>,
notes: String,
appliedAt: Date (default: now),
timestamps: true
}Indexes:
- Unique:
job + user(prevent duplicate applications) - Compound:
user + status,job + status
Authentication Endpoints
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| POST | /api/user/signup |
Create new account | No |
| POST | /api/auth/[...nextauth] |
Sign in (NextAuth) | No |
| POST | /api/verify-code |
Verify email code | No |
| POST | /api/resend-code |
Resend verification | No |
| GET | /api/check-username-unique |
Check username availability | No |
Job Endpoints
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| GET | /api/jobs |
Get all jobs (filtered) | No |
| GET | /api/jobs/[id] |
Get single job | No |
| POST | /api/jobs/create |
Create job (admin) | Yes (Admin) |
| PUT | /api/jobs/update/[id] |
Update job (admin) | Yes (Admin) |
| DELETE | /api/jobs/update/[id] |
Delete job (admin) | Yes (Admin) |
| POST | /api/jobs/apply |
Apply to job | Yes |
| GET | /api/jobs/applications |
Get user's applications | Yes |
| GET | /api/jobs/match |
Get matched jobs | Yes |
| GET | /api/jobs/saved |
Get saved jobs | Yes |
| POST | /api/jobs/saved |
Save a job | Yes |
| DELETE | /api/jobs/saved/[id] |
Unsave a job | Yes |
Company Endpoints
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| GET | /api/company/jobs |
Get company's posted jobs | Yes (Admin) |
| GET | /api/company/applications |
Get applications for company | Yes (Admin) |
AI & Utility Endpoints
| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| POST | /api/analyze-resume |
AI resume analysis | Yes |
| POST | /api/upload |
File upload | Yes |
GET /api/jobs - Fetch jobs with filtering
Query Parameters:
{
search: string, // Search in title, company, description
category: string, // "tech" | "intern" | "remote" | "design" | "marketing" | "sales" | "other"
type: string, // "Full-time" | "Part-time" | "Contract" | "Internship"
remote: boolean, // true | false
featured: boolean, // true | false
page: number, // Default: 1
limit: number, // Default: 10, Max: 100
sortBy: string // "recent" | "salary" | "match"
}Response:
{
"success": true,
"data": {
"jobs": [
{
"id": "6501234567890abcdef12345",
"title": "Senior Full Stack Developer",
"company": "TechCorp",
"logo": "πΌ",
"location": "San Francisco, CA",
"remote": true,
"type": "Full-time",
"experience": "5+ years",
"salary": "$120k - $180k",
"description": "We are looking for...",
"skills": ["React", "Node.js", "MongoDB"],
"featured": true,
"urgent": false,
"category": "tech",
"status": "active",
"applicants": 42,
"match": 85,
"posted": "2 days ago",
"createdAt": "2024-11-28T10:00:00.000Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 156,
"totalPages": 16
}
}
}POST /api/jobs/apply - Submit job application
Headers:
Authorization: Bearer <session-token>
Content-Type: application/json
Request Body:
{
"jobId": "6501234567890abcdef12345",
"coverLetter": "I am excited to apply...",
"resume": "https://cloudinary.com/resume.pdf",
"answers": {
"Why do you want to work here?": "Because...",
"What is your expected salary?": "$150k"
},
"notes": "Available to start immediately"
}Response:
{
"success": true,
"message": "Application submitted successfully",
"data": {
"_id": "6501234567890abcdef67890",
"job": "6501234567890abcdef12345",
"user": "6501234567890abcdef11111",
"status": "pending",
"appliedAt": "2024-11-30T12:00:00.000Z"
}
}Deploy to Vercel
-
Push to GitHub:
git add . git commit -m "Ready for deployment" git push origin main
-
Import to Vercel:
- Go to vercel.com
- Click "New Project"
- Import your GitHub repository
- Configure environment variables
- Deploy!
-
Environment Variables: Add all variables from
.env.localto Vercel:- Go to Project Settings β Environment Variables
- Add each variable
-
Custom Domain (Optional):
- Go to Project Settings β Domains
- Add your custom domain
Setup MongoDB Atlas
-
Create Account:
- Go to mongodb.com/cloud/atlas
- Sign up for free
-
Create Cluster:
- Choose free tier (M0)
- Select region closest to your users
- Create cluster
-
Setup Database Access:
- Database Access β Add New Database User
- Create username and password
- Grant read/write permissions
-
Setup Network Access:
- Network Access β Add IP Address
- Allow access from anywhere:
0.0.0.0/0
-
Get Connection String:
- Clusters β Connect β Connect your application
- Copy connection string
- Replace
<password>with your password - Add to
MONGODB_URIin Vercel
-
MONGODB_URI- MongoDB connection string -
NEXTAUTH_URL- Your production URL -
NEXTAUTH_SECRET- Random secret (32+ chars) -
GOOGLE_API_KEY- Google AI API key -
EMAIL_USER- Email for sending verification -
EMAIL_PASSWORD- Email app password -
CLOUDINARY_CLOUD_NAME- Cloudinary cloud name -
CLOUDINARY_API_KEY- Cloudinary API key -
CLOUDINARY_API_SECRET- Cloudinary API secret
We love contributions! Here's how you can help:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature
- Make your changes
- Commit your changes:
git commit -m "Add amazing feature" - Push to your fork:
git push origin feature/amazing-feature
- Open a Pull Request
- Use ESLint for code linting
- Follow existing code patterns
- Write meaningful commit messages
- Add comments for complex logic
- Update documentation as needed
Found a bug? Please open an issue with:
- Clear description
- Steps to reproduce
- Expected vs actual behavior
- Screenshots (if applicable)
- Environment details
This project is licensed under the MIT License - see the LICENSE file for details.
Special thanks to:
- Next.js - The React Framework
- Tailwind CSS - Utility-first CSS
- MongoDB - Database
- Vercel - Hosting
- Cloudinary - Image hosting
- All our contributors and supporters!
If you find this project helpful, please give it a βοΈ
Made with π and β by the UpSkaleAI Team








