An autonomous multi-platform job hunting, AI resume tailoring, and ATS typesetting platform.
Quick Start β’ Daily Usage β’ Architecture β’ Features β’ Setup Wizard β’ CLI & Commands β’ AI Instructions
- Multi-Platform Scraper: Resilient, rate-limited scraping for LinkedIn and CareersFuture with rotating user-agents, automatic exponential backoffs, and local HTML-to-Markdown conversion (zero LLM overhead).
- Interactive 5-Step Setup Wizard: Set up Supabase, test AI model credentials, configure target locations and job queries, upload and parse your resume, and auto-provision GitHub Actions secrets in minutes.
- Master Resume Studio: Dual-mode master resume editor (
Resume Content+Design & Style) with live ATS persona switching, tag chip editors, and 1:1 pixel-calibrated PDF preview with page budget protections. - Universal LLM Engine: Native support for Google Gemini (Gemini 2.5 Flash, 3 Flash Preview), Fireworks AI, OpenAI, Anthropic Claude, and Groq, with dynamic settings and quota/RPM controls stored in Supabase.
- Automated GitHub Actions Pipeline: Autonomous scheduled workflows scrape postings, evaluate resume suitability scores (0β100), generate job-tailored PDF resumes, and expire old postings.
- Clean Fullstack Stack: High-performance Next.js 16 (React 19, Tailwind CSS v4) fullstack web application, TypeScript automation workers, and a pure TypeScript scraping engine with native browser TLS impersonation.
graph TD
subgraph Scraper ["TypeScript Scraper Engine (web/src/lib/scraper/)"]
S[scrape-jobs.ts] -->|Local node-html-markdown| S_MD[Clean Markdown Job Postings]
S -->|Dynamic Settings| DB[(Supabase PostgreSQL)]
end
subgraph WebApp ["Fullstack Web Application (web/)"]
UI[Next.js 16 UI] -->|App Router| Pages["/setup, /settings, /resume-studio, /jobs"]
API[API Route Handlers] -->|/api/*| DB
LLM[Universal LLM Engine<br/>web/src/lib/llm.ts] -->|Gemini / Fireworks / OpenAI / Claude / Groq| AI_OPS[Scoring & Tailoring]
PDF[ATS Typesetting Engine<br/>web/src/lib/pdf.ts] -->|PDFKit 1:1 Engine| RES_PDF[ATS PDF Resumes]
end
subgraph Workers ["TypeScript Batch Workers (web/scripts/)"]
W1[score-jobs.ts] -->|Evaluate Fit 0-100| DB
W2[customize-resumes.ts] -->|Tailor & Snapshot Theme| DB
W3[job-manager.ts] -->|Check Availability| DB
W4[parse-resume.ts] -->|Parse PDF to JSON| DB
end
subgraph Cloud ["Automation"]
GH[GitHub Actions CI/CD] -->|Cron Schedules| Workers
GH -->|Cron Schedule| S
end
- Fullstack Web Application (
web/):- Contains all user interface pages, REST API Route Handlers (
web/src/app/api/), universal AI integrations (web/src/lib/llm.ts), ATS PDF typesetting (web/src/lib/pdf.ts), and scheduled batch tasks (web/scripts/). - All client-to-server operations run through Next.js route handlers.
- Contains all user interface pages, REST API Route Handlers (
- TypeScript Scraping Engine (
web/src/lib/scraper/&web/scripts/scrape-jobs.ts):- Collects job postings from LinkedIn (via guest endpoints with
impitbrowser TLS/JA4 impersonation) and CareersFuture (typed REST API). - Converts HTML descriptions to Markdown locally using
node-html-markdownwithout consuming LLM quotas. - Dynamically loads search preferences directly from Supabase
app_settings. - Eliminates Python runtime requirements, virtual environments, and pip packages completely.
- Collects job postings from LinkedIn (via guest endpoints with
- Single Source of Truth (
app_settings):- Search queries, target locations, workplace filters, scraping sources, AI model choices, and rate limits are stored in the Supabase
app_settingstable and configured via the web UI.
- Search queries, target locations, workplace filters, scraping sources, AI model choices, and rate limits are stored in the Supabase
Choose the easiest installation method for your setup:
Open your terminal and paste one command:
-
Windows (PowerShell):
irm https://raw.githubusercontent.com/anandanair/job-scraper/main/install.ps1 | iex
PowerShell checks Node.js, downloads JobTrack, installs dependencies, places a JobTrack shortcut on your Desktop, and opens
http://localhost:3000/setup. -
macOS / Linux (Terminal):
curl -fsSL https://raw.githubusercontent.com/anandanair/job-scraper/main/install.sh | bash
- Download JobTrack (.zip) and extract it to any folder.
- Double-click
install.bat(Windows) or execute./install.sh(macOS/Linux). - The installer configures dependencies, adds a Desktop shortcut, and automatically opens the browser setup wizard.
Don't want to install Node.js locally? Run the entire system serverless in the cloud for free:
- Next.js UI & REST APIs: Hosted on Vercel.
- Database & Storage: Hosted on Supabase (PostgreSQL + Buckets).
- Background Scrapers & AI Workers: Autonomous cron execution via GitHub Actions.
Once installed, you never need to re-run the installer or re-install dependencies:
- Windows: Double-click the JobTrack icon on your Desktop, or double-click
start.bat. - macOS / Linux: Run
./start.shfrom the project directory.
The local web server starts instantly in a single window and opens http://localhost:3000 in your browser.
JobTrack stays up to date with zero friction:
- Automatic on Startup: Every time you launch via
start.bator./start.sh, JobTrack automatically checks GitHub for new updates, pulls changes, and refreshes dependencies. - Manual 1-Click Updater: Double-click
update.bat(Windows) or run./update.sh(macOS/Linux) anytime to pull the latest version. - Note: User settings, AI configurations, and job data reside in your Supabase database and local
.env.local, which are safely preserved across updates.
If you prefer to configure the repository manually:
git clone https://github.com/anandanair/job-scraper.git
cd job-scraper# Install application dependencies (Next.js, React, Tailwind, Scraper Engine, PDFKit)
npm run install:web- Create a free project at Supabase.
- Go to the SQL Editor (
>_icon) in your Supabase dashboard. - Open
supabase_setup/init.sql, paste its entire contents, and click Run.- This creates all tables (
jobs,base_resume,customized_resumes,resume_style_settings,app_settings,linkedin_geo_locations), indexes, and triggers (PDFs are streamed dynamically on-the-fly via PDFKit, requiring 0 storage buckets).
- This creates all tables (
Create a web/.env.local file (only Supabase credentials required):
NEXT_PUBLIC_SUPABASE_URL="https://<YOUR_PROJECT_ID>.supabase.co"
NEXT_PUBLIC_SUPABASE_ANON_KEY="sb_publishable_..."
SUPABASE_SERVICE_ROLE_KEY="sb_secret_..."(Note: All AI provider settings, API keys, search queries, and rate limits are managed in the Supabase app_settings table and configured via the interactive Setup Wizard or Settings UI.)
Create an optional root .env file (if running workers from root outside web/):
SUPABASE_URL="https://<YOUR_PROJECT_ID>.supabase.co"
SUPABASE_SERVICE_ROLE_KEY="sb_secret_..."npm run devOpen http://localhost:3000 to view your dashboard or http://localhost:3000/setup to run the wizard.
The web application includes an interactive 5-step onboarding wizard:
- Step 1: Database Setup
- Connect your Supabase Project URL and Service Role Key.
- Run or verify table schema and storage buckets directly from the browser.
- Step 2: AI Engine Configuration
- Select your provider: Google Gemini, Fireworks AI, OpenAI, Anthropic Claude, or Groq.
- Pick your desired model with intelligent auto-detection.
- Test your API key with real-time latency and connectivity checks.
- Interactive monthly budget calculator based on your expected scraping volume.
- Step 3: Job Preferences
- Search query tags (e.g.,
Full Stack Engineer,AI Engineer). - Location selector with built-in LinkedIn GeoID resolution (e.g., Singapore
102454443, United States103644278, London102257491). - Job types (Full-time, Contract, Part-time, Internship) and workplace models (On-site, Hybrid, Remote).
- Platform toggles: LinkedIn and Singapore CareersFuture.
- Search query tags (e.g.,
- Step 4: Master Resume Studio
- Upload your master PDF resume (
resume.pdf). - AI extracts text and parses it into structured JSON schema (contact info, summary, experience, skills, education, projects, certifications).
- Review, edit, and preview ATS styling presets in real time.
- Upload your master PDF resume (
- Step 5: GitHub Automation
- Provide a GitHub Personal Access Token (
reposcope). - The wizard automatically encrypts secrets using Tweetsodium (libsodium) and uploads them directly to your GitHub repository secrets:
SUPABASE_URLSUPABASE_SERVICE_ROLE_KEY
- Enables background GitHub Actions workflows with one click.
- Provide a GitHub Personal Access Token (
The built-in Resume Studio offers an end-to-end ATS resume authoring and styling workflow:
- Dual-Mode Editor:
- Resume Content: Edit career experiences, custom bullet points, skills chip tags, degrees, certifications, and portfolio links.
- Design & Style: Customize typography (Helvetica, Times-Roman, Courier), font scale (compact, normal, spacious), line height, page margins, header layouts, custom section order, section visibility, and accent colors.
- 1:1 Typesetting Engine (
web/src/lib/pdf.ts):- Built with PDFKit for strict ATS-friendliness (machine-parseable text layers, standard system fonts, zero unreadable graphical artifacts).
- Orphan heading prevention (widow/orphan rules keep section headings paired with their content across page breaks).
- Sentence-level abbreviation preservation (
e.g.,i.e.,Ph.D.,U.S.).
- Live PDF Preview: Real-time rendering inside the browser using React-PDF.
Automated background jobs run via GitHub Actions on pre-configured schedules:
| Workflow File | Name | Schedule | Description |
|---|---|---|---|
scrape_jobs.yml |
Daily Job Scraper | Daily at 7:00 PM SGT (0 11 * * *) |
Scrapes new postings from LinkedIn and CareersFuture. Matrix runner distributes search queries across parallel jobs. |
score_jobs.yml |
Job Scorer | Every 4 hours (0 */4 * * *) |
TypeScript worker evaluates unscored jobs against candidate resume (0β100 score). |
hourly_resume_customization.yml |
Resume Customization | Every 4 hours (30 */4 * * *) |
Generates job-specific tailored resumes for top-scoring jobs (score >= 70). |
job_manager.yml |
Daily Job Manager | Daily at 1:00 AM SGT (0 17 * * *) |
Verifies posting availability on LinkedIn and marks listings older than 30 days as expired. |
All workflows can also be manually dispatched at any time via the Actions tab in GitHub.
Run these commands from the repository root:
# --- Web Application & Development ---
npm run dev # Start Next.js development server (http://localhost:3000)
npm run build # Build Next.js application for production
npm run start # Run production Next.js server
npm run install:web # Install web application dependencies
# --- Job Scraper ---
npm run scrape # Run TypeScript scraper using settings from Supabase (impit + cheerio)
npm run test:scraper # Run diagnostic & parity tests on scraping engine
npm run scrape -- --source linkedin --query "Frontend Engineer" --limit 10
# --- TypeScript Automation Workers ---
npm run score # Score unscored jobs against base resume
npm run customize # Tailor custom resumes for top-matching jobs
npm run manage # Verify job availability and expire stale postings
npm run parse-resume # Parse resume.pdf into base_resume table.
βββ .github/workflows/ # Automated GitHub Actions CI/CD workflows
β βββ scrape_jobs.yml # Daily TypeScript job scraper
β βββ score_jobs.yml # TypeScript AI job scorer
β βββ hourly_resume_customization.yml # TypeScript resume tailor
β βββ job_manager.yml # TypeScript job status manager
βββ memory/ # Project Memory & Agent Knowledge Base
β βββ context.md # Living technical architecture, schema & APIs
β βββ progress_latest.md # Running monthly work log & progress tracker
β βββ archive/ # Historical monthly progress logs
βββ supabase_setup/ # Database SQL Migrations
β βββ init.sql # Complete initial schema, RPCs, and storage buckets
β βββ add_app_settings.sql # App settings schema reference
β βββ resume_style_settings.sql # Resume style schema reference
βββ web/ # Next.js 16 Fullstack Application & TS Workers
β βββ scripts/ # TypeScript batch worker scripts (run via tsx)
β β βββ customize-resumes.ts# Resume customization batch worker
β β βββ job-manager.ts # Job expiration & active status checker
β β βββ parse-resume.ts # Resume PDF parser
β β βββ score-jobs.ts # Job scoring batch worker
β βββ src/
β β βββ app/ # App Router (Pages & REST API route handlers)
β β βββ components/ # React components (setup, jobs, resume-studio, etc.)
β β βββ lib/ # Core logic (llm.ts, pdf.ts, resumeParser.ts, supabase/)
β β βββ utils/supabase/ # Supabase server & client initializers
β β βββ types.ts # Shared TypeScript interfaces & types
β βββ package.json # Web dependencies & scripts
β βββ tsconfig.json
βββ install.bat # 1-Click installer for Windows
βββ install.ps1 # 1-Line PowerShell installer for Windows
βββ install.sh # 1-Click / 1-Line installer for macOS/Linux
βββ start.bat # Instant daily launcher with auto-update (Windows)
βββ start.sh # Instant daily launcher with auto-update (macOS/Linux)
βββ update.bat # Dedicated 1-click updater for Windows
βββ update.sh # Dedicated 1-click updater for macOS/Linux
βββ package.json # Monorepo root npm scripts
βββ vercel.json # Vercel deployment configuration
βββ AGENTS.md # AI Agent & Pair Programming Protocol
βββ CLAUDE.md # Claude Code instructions
βββ README.md # Project documentation
βββ LICENSE # MIT License
If you are an AI coding assistant (Antigravity, Cursor, Claude Code, GitHub Copilot, Codex, etc.) working on this project:
- Refer to
AGENTS.mdfor the operational protocol and core guardrails. - Read
memory/context.mdfor the single source of truth on architecture, APIs, schema, and tech stack details. - Log completed work in
memory/progress_latest.md.
This project is open-source and licensed under the MIT License.