Professional Skill Verification & Job Matching Platform
Bridging the Gap Between Learning and Earning
π Live Demo β’ π Documentation β’ π― Features β’ π» Installation β’ π Troubleshooting β’ β FAQ
- Overview
- Screenshots
- System Architecture
- Key Features
- Technology Stack
- User Flows
- Installation & Setup
- Environment Configuration
- Project Structure
- Database Schema
- API Integration
- Security Features
- Proctoring System
- Dashboard & Portfolio
- Job Matching System
- Configuration
- Development Guide
- Testing & Quality Assurance
- Performance Optimization
- Monitoring & Logging
- Deployment
- Common Issues & Troubleshooting
- FAQ
- Roadmap
- Support & Contact
- Contributing
- License
SkillForge is a comprehensive platform that transforms learners into verified, job-ready professionals through AI-powered skill verification, adaptive learning paths, and intelligent job matching. Our platform serves both students/learners and clients/recruiters, providing a seamless bridge between education and employment.
Transform learners into the top 1% of verified talent through:
- π AI-Personalized Learning Paths
- π‘οΈ Blockchain-Verified Credentials
- π Living Professional Identity (Skill CIBIL Score)
- π€ Smart Job Matching with Top Startups
- Students/Learners - Individuals seeking to upskill, verify their expertise, and land jobs
- Clients/Recruiters - Companies looking for verified, job-ready talent
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LANDING PAGE β
β (Public Marketing Site) β
ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β AUTHENTICATION PAGE β
β (Role-Based Login/Signup) β
βββββββββββββ¬ββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββ
β β
βΌ βΌ
βββββββββββββββββββββββββ ββββββββββββββββββββββββββ
β STUDENT/LEARNER β β CLIENT/RECRUITER β
β PATH β β PATH β
βββββββββββββββββββββββββ ββββββββββββββββββββββββββ
SkillForge Platform
β
βββ Frontend (React 18 + Vite)
β βββ Landing Page
β βββ Authentication System
β βββ Student Portal
β β βββ Onboarding (CV/Resume/GitHub)
β β βββ Dashboard/Portfolio
β β βββ Learning Paths
β β βββ Proctored Assessments
β β βββ Skill Verification
β β βββ Job Browser
β βββ Recruiter Portal
β βββ Onboarding (Company Details)
β βββ Job Posting
β βββ Candidate Matching
β βββ Applicant Review
β βββ Tracking System
β
βββ Backend API
β βββ Authentication (JWT)
β βββ User Management
β βββ Exam/Assessment Engine
β βββ Proctoring Service
β βββ Portfolio Generator
β βββ Job Matching Algorithm
β βββ Analytics Engine
β
βββ Infrastructure
βββ Database (PostgreSQL/MongoDB)
βββ File Storage (AWS S3/Cloudinary)
βββ Blockchain Integration (Credentials)
βββ AI/ML Services (Matching, Proctoring)
- π CV/Resume upload and parsing
- π» GitHub portfolio integration
- π LinkedIn profile import
- π― Skill extraction and analysis
- π Skill CIBIL Score (Dynamic Professional Reputation)
- π₯ Learning streak tracking (Duolingo-style)
- π Progress visualization
- π― Adaptive roadmap generation
- π Achievement badges
- πΉ Real-time video monitoring
- π‘οΈ AI-powered cheating detection
- Tab switching detection
- Face recognition
- Multiple person detection
- Audio anomaly detection
- π Risk scoring and analytics
- π Secure exam environment
- β Blockchain-verified certificates
- π Portfolio generation
- π Skill assessment reports
- π― Proof-of-work feed
- π Browse curated job listings
- π€ AI-powered job recommendations
- π One-click applications
- π Application tracking
- π’ Company profile setup
- π Form-based information collection
- β Verification process
- π Create detailed job listings
- π― Skill requirement specification
- π° Salary range definition
- π Timeline management
- π€ Schematic similarity-based sorting
- π Skill compatibility scoring
- π Advanced filtering
- π Candidate ranking
- π₯ Review applied students
- π View detailed portfolios
- β Skill verification status
- π¬ Direct communication
- π Application statistics
- π Job post performance
- π Hiring funnel analytics
- π― Time-to-hire metrics
| Technology | Version | Purpose |
|---|---|---|
| React | 18.2.0 | UI framework |
| Vite | 5.0.8 | Build tool & dev server |
| Framer Motion | 10.16.16 | Animations & transitions |
| Lucide React | 0.263.1 | Icon library (2.5px stroke) |
| Element | Specification |
|---|---|
| Typography | Bricolage Grotesque (900 weight) for headings, DM Sans for body |
| Color Palette (Light) | Canvas: #FDF8F1, Cards: #FFFFFF, Accent: #3B82F6 |
| Color Palette (Dark) | Canvas: #0D0D0D, Cards: #1A1A1A, Accent: #10B981 |
| Border Radius | 3rem (48px) for cards, 2rem for components |
| Button Style | Pill-shaped with 3px border, 3D shadow effect |
| Service | Purpose |
|---|---|
| RESTful API | Main backend communication |
| JWT Authentication | Secure user sessions |
| WebSocket | Real-time proctoring events |
| File Upload API | CV/Resume/Document handling |
| Feature | Implementation |
|---|---|
| Video Capture | WebRTC MediaDevices API |
| Face Detection | AI/ML model integration |
| Event Tracking | Real-time event logging |
| Risk Scoring | Algorithmic confidence scoring |
1. Landing Page
β
2. Sign Up / Login (Student Role)
β
3. Onboarding
ββ Upload CV/Resume
ββ Connect GitHub
ββ Import LinkedIn
β
4. Data Parsing & Extraction
β
5. Dashboard Generation
ββ Skill CIBIL Score
ββ Learning Roadmap
ββ Recommended Paths
β
6. Learning & Assessment
ββ Complete Projects
ββ Take Proctored Tests
ββ Earn Verifications
β
7. Portfolio Building
ββ Auto-generated Dashboard
ββ Verified Credentials
β
8. Job Discovery
ββ Browse Jobs
ββ Get Recommendations
ββ Apply with One Click
β
9. Career Success
1. Landing Page
β
2. Sign Up / Login (Recruiter Role)
β
3. Company Onboarding
ββ Company Details
ββ Verification
ββ Profile Setup
β
4. Job Posting
ββ Create Job Listing
ββ Define Requirements
ββ Set Criteria
β
5. Candidate Matching
ββ AI Sorting by Similarity
ββ Review Top Matches
ββ View Detailed Profiles
β
6. Applicant Review
ββ Check Skill Verifications
ββ Review Portfolios
ββ Access Assessments
β
7. Hiring Process
ββ Contact Candidates
ββ Schedule Interviews
ββ Make Offers
β
8. Tracking & Analytics
ββ Monitor Applications
ββ Track Performance
ββ Optimize Hiring
- Node.js 18.x or higher
- npm or yarn
- Git
- Modern web browser (Chrome, Firefox, Edge, Safari)
# 1. Clone the repository
git clone https://github.com/skillforge/skillforge-platform.git
cd skillforge-platform
# 2. Install dependencies
npm install
# 3. Configure environment variables
cp .env.example .env
# Edit .env with your configuration
# 4. Start development server
npm run dev
# 5. Open browser
# Navigate to http://localhost:5173# Build optimized production bundle
npm run build
# Preview production build
npm run preview
# Output will be in the /dist directoryCreate a .env file in the root directory:
# API Configuration
VITE_API_BASE_URL=http://127.0.0.1:8000/api
VITE_API_TIMEOUT=30000
# Proctoring Service
VITE_PROCTOR_ENABLED=true
VITE_PROCTOR_FACE_DETECTION_INTERVAL=20000
VITE_PROCTOR_VIDEO_QUALITY=medium
VITE_PROCTOR_ENCRYPTION_ENABLED=true
# Feature Flags
VITE_ENABLE_GITHUB_INTEGRATION=true
VITE_ENABLE_LINKEDIN_IMPORT=true
VITE_ENABLE_BLOCKCHAIN_VERIFICATION=true
VITE_ENABLE_JOB_MATCHING=true
VITE_ENABLE_PORTFOLIO_GENERATION=true
# Analytics
VITE_ANALYTICS_ID=your-analytics-id
VITE_ENABLE_ANALYTICS=true
# File Upload
VITE_MAX_FILE_SIZE=10485760 # 10MB
VITE_ALLOWED_FILE_TYPES=.pdf,.doc,.docx,.txt
VITE_UPLOAD_ENDPOINT=/api/upload
# Job Matching
VITE_MATCHING_ALGORITHM=semantic-similarity
VITE_MIN_MATCH_SCORE=0.7
VITE_MAX_RECOMMENDATIONS=10
# Blockchain
VITE_BLOCKCHAIN_ENABLED=true
VITE_BLOCKCHAIN_NETWORK=ethereum
VITE_BLOCKCHAIN_CONTRACT_ADDRESS=0x...
# Miscellaneous
VITE_APP_NAME=SkillForge
VITE_APP_VERSION=1.0.0
VITE_DEBUG_MODE=falseCreate a .env file in the skillforge/ directory:
# Django Configuration
DEBUG=False
SECRET_KEY=your-secret-key-here
ALLOWED_HOSTS=localhost,127.0.0.1,yourdomain.com
CORS_ALLOWED_ORIGINS=http://localhost:5173,https://yourdomain.com
# Database
DB_ENGINE=django.db.backends.postgresql
DB_NAME=skillforge_db
DB_USER=skillforge_user
DB_PASSWORD=secure_password
DB_HOST=localhost
DB_PORT=5432
# Email Configuration
EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USE_TLS=True
EMAIL_HOST_USER=your-email@gmail.com
EMAIL_HOST_PASSWORD=your-app-password
# JWT Configuration
JWT_SECRET_KEY=your-jwt-secret
JWT_ALGORITHM=HS256
JWT_EXPIRATION_HOURS=24
JWT_REFRESH_EXPIRATION_DAYS=7
# AWS/Cloud Storage
AWS_ACCESS_KEY_ID=your-access-key
AWS_SECRET_ACCESS_KEY=your-secret-key
AWS_STORAGE_BUCKET_NAME=skillforge-bucket
AWS_S3_REGION_NAME=us-east-1
# File Upload
FILE_UPLOAD_MAX_SIZE=10485760
ALLOWED_UPLOAD_EXTENSIONS=pdf,doc,docx,txt,jpg,png
# Proctoring Service
PROCTOR_API_KEY=your-proctor-api-key
PROCTOR_WEBHOOK_SECRET=your-webhook-secret
FACE_DETECTION_MODEL=mediapipe
FACE_DETECTION_THRESHOLD=0.5
# Analytics
ANALYTICS_API_KEY=your-analytics-key
LOG_LEVEL=INFO
# Blockchain
BLOCKCHAIN_ENABLED=true
BLOCKCHAIN_NETWORK=ethereum
BLOCKCHAIN_RPC_URL=http://localhost:8545
BLOCKCHAIN_CONTRACT_ADDRESS=0x...
BLOCKCHAIN_PRIVATE_KEY=your-private-key
# Redis (for caching and task queues)
REDIS_URL=redis://localhost:6379/0
CACHE_TIMEOUT=3600
# Media & Static Files
MEDIA_URL=/media/
STATIC_URL=/static/
MEDIA_ROOT=media/
STATIC_ROOT=staticfiles/
# Security
SECURE_SSL_REDIRECT=True
SESSION_COOKIE_SECURE=True
CSRF_COOKIE_SECURE=True
SECURE_HSTS_SECONDS=31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS=True
# Logging
LOG_FILE_PATH=logs/django.log
LOG_ROTATION_SIZE=10485760
LOG_RETENTION_DAYS=30
# Third-party Integrations
GITHUB_CLIENT_ID=your-github-client-id
GITHUB_CLIENT_SECRET=your-github-client-secret
LINKEDIN_CLIENT_ID=your-linkedin-client-id
LINKEDIN_CLIENT_SECRET=your-linkedin-client-secret
# Testing
TEST_ENVIRONMENT=false
TEST_EMAIL_BACKEND=django.core.mail.backends.locmem.EmailBackend- Create
.envfiles in bothFrontend/andskillforge/directories - Install PostgreSQL and create database
- Configure AWS S3 bucket for file storage
- Set up Redis server for caching
- Generate secure secret keys
- Configure email service (Gmail, SendGrid, etc.)
- Set up blockchain node/RPC endpoint
- Configure third-party integrations (GitHub, LinkedIn)
- Run database migrations
- Create superuser account for admin panel
- Test all environment variables
skillforge-platform/
βββ public/ # Static assets
β βββ assets/
β β βββ skillforge-flow.png
β βββ vite.svg
β
βββ src/ # Source code
β βββ components/ # React components
β β βββ landing/
β β β βββ Hero.jsx
β β β βββ TrustBar.jsx
β β β βββ Pipeline.jsx
β β β βββ SkillCIBIL.jsx
β β β βββ Testimonials.jsx
β β β βββ FinalCTA.jsx
β β β
β β βββ auth/
β β β βββ LoginScreen.jsx
β β β βββ SignupScreen.jsx
β β β βββ RoleSelector.jsx
β β β
β β βββ student/
β β β βββ Onboarding.jsx
β β β βββ Dashboard.jsx
β β β βββ LearningRoadmap.jsx
β β β βββ Portfolio.jsx
β β β βββ JobBrowser.jsx
β β β
β β βββ recruiter/
β β β βββ CompanyOnboarding.jsx
β β β βββ JobPosting.jsx
β β β βββ CandidateMatching.jsx
β β β βββ ApplicantReview.jsx
β β β βββ TrackingDashboard.jsx
β β β
β β βββ proctor/
β β β βββ VideoMonitor.jsx
β β β βββ EventLog.jsx
β β β βββ ProctoringSession.jsx
β β β βββ ExamSelector.jsx
β β β
β β βββ shared/
β β βββ Header.jsx
β β βββ Footer.jsx
β β βββ ThemeToggle.jsx
β β βββ AnimatedCard.jsx
β β
β βββ hooks/ # Custom React hooks
β β βββ useAuth.js
β β βββ useProctor.js
β β βββ useTheme.js
β β βββ useAPI.js
β β
β βββ services/ # API & services
β β βββ api.js # Main API service
β β βββ auth.service.js
β β βββ exam.service.js
β β βββ proctor.service.js
β β βββ job.service.js
β β
β βββ utils/ # Utility functions
β β βββ constants.js
β β βββ validators.js
β β βββ helpers.js
β β
β βββ styles/ # Global styles
β β βββ index.css
β β
β βββ App.jsx # Main App component
β βββ main.jsx # Entry point
β
βββ docs/ # Documentation
β βββ API_DOCUMENTATION.md
β βββ SETUP_GUIDE.md
β βββ CONTRIBUTING.md
β
βββ .env.example # Environment template
βββ .gitignore
βββ index.html
βββ package.json
βββ vite.config.js
βββ README.md
βββ LICENSE
User (Extended Django User)
βββ id (PK)
βββ username
βββ email
βββ password_hash
βββ first_name
βββ last_name
βββ role (student/recruiter/admin)
βββ profile_picture
βββ bio
βββ created_at
βββ updated_at
βββ is_active
Student Profile
βββ id (PK)
βββ user_id (FK)
βββ bio
βββ phone
βββ location
βββ github_url
βββ linkedin_url
βββ portfolio_url
βββ resume_url
βββ skill_cibil_score (0-1000)
βββ learning_streak
βββ verified_skills (JSON)
βββ verified_badges (JSON)
βββ created_at
βββ updated_at
Recruiter/Company Profile
βββ id (PK)
βββ user_id (FK)
βββ company_name
βββ company_size
βββ industry
βββ website
βββ location
βββ description
βββ logo_url
βββ verified
βββ created_at
Skill
βββ id (PK)
βββ name
βββ category
βββ description
βββ level (beginner/intermediate/advanced/expert)
βββ created_at
βββ updated_at
Assessment/Exam
βββ id (PK)
βββ title
βββ description
βββ duration (minutes)
βββ passing_score
βββ related_skill_id (FK)
βββ questions (JSON/Array)
βββ created_by (FK to User)
βββ status (draft/published/archived)
βββ created_at
βββ updated_at
ExamSession
βββ id (PK)
βββ exam_id (FK)
βββ student_id (FK)
βββ start_time
βββ end_time
βββ duration_seconds
βββ score
βββ status (in_progress/completed/abandoned)
βββ answers (JSON)
βββ created_at
βββ updated_at
ProctoringEvent
βββ id (PK)
βββ session_id (FK to ExamSession)
βββ event_type (TAB_SWITCH, NO_FACE, etc.)
βββ confidence (0.0-1.0)
βββ timestamp
βββ metadata (JSON)
βββ risk_score
βββ recorded_at
Job
βββ id (PK)
βββ title
βββ description
βββ company_id (FK)
βββ salary_min
βββ salary_max
βββ location
βββ job_type (full-time/part-time/contract)
βββ required_skills (JSON)
βββ preferred_skills (JSON)
βββ experience_level
βββ status (open/closed/draft)
βββ created_at
βββ expires_at
βββ updated_at
JobApplication
βββ id (PK)
βββ job_id (FK)
βββ student_id (FK)
βββ status (pending/shortlisted/rejected/offered)
βββ cover_letter
βββ match_score (0-100)
βββ applied_at
βββ response_at
βββ updated_at
Portfolio
βββ id (PK)
βββ student_id (FK)
βββ title
βββ theme
βββ sections (JSON)
βββ skills (JSON)
βββ projects (JSON)
βββ verified_badges (JSON)
βββ url_slug
βββ is_public
βββ created_at
βββ updated_at
Credential/Badge
βββ id (PK)
βββ name
βββ description
βββ icon_url
βββ skill_id (FK)
βββ issued_to_id (FK to Student)
βββ blockchain_hash
βββ qr_code
βββ issued_at
βββ expires_at
Learning Roadmap
βββ id (PK)
βββ student_id (FK)
βββ title
βββ modules (JSON)
βββ progress_percentage
βββ estimated_completion_date
βββ status (not_started/in_progress/completed)
βββ created_at
βββ updated_at
User (1) -----> (1) Student Profile
User (1) -----> (1) Recruiter Profile
User (1) -----> (N) ExamSession
User (1) -----> (N) Job (created_by)
User (1) -----> (N) Credential
Skill (1) -----> (N) Assessment
Skill (1) -----> (N) Credential
Assessment (1) -----> (N) ExamSession
ExamSession (1) -----> (N) ProctoringEvent
Job (1) -----> (N) JobApplication
Student (1) -----> (N) JobApplication
Student (1) -----> (1) Portfolio
Student (1) -----> (N) Credential
Student (1) -----> (1) Learning Roadmap
// Login
POST /api/auth/login/
Body: { username, password }
Response: { access, refresh, user }
// Logout
POST /api/auth/logout/
Headers: { Authorization: Bearer <token> }
// Refresh Token
POST /api/auth/refresh/
Body: { refresh }
Response: { access }// Get Exam List
GET /api/list/
Headers: { Authorization: Bearer <token> }
Response: [{ id, name, duration, questions }]
// Start Exam
POST /api/start/
Body: { exam_id }
Response: { session_id, exam, start_time }
// Submit Exam
POST /api/submit/
Body: { session_id, answers }
Response: { score, results }// Send Event
POST /api/event/
Body: {
session_id,
event_type, // TAB_SWITCH, NO_FACE, MULTIPLE_FACES, etc.
confidence, // 0.0 to 1.0
timestamp,
metadata
}
Response: { risk, event_id }
// Get Event History
GET /api/events/:sessionId/
Response: [{ id, type, confidence, timestamp, risk }]// Get Job Listings
GET /api/jobs/
Query: { skill, location, salary_min, salary_max }
Response: [{ id, title, company, requirements }]
// Post Job (Recruiter)
POST /api/jobs/
Body: { title, description, requirements, salary_range }
Response: { job_id, status }
// Get Matched Candidates
GET /api/jobs/:jobId/matches/
Response: [{ user_id, match_score, skills, portfolio }]
// Apply to Job (Student)
POST /api/jobs/:jobId/apply/
Body: { cover_letter, portfolio_link }
Response: { application_id, status }// Generate Portfolio
POST /api/portfolio/generate/
Body: { user_id }
Response: { portfolio_url, skill_score }
// Get Analytics
GET /api/analytics/user/:userId/
Response: {
skill_cibil_score,
learning_streak,
verified_skills,
job_applications
}import API from './services/api';
// 1. Authenticate
const loginResult = await API.Auth.login('username', 'password');
// 2. Get exams
const examsResult = await API.Exam.getExamList();
// 3. Start exam
const startResult = await API.Exam.startExam(examId);
// 4. Send proctoring events
await API.Proctor.sendEvent(
sessionId,
'TAB_SWITCH',
1.0,
{ source: 'visibility-api' }
);
// 5. Browse jobs
const jobsResult = await API.Job.getJobs({ skill: 'React' });
// 6. Apply to job
await API.Job.apply(jobId, {
coverLetter: '...',
portfolioLink: '...'
});- β JWT-based authentication with access and refresh tokens
- β Role-based access control (Student, Recruiter, Admin)
- β Secure password hashing (bcrypt)
- β HTTPS enforcement in production
- β CORS protection with whitelisted origins
- π‘οΈ Real-time monitoring with WebRTC
- π₯ Encrypted video streams
- π Tamper-proof event logging
- π Secure session management
- π Audit trail for all proctoring events
- π End-to-end encryption for sensitive data
- πΎ Secure file storage with S3/Cloudinary
- ποΈ Database encryption at rest
- π« XSS protection via Content Security Policy
- π‘οΈ SQL injection prevention via parameterized queries
- β GDPR compliant
- β Data anonymization options
- β User data export/deletion
- β Cookie consent management
- β Privacy policy enforcement
| Event Type | Description | Confidence | Risk Impact |
|---|---|---|---|
| TAB_SWITCH | User switched browser tab/window | 1.0 | High |
| NO_FACE | No face detected in video feed | 0.5-0.9 | Medium-High |
| MULTIPLE_FACES | Multiple people detected | 0.7-1.0 | High |
| LOOKING_AWAY | User not looking at screen | 0.4-0.7 | Medium |
| AUDIO_DETECTED | Unexpected audio/voice detected | 0.6-0.9 | Medium-High |
Risk Level = (
(Event Count Γ Event Weight) +
(Confidence Score Γ 0.3) +
(Time Factor Γ 0.2)
) / 100
Risk Categories:
- Low Risk: 0-0.39 (Green)
- Medium Risk: 0.40-0.69 (Yellow)
- High Risk: 0.70-1.00 (Red)-
Video Monitoring
- Real-time webcam feed
- Face detection and tracking
- Recording indicator
- Camera permission handling
-
Event Tracking
- Automatic event detection
- Manual event triggers (testing)
- Timestamp logging
- Event history
-
Analytics Dashboard
- Live risk score
- Event counter
- Event log with filtering
- Session statistics
-
Security Measures
- Tab switching detection
- Window blur monitoring
- Fullscreen enforcement (optional)
- Copy-paste blocking (optional)
- Range: 0-1000 points
- Calculation Factors:
- Technical Skills (35%)
- Project Quality (30%)
- Peer Reviews (20%)
- Learning Consistency (15%)
- Updates: Real-time based on verified achievements
- Daily activity tracking
- Duolingo-style flame icon
- Motivation system
- Streak recovery options
- 12-month visualization
- Contribution graph style
- Hover tooltips with activity count
- Color intensity based on activity level
- Personalized learning path
- Skill modules with status (completed/current/locked)
- Verification gates
- Progress tracking
- React Expert, Node.js Pro, AWS Certified, etc.
- Blockchain-verified credentials
- Shareable on LinkedIn/GitHub
- QR code for verification
Auto-generated sections:
- Personal information
- Skill CIBIL Score (prominent display)
- Verified skills with badges
- Project showcase
- Assessment results
- Proof-of-work feed
- Recommendations
Customization options:
- Theme selection
- Section ordering
- Privacy controls
- Download as PDF
Semantic Similarity Scoring
1. Extract Skills from Job Description
β
2. Extract Skills from Student Portfolio
β
3. Calculate Similarity Score
- Exact Match: 1.0
- Synonym Match: 0.9
- Related Skill: 0.7-0.8
- No Match: 0.0
β
4. Weighted Scoring
- Required Skills: 50%
- Preferred Skills: 30%
- Experience Level: 20%
β
5. Rank Candidates by Total Score
For Students:
- π― Personalized job recommendations
- π Match score visibility (0-100%)
- π Skill gap analysis
- π‘ Improvement suggestions
For Recruiters:
- π€ AI-sorted candidate list
- π Match score per candidate
- π Advanced filtering
- π Batch candidate comparison
Student View:
- Application status (Pending/Under Review/Shortlisted/Rejected)
- Application date
- Company response time
- Interview scheduling
Recruiter View:
- Total applications
- Shortlisted candidates
- Interview scheduled
- Offers made
- Time-to-hire metrics
// Light Mode Colors
const lightTheme = {
canvas: '#FDF8F1',
cardBg: '#FFFFFF',
textPrimary: '#2D1B14',
textSecondary: '#6B5B52',
accentBlue: '#3B82F6',
accentGreen: '#10B981',
accentYellow: '#FDE047'
};
// Dark Mode Colors
const darkTheme = {
canvas: '#0D0D0D',
cardBg: '#1A1A1A',
textPrimary: '#FFFFFF',
textSecondary: '#A0A0A0',
accentBlue: '#60A5FA',
accentGreen: '#34D399',
accentOrange: '#FB923C'
};// In .env or config.js
const featureFlags = {
enableProctoring: true,
enableGitHubSync: true,
enableLinkedInImport: true,
enableBlockchainVerification: true,
enableJobMatching: true,
enablePortfolioGeneration: true,
enableAnalytics: true
};// In api.js
const API_CONFIG = {
BASE_URL: process.env.VITE_API_BASE_URL,
TIMEOUT: 30000,
RETRY: {
maxAttempts: 3,
delay: 1000,
backoffMultiplier: 2
}
};- JavaScript: ES6+ with JSX
- Naming: camelCase for variables, PascalCase for components
- Comments: JSDoc for functions, inline for complex logic
- Formatting: Prettier with 2-space indentation
// Component template
import React, { useState, useEffect } from 'react';
import { motion } from 'framer-motion';
/**
* Component description
* @param {Object} props - Component props
* @param {string} props.title - Title text
* @param {Function} props.onAction - Callback function
*/
const MyComponent = ({ title, onAction }) => {
const [state, setState] = useState(initialValue);
useEffect(() => {
// Side effects
}, [dependencies]);
return (
<motion.div
className="component-class"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
>
{/* Component content */}
</motion.div>
);
};
export default MyComponent;# Run unit tests
npm run test
# Run with coverage
npm run test:coverage
# Run E2E tests
npm run test:e2e# Create feature branch
git checkout -b feature/new-feature
# Make changes and commit
git add .
git commit -m "feat: Add new feature"
# Push to remote
git push origin feature/new-feature
# Create pull request on GitHubfeat: Add new feature
fix: Bug fix
docs: Documentation update
style: Code style changes
refactor: Code refactoring
test: Add tests
chore: Build/tooling changes
# Install Vercel CLI
npm install -g vercel
# Deploy to production
vercel --prod
# Set environment variables
vercel env add VITE_API_BASE_URL production# Install Netlify CLI
npm install -g netlify-cli
# Build and deploy
npm run build
netlify deploy --prod --dir=dist# Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
EXPOSE 5173
CMD ["npm", "run", "preview"]# Build Docker image
docker build -t skillforge:latest .
# Run container
docker run -p 5173:5173 skillforge:latest# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '18'
- run: npm ci
- run: npm run build
- run: npm run test
- uses: vercel/actions@v1
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}// Lazy loading components
const Dashboard = React.lazy(() => import('./components/Dashboard'));
const Proctor = React.lazy(() => import('./components/Proctor'));
// Usage with Suspense
<Suspense fallback={<LoadingSpinner />}>
<Dashboard />
</Suspense>- β Lazy load routes and heavy components
- β Use React.memo for expensive renders
- β Implement virtualization for long lists
- β Optimize images (WebP, lazy loading)
- β Minimize bundle size (tree shaking)
- β Use CDN for static assets
- β Enable compression (gzip/brotli)
- β Implement service worker caching
| Metric | Target | Current |
|---|---|---|
| First Contentful Paint | <1.5s | 1.2s |
| Time to Interactive | <3.5s | 2.8s |
| Largest Contentful Paint | <2.5s | 2.1s |
| Cumulative Layout Shift | <0.1 | 0.05 |
| Total Bundle Size | <300KB | 245KB |
# Run unit tests with Vitest
npm run test
# Run unit tests in watch mode
npm run test:watch
# Run tests with coverage report
npm run test:coverage
# Run E2E tests with Playwright
npm run test:e2e
# Run linting checks
npm run lint
# Fix linting issues automatically
npm run lint:fix
# Format code with Prettier
npm run format
# Check code formatting without changes
npm run format:check# Run Django tests
python manage.py test
# Run tests with coverage
coverage run --source='.' manage.py test
coverage report
# Run specific test module
python manage.py test skillforge.accounts.tests
# Run with verbose output
python manage.py test --verbosity=2
# Run tests in parallel (faster)
python manage.py test --parallel- Minimum Coverage: 80% across all modules
- Critical Paths: 100% (authentication, payments, security)
- UI Components: 75% snapshot + interaction tests
- API Endpoints: 90% happy path + error cases
- All unit tests passing
- All integration tests passing
- All E2E tests passing
- Code coverage meets minimum threshold
- No ESLint warnings/errors
- No unanswered TypeScript issues
- Security vulnerabilities scanned (
npm audit) - Performance benchmarks met
- Accessibility score (axe-core) > 90
- Cross-browser compatibility verified
- Mobile responsiveness verified
- API documentation updated
- CHANGELOG updated
The project uses Husky to run checks before commits:
# Install husky
npm install husky --save-dev
husky install
# Hooks automatically run:
# - lint-staged (format and lint changed files)
# - Unit tests for changed files// Error tracking with Sentry
import * as Sentry from "@sentry/react";
Sentry.init({
dsn: "your-sentry-dsn",
environment: process.env.NODE_ENV,
tracesSampleRate: 1.0,
integrations: [
new Sentry.Replay({
maskAllText: true,
blockAllMedia: true,
}),
],
});
// Performance monitoring
const perfObserver = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
console.log(`${entry.name}: ${entry.duration}ms`);
}
});
perfObserver.observe({ entryTypes: ["measure", "navigation"] });# Django logging configuration
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '[{levelname}] {asctime} {name} {funcName} {lineno} {message}',
'style': '{',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'verbose',
},
'file': {
'class': 'logging.handlers.RotatingFileHandler',
'filename': 'logs/django.log',
'maxBytes': 1024 * 1024 * 10, # 10MB
'backupCount': 5,
'formatter': 'verbose',
},
},
'loggers': {
'django': {
'handlers': ['console', 'file'],
'level': 'INFO',
},
'skillforge': {
'handlers': ['console', 'file'],
'level': 'DEBUG',
},
},
}Frontend Metrics:
- Page Load Time
- Time to Interactive (TTI)
- First Contentful Paint (FCP)
- Cumulative Layout Shift (CLS)
- JavaScript Error Rate
- API Response Times
- User Session Duration
Backend Metrics:
- API Response Times (p50, p95, p99)
- Error Rate by Endpoint
- Database Query Performance
- Cache Hit Ratio
- Queue Processing Time
- Memory Usage
- CPU Usage
- Active Connections
Business Metrics:
- User Signup Conversion Rate
- Assessment Completion Rate
- Job Application Success Rate
- Candidate Matching Accuracy
- User Retention Rate
# Backend monitoring options
- Prometheus + Grafana (metrics)
- ELK Stack (logs)
- Jaeger (distributed tracing)
- New Relic (APM)
- DataDog (monitoring)
# Frontend monitoring options
- Sentry (error tracking)
- LogRocket (session replay)
- Datadog RUM (real user monitoring)
- Google Analytics (business metrics)Solution:
# Clear cache and rebuild
rm -rf node_modules dist
npm install
npm run build
# Check environment variables are set correctly
# Verify VITE_API_BASE_URL is correctSolution:
// Frontend: Check API client configuration
// Verify VITE_API_BASE_URL matches backend CORS_ALLOWED_ORIGINS
// Backend (Django settings.py):
CORS_ALLOWED_ORIGINS = [
"http://localhost:5173",
"https://yourdomain.com",
]Solution:
// Check browser permissions
// Ensure HTTPS in production
// Verify camera and microphone are available
// Check WebRTC support in browser
// Debug in browser console:
navigator.mediaDevices.enumerateDevices().then(devices => {
console.log(devices);
});Solution:
// Check file size limit
console.log(import.meta.env.VITE_MAX_FILE_SIZE);
// Verify file type is allowed
const allowed = import.meta.env.VITE_ALLOWED_FILE_TYPES.split(',');
// Check upload endpoint configuration
// Verify server is accepting multipart/form-dataSolution:
# Check PostgreSQL is running
sudo systemctl status postgresql
# Verify database credentials in .env
# Check host, port, username, password
# Create database if missing:
createdb skillforge_db
createuser skillforge_user
psql skillforge_db
# ALTER USER skillforge_user WITH PASSWORD 'password';
# GRANT ALL PRIVILEGES ON DATABASE skillforge_db TO skillforge_user;Solution:
# Check migration status
python manage.py showmigrations
# Revert migrations if needed
python manage.py migrate <app_name> <migration_number>
# Create new migrations
python manage.py makemigrations
# Apply migrations
python manage.py migrate
# Check for unapplied migrations
python manage.py migrate --planSolution:
# Collect static files
python manage.py collectstatic --noinput
# In production, serve with whitenoise
# pip install whitenoise
# Add to Django settings:
MIDDLEWARE = [
'whitenoise.middleware.WhiteNoiseMiddleware',
...
]Solution:
# Check if Celery worker is running
celery -A skillforge worker -l info
# Check if Redis is running
redis-cli ping
# Check task queue:
celery -A skillforge inspect active
# Purge tasks if stuck:
celery -A skillforge purgeSolution:
// Refresh token automatically
const refreshToken = async () => {
const response = await fetch('/api/auth/refresh/', {
method: 'POST',
body: JSON.stringify({ refresh: localStorage.getItem('refresh_token') }),
});
const { access } = await response.json();
localStorage.setItem('access_token', access);
};Solution:
// Implement exponential backoff retry logic
const retryRequest = async (fn, maxRetries = 3) => {
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (error) {
if (error.status === 429 && i < maxRetries - 1) {
const delay = Math.pow(2, i) * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
} else {
throw error;
}
}
}
};Q: What is the minimum system requirement? A: Node.js 18+, Python 3.11+, PostgreSQL 12+, Redis 6+
Q: Can I self-host SkillForge? A: Yes, the platform is fully open-source and can be self-hosted on any cloud provider or on-premise.
Q: What payment methods are supported? A: Currently supports Stripe integration. More payment gateways can be added through the plugin system.
Q: Is SkillForge GDPR compliant? A: Yes, the platform includes GDPR compliance features including data export, deletion, and consent management.
Q: How do I set up proctoring for exams? A: Install the proctoring system, configure the face detection model, and enable in environment variables. See the Proctoring System section for details.
Q: Can I customize the job matching algorithm?
A: Yes, the matching algorithm is configurable in skillforge/modules/services.py. You can modify weights, thresholds, and algorithms.
Q: How are credentials stored and verified? A: Credentials are stored in PostgreSQL, optionally backed by blockchain. Each credential has a QR code for verification.
Q: What video conferencing integration is available? A: Currently uses WebRTC with Jitsi. Can be integrated with Zoom, Google Meet, or other providers via API.
Q: How do I integrate with GitHub for portfolio sync?
A: Configure GitHub OAuth2 credentials and enable VITE_ENABLE_GITHUB_INTEGRATION=true in environment variables.
Q: How do I deploy to production? A: Use Docker or traditional server setup. Refer to the Deployment section. Recommended: AWS ECS, Heroku, or DigitalOcean.
Q: What is the recommended database for production? A: PostgreSQL 14+. MySQL 8+ can also be used. Avoid SQLite in production.
Q: How do I set up SSL/HTTPS? A: Use Let's Encrypt with Nginx/Apache reverse proxy, or use platform-provided SSL (AWS Certificate Manager, etc.).
Q: What is the best way to backup data? A: Configure automated daily database backups. For S3, enable versioning. Monitor backup logs regularly.
Q: How many concurrent users can the system handle? A: Depends on infrastructure. A standard setup handles ~5,000 concurrent users. Scale horizontally with load balancing.
Q: How long do proctored exams take to process? A: Real-time monitoring + 2-5 minutes for result generation depending on exam complexity.
Q: What is the maximum file upload size?
A: Default is 10MB, configurable via VITE_MAX_FILE_SIZE and FILE_UPLOAD_MAX_SIZE.
Q: How often is the skill matching algorithm updated? A: Daily, with manual updates as needed. Can be configured via cron job or Celery beat.
- Core authentication system
- Proctored assessment engine
- Basic job matching
- Portfolio generation
- Skill verification
- Advanced analytics dashboard
- AI-powered learning recommendations
- Video interview integration
- Bulk candidate import (for recruiters)
- API rate limiting and monitoring
- Blockchain credential verification
- Mobile app (React Native)
- Real-time notifications (push)
- Advanced reporting for recruiters
- Skill endorsements system
- AI resume optimization suggestions
- Integration with ATS (Applicant Tracking System)
- Video assessment auto-grading
- Salary prediction model
- Enterprise SSO (SAML/OAuth)
- Gamification system (badges, leaderboards)
- Peer-to-peer mentoring
- Mock interview preparation
- Subscription tier system
- White-label platform offering
Documentation: Full Documentation
Email Support: support@skillforge.com
Discord Community: Join Discord Server
GitHub Issues: Report Issues
Twitter: @SkillForgeApp
Please report security vulnerabilities to: security@skillforge.com Do not open public issues for security concerns.
Submit feature requests via:
- GitHub Discussions
- Discord #feature-requests
- Email to features@skillforge.com
We'd love to hear from you! Share feedback at: feedback@skillforge.com
We welcome contributions from the community! Please read our Contributing Guide for details on our code of conduct and the process for submitting pull requests.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- All submissions require review from 2+ maintainers
- CI/CD checks must pass
- Code coverage must be maintained/improved
- Documentation must be updated
This project is licensed under the MIT License - see the LICENSE file for details.
MIT License
Copyright (c) 2026 SkillForge
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.






