A full-stack AI platform that scrapes LinkedIn & Indeed, tailors your resume per company using Claude AI, writes personalised cover letters, and streams everything live to a React dashboard — fully automated, every morning at 8 AM.
143 jobs scraped, relevance-scored, and filtered in real time. The live terminal feed streams every pipeline step as it executes.
Side-by-side preview of the AI-generated resume and cover letter for each job. One click to Apply Now.
Job searching in 2026 is broken:
- 2–3 hours wasted daily manually searching LinkedIn, Indeed, and other boards
- 76% of resumes never reach a human reviewer — ATS filters them out first
- Generic resumes sent to every job result in low keyword match scores
- Rewriting cover letters from scratch for every application is tedious and inconsistent
A full-stack AI platform that does everything automatically — scraping, scoring, tailoring, and previewing — while you watch it happen live in your browser.
# One click in the dashboard, or schedule it:
0 8 * * * node server.js --triggerIn ~7 minutes the platform:
- Scrapes LinkedIn & Indeed across 14 query/location combinations
- Scores each job by keyword relevance (out of 20)
- Sends the top 10 jobs to Claude AI for resume tailoring
- Writes a personalised cover letter per company
- Streams every step live to your React dashboard via WebSocket
- Displays all results in a searchable, filterable job board with document preview
┌─────────────────────────────────────────────────────────────────┐
│ Layer 4: React + TypeScript Frontend (Vite) │
│ JobGrid · JobCard · PreviewDrawer · RunFeed · WebSocket client │
├─────────────────────────────────────────────────────────────────┤
│ Layer 3: Node.js API Server │
│ POST /runs/trigger · GET /runs/:id · GET /jobs · GET /files/* │
│ WebSocket — streams stdout/stderr from Python process live │
├─────────────────────────────────────────────────────────────────┤
│ Layer 2: Candidate Profile │
│ data/hamza_profile.json — single source of truth for all prompts│
├─────────────────────────────────────────────────────────────────┤
│ Layer 1: Python AI Agent Pipeline │
│ Manager → Job Search Agent → Resume Tailor → Cover Letter Writer│
└─────────────────────────────────────────────────────────────────┘
| Agent | What It Does |
|---|---|
manager_agent.py |
Orchestrator — runs the full pipeline sequentially, creates output directories, streams structured logs |
agent_job_search.py |
Scrapes LinkedIn & Indeed via JobSpy across 14 query/location combos; scores jobs by keyword relevance; saves to SQLite with duplicate prevention |
agent_resume_tailor.py |
Reads top 10 jobs from SQLite; sends each to Claude AI with your full profile; Claude rewrites summary, reorders skills, highlights relevant projects |
agent_cover_letter.py |
Writes a personalised cover letter per job — opens with a hook, references two achievements with numbers, names the company specifically |
Search coverage:
- AI Engineer, LLM Engineer, Full Stack Developer — Remote
- Software Engineer, Data Analyst — Newfoundland + Nova Scotia
- Business Intelligence Analyst, Analytics Engineer — Canada
Relevance scoring keywords: llm · agent · react · typescript · node.js · aws · python · sql · power bi · claude · anthropic
data/hamza_profile.json — single source of truth fed into every Claude prompt:
- Target roles, skills, projects, experience, education
- Used by both resume tailor and cover letter agents to ensure consistency
| Endpoint | What It Does |
|---|---|
POST /runs/trigger |
Spawns manager_agent.py as child process, assigns UUID run ID, returns immediately |
GET /runs/:id |
Returns run status (running/completed/failed), full log array, timestamps |
GET /jobs |
Reads SQLite — all jobs joined with resume and cover letter paths, ordered by relevance |
GET /files/* |
Serves resume and cover letter .txt files to frontend preview |
ws://host/ws |
Streams every stdout/stderr line from Python in real time; sends run snapshot on connect |
Uses Node's built-in node:sqlite — no native compilation needed. In-memory Map tracks all runs per session.
| Component | What It Does |
|---|---|
App.tsx |
Root — manages WebSocket, job list state, run status, auto-reconnect |
RunFeed.tsx |
Dark terminal sidebar — colour-coded live logs (blue=steps, green=success, red=error, yellow=warning), auto-scrolls, animating status badge |
JobGrid.tsx |
Searchable job board — filters across title, company, location simultaneously |
JobCard.tsx |
Cards with relevance score bar (gradient, out of 20), source badge, pipeline stage indicator |
PreviewDrawer.tsx |
Side-by-side Resume + Cover Letter preview, spring animation, Apply Now → direct link, Escape to close |
Filter pills with live counts:
All 143·New 132·Resume Ready·Apply Ready 11
| Metric | Result |
|---|---|
| Jobs Scraped | 143 total (92 new this run) |
| Search Combinations | 14 query/location pairs |
| AI-Tailored Resumes | 10 (one per top-scored job) |
| Personalised Cover Letters | 10 (one per company) |
| Apply Ready | 11 jobs with full document set |
| Runtime | ~7 minutes end-to-end |
Sample jobs found this run:
- Verafin — Software Developer Specialist (St. John's, NL) ← local!
- AI/ML Engineer — YO IT Consulting (Remote)
- Data & Reporting Analyst — EfficiencyOne (Dartmouth, NS)
- Senior Backend Engineer — Releady (Remote)
- Junior Data Scientist — Liferaft (Halifax, NS)
| Layer | Technology | Purpose |
|---|---|---|
| Frontend | React 18, TypeScript, Vite | Job dashboard, document preview, live feed |
| Styling | Plain CSS | Zero framework dependency |
| API Server | Node.js, built-in node:sqlite |
REST endpoints, WebSocket streaming |
| AI Engine | Claude AI (Anthropic SDK) | Resume tailoring, cover letter writing |
| Job Scraping | JobSpy | LinkedIn & Indeed real-time scraping |
| Database | SQLite | Job storage, deduplication, run history |
| Pipeline | Python, Pandas | Agent orchestration, scoring, file management |
| Scheduling | cron | Automated 8 AM daily trigger |
ai-job-application-agent/
├── client/
│ └── src/
│ ├── App.tsx # Root — WebSocket, state, run management
│ ├── RunFeed.tsx # Live terminal sidebar
│ ├── JobGrid.tsx # Searchable + filterable job board
│ ├── JobCard.tsx # Individual job card with relevance score
│ └── PreviewDrawer.tsx # Side-by-side resume + cover letter preview
├── agents/
│ ├── manager_agent.py # Pipeline orchestrator
│ ├── agent_job_search.py # LinkedIn & Indeed scraper + scorer
│ ├── agent_resume_tailor.py # Claude AI resume customisation
│ └── agent_cover_letter.py # Claude AI cover letter generation
├── data/
│ ├── hamza_profile.json # Candidate profile — fed into all Claude prompts
│ └── jobs.db # SQLite job tracker
├── reports/ # Generated HTML digests
├── resumes/ # AI-tailored resumes (.txt per job)
├── cover_letters/ # Personalised cover letters (.txt per job)
├── server.js # Node.js API + WebSocket server
├── run_job_agent.sh # One-command launcher
└── README.md
Python 3.10+
Node.js 20+# Clone
git clone https://github.com/Cheema2000/ai-job-application-agent.git
cd ai-job-application-agent
# Python dependencies
pip install anthropic jobspy pandas
# Set your API key
export ANTHROPIC_API_KEY=your_key_here
# Node dependencies
npm install
# Start the server
node server.js
# Open dashboard
open http://localhost:3000# Runs automatically at 8 AM every day
0 8 * * * cd /path/to/ai-job-application-agent && node server.js --trigger- 📧 Email Delivery — Send HTML digest to inbox at 8 AM automatically
- 🔔 Slack Alerts — Instant ping for jobs scoring above 35 relevance
- 📈 Application Tracker — Track response rates, interview callbacks, offer rate
- 🌍 More Locations — Expand beyond NL/NS to Toronto, Vancouver, all Remote Canada
- 🔐 Auth Layer — Multi-user support with per-profile job pipelines
- 📊 Analytics Dashboard — Weekly job market trends, keyword frequency, company activity
- Anthropic Claude AI — Resume tailoring and cover letter generation
- JobSpy — LinkedIn & Indeed scraping
- React + Vite — Frontend dashboard
- techNL AI for Data Science & Analytics program — Project inspiration
Muhammad Hamza M.A.Sc. Computer Engineering — Memorial University of Newfoundland St. John's, NL, Canada
MIT License — free to use, modify, and distribute.
Built with Claude AI · React · TypeScript · Node.js · Python · JobSpy · Vite

