A comprehensive Node.js/Express backend platform that scrapes job listings from multiple sources and provides AI-powered resume analysis and matching. Built for job seekers to find opportunities and optimize their applications.
- β Job Scraping - Automated scraping from Indeed, RemoteOK, and WeWorkRemotely
- β Resume Upload & Parsing - PDF/DOCX support with text extraction
- β AI Resume Analysis - Match resumes against job descriptions (OpenAI, Gemini, Cohere, n8n)
- β Subscription System - Free and Pro plans with credit management
- β Payment Integration - Paystack integration for Pro upgrades
- β Admin Dashboard - User management, stats, and manual scraping triggers
- β Apply to Jobs - Apply with or without resume analysis
- β Application Tracking - View application history and status
- β Saved Jobs - Bookmark jobs for later
- β Password Recovery - Forgot/reset password via email
- β Google OAuth - One-click login with Google
- β Email Notifications - Welcome emails, password reset, application confirmations
π View Phase 1 Implementation Details
- Runtime: Node.js v20
- Framework: Express.js
- Database: PostgreSQL
- Authentication: JWT + Passport.js (Google OAuth)
- AI Services: OpenAI, Google Gemini, Cohere
- Scraping: Playwright
- Email: Nodemailer
- Payment: Paystack
git clone <repository-url>
cd indeed-job-scrapernpm installCopy .env.example to .env and fill in your credentials:
cp .env.example .envRequired variables:
- Database credentials (PostgreSQL)
- JWT secret
- AI API keys (OpenAI, Gemini, Cohere)
- Google OAuth credentials (for Phase 1)
- Email configuration (for Phase 1)
# Run Phase 1 migrations
node db/phase1_migrations.js
# Verify database schema
node check_db.js# Development mode
npm run dev
# Production mode
npm startServer runs on: http://localhost:4000
- Phase 1 Implementation - Detailed feature documentation
- Testing Guide - API testing instructions
- Google OAuth Setup - Step-by-step OAuth configuration
- Feature Gap Analysis - Complete feature roadmap
- Quick Implementation Guide - Quick reference
POST /auth/register - Register new user
POST /auth/login - Login with email/password
GET /auth/profile - Get user profile (protected)
POST /auth/forgot-password - Request password reset
POST /auth/reset-password/:token - Reset password with token
POST /auth/change-password - Change password (protected)
GET /auth/google - Google OAuth login
GET /auth/google/callback - Google OAuth callback
GET /jobs - List all jobs (with filters)
GET /jobs/:id - Get job details
POST /jobs/:id/parse - Parse job description
POST /jobs/:id/scrape-detail - Scrape job details
POST /jobs/:id/analyze-resume - Analyze resume for job (protected)
POST /applications/jobs/:id/apply - Apply to job (protected)
GET /applications - Get application history (protected)
GET /applications/:id - Get application details (protected)
PUT /applications/:id/withdraw - Withdraw application (protected)
GET /applications/jobs/:id/status - Check application status (protected)
POST /saved-jobs/jobs/:id/save - Save job (protected)
DELETE /saved-jobs/jobs/:id/save - Unsave job (protected)
GET /saved-jobs - Get saved jobs (protected)
GET /saved-jobs/jobs/:id/status - Check if saved (protected)
GET /resumes - List user resumes (protected)
POST /resumes/upload - Upload resume (protected)
POST /resumes/:id/parse - Parse resume (protected)
POST /resumes/export - Export resume (protected)
GET /admin/stats - Dashboard stats (admin only)
GET /admin/users - List users (admin only)
POST /admin/users/credits - Update user credits (admin only)
POST /admin/scrape - Trigger manual scrape (admin only)
GET /admin/audit-logs - View audit logs (admin only)
POST /payment/initialize - Initialize payment (protected)
GET /payment/verify/:reference - Verify payment
See TESTING_GUIDE_PHASE1.md for detailed testing instructions.
Quick test:
# Get authentication token
curl -X POST http://localhost:4000/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"user@example.com","password":"password123"}'
# Apply to a job
curl -X POST http://localhost:4000/applications/jobs/{jobId}/apply \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"resumeId":"resume-uuid","coverLetter":"I am interested..."}'indeed-job-scraper/
βββ db/ # Database scripts
β βββ phase1_migrations.js # Phase 1 database migrations
β βββ migrations.js # Original migrations
β βββ saveJobs.js # Job saving logic
βββ scraper/ # Scraping modules
β βββ indeed.js
β βββ remoteok.js
β βββ weworkremotely.js
βββ src/
β βββ config/
β β βββ passport.js # Passport OAuth config
β βββ controllers/
β β βββ auth.controller.js # Authentication + password reset
β β βββ jobs.controller.js
β β βββ resumes.controller.js
β β βββ applications.controller.js # NEW: Phase 1
β β βββ savedJobs.controller.js # NEW: Phase 1
β β βββ analysis.controller.js
β β βββ payment.controller.js
β β βββ admin.controller.js
β βββ middlewares/
β β βββ auth.middleware.js # JWT verification, credit checks
β βββ routes/
β β βββ auth.routes.js # Auth + OAuth routes
β β βββ jobs.routes.js
β β βββ resumes.routes.js
β β βββ applications.routes.js # NEW: Phase 1
β β βββ savedJobs.routes.js # NEW: Phase 1
β β βββ payment.routes.js
β β βββ admin.routes.js
β βββ services/
β β βββ aiAnalyzer.service.js
β β βββ jobParser.service.js
β β βββ jobDetailScraper.service.js
β β βββ resumeExport.service.js
β β βββ email.service.js # NEW: Phase 1
β βββ app.js # Express app configuration
β βββ server.js # Server entry point
βββ .env # Environment variables (not in repo)
βββ .env.example # Environment template
βββ package.json
βββ README.md
Run the scraper manually:
node runner.jsThis will:
- Scrape jobs from Indeed, RemoteOK, and WeWorkRemotely
- Deduplicate results
- Save to PostgreSQL database
- Apply to jobs
- Saved jobs
- Password reset
- Google OAuth
- Email notifications
- Employer job posting
- Employer dashboard
- View job applicants
- Application status updates
- Job alerts
- Enhanced notifications
- Profile management
- Resume management
- Advanced search & filters
- Job recommendations
- Cover letter AI generator
- Interview preparation
See FEATURE_GAP_ANALYSIS.md for complete roadmap.
- Fork the repository
- Create feature branch:
git checkout -b feature/amazing-feature - Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open Pull Request
ISC
Your Name
- Job boards: Indeed, RemoteOK, WeWorkRemotely
- AI providers: OpenAI, Google Gemini, Cohere
- Payment: Paystack