AI-powered job hunting agent — setup, features, and day-to-day use.
JobScoutAI is an AI-powered job hunting agent that scrapes job boards, rates each posting against your skills using AI, generates tailored resumes, drafts freelance proposals, tracks applications, and sends daily email briefings. It is built with Python, Flask, and SQLite, and runs locally on your machine — no accounts, no cloud, no shared data.
Instead of manually refreshing LinkedIn, Indeed, and Freelancer every morning, you point JobScoutAI at the keywords that matter, tune your skill profile once, and let the agent do the filtering. Jobs that survive the AI rating pass appear in your tracker with a score, a summary, and an Apply button. The ones that don't are learned from — the system remembers why you skipped a listing and scores similar ones lower next time.
| Feature | Description | Status |
|---|---|---|
| Multi-platform scraping | Searches LinkedIn, Indeed, ZipRecruiter, Freelancer.com, Upwork, Craigslist, Google Jobs | LinkedIn primary — others depend on ScraperAPI or may be blocked |
| AI job rating | Claude AI rates each job 1–10 against your skill profile with two tiers: Standard (7+) and Quick Win (5+) | Working |
| Ollama support | Free local AI alternative — no API key needed for job rating | Working |
| Resume builder | Generates tailored HTML resumes for specific job postings using your profile and work history | Working |
| Proposal drafter | Drafts freelance proposals using your past proposals as style reference | Working |
| Application tracker | Full CRM — tracks status, follow-ups, communications, deadlines | Working |
| Skip tag learning | Learns your preferences from skipped jobs and adjusts future AI ratings | Working |
| Email notifications | Daily briefing email with new matches and follow-up reminders | Working — requires Gmail OAuth |
| Dashboard & analytics | Funnel chart, skills demand tracker, scraper activity, win rate trends | Working |
| Mobile-responsive UI | Card-based layout on phones, bottom navigation, touch-friendly | Working |
| Background scraper | Runs in background thread — doesn't freeze the UI, survives phone disconnect | Working |
| Demo page | Read-only showcase at /demo for quick presentations | Working |
| Search profiles | Multiple keyword/filter configurations for different job categories | Working |
| API keys in Settings | Manage all API keys from the web UI — no .env editing needed | Working |
Follow these seven steps once. After that, running the app is a single command.
git clone https://github.com/HrSYT420/JobScoutAI.git
cd JobScoutAI
# Windows
python -m venv .venv
.venv\Scripts\activate
# macOS / Linux
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Copy .env.example to .env and add at least your Anthropic key:
cp .env.example .env
# then edit .env and set:
ANTHROPIC_API_KEY=sk-ant-...
SCRAPER_API_KEY=your_key # optional
Or skip the file and enter the keys in the web UI under Settings → API Keys once the app is running.
Copy the example config files and fill them in:
cp config/profile.example.json config/profile.json
cp config/resume_content.example.txt config/resume_content.txt
Edit config/profile.json with your skills, proof points, contact info, and job preferences. Edit config/resume_content.txt with your work history and bullet points. You can also edit both from Settings → Profile and Settings → Resume.
python -m tracker.app
Open http://localhost:5001 in your browser.
Go to the Control page and click Run Scraper. Or from the terminal:
python -m job_hunter.scraper
Job boards actively fight automated scraping. JobScoutAI supports many sources on paper, but in practice the reliability varies. This table is current and honest.
| Source | Method | Status | Notes |
|---|---|---|---|
| JobSpy library | Working (FREE) | Primary source. 30–50+ jobs per keyword. No API key needed. | |
| Indeed | Selenium / ScraperAPI | Blocked without ScraperAPI | Cloudflare CAPTCHA blocks browser scraping. Works with ScraperAPI ($49/mo). |
| ZipRecruiter | Selenium / ScraperAPI | Blocked without ScraperAPI | Same as Indeed — Cloudflare-protected. |
| Freelancer.com | Direct HTML scraping | Working (FREE) | Parses search pages directly. Limited free bids on the platform itself. |
| Upwork | RSS feed | Dead | Upwork removed their RSS feeds (410 Gone). Selenium also blocked. |
| Craigslist | RSS feed | Blocked | Returns 403 on all requests. |
| Google Jobs | ScraperAPI structured | Requires ScraperAPI | Up to 10 jobs per keyword. |
Every scraper run walks through eight phases:
seen_urls.json with a 7-day rolling window.data/jobs_YYYY-MM-DD.json.//control/dashboard/rated-jobs/resumes/settings/demo/application/<id>| Tab | What you configure |
|---|---|
| Scraper | Keywords, filter terms, budget range, hourly rate, platforms, location, browser preference. |
| AI Filter | Score thresholds for Standard and Quick Win tiers, quick-win hour limit, feature toggles. |
| Profile | Primary skills, secondary skills, topics to avoid, proof points. |
| Notifications | Email address and per-event toggles (new jobs / follow-up due / nothing new). |
| Statistics | Proposal stats, source performance breakdown, skip tag weights with sorting. |
| Overrides | Manual weight adjustments for skip tags, temporary or permanent. |
| Proposal Rules | Writing guidelines for the AI proposal drafter. |
| Profiles | Create, edit, and delete search profiles with their own keywords and filter terms. |
| Resume | Contact info, resume content library, skills willing to learn. |
| API Keys | Anthropic, ScraperAPI, Gmail OAuth, notification email — all manageable from UI. |
JobScoutAI ships with two interchangeable AI backends. Swap between them in Settings → AI Filter or Settings → Scraper.
claude-haiku-4-5 for job rating, claude-sonnet-4-6 for proposals and resumes.ollama pull llama3.2).The resume builder produces a tailored one-page HTML resume per job, using your profile and work history as the only sources of truth.
data/resumes/ and accessible from the Resumes page.The drafter uses your past proposals and your writing rules to keep new drafts consistent with your voice.
config/proposal_rules.txt are applied.draft — edit before submitting.The system learns from every job you skip and uses that knowledge to score future jobs.
ngrok http 5001 gives you a public URL.client_secret.json file. Not beginner-friendly.| Feature | Description | Difficulty |
|---|---|---|
| Residential proxy support | Unlock Indeed / ZipRecruiter without ScraperAPI | Medium |
| Scheduled scraping | Cron-style automatic daily runs | Easy |
| First-time setup wizard | Step-by-step UI for new users | Medium |
| PyInstaller .exe build | Standalone executable for non-developers | Medium |
| Multi-user support | User accounts, separate profiles, shared server | Hard |
| Browser extension | One-click "rate this job" from any job board page | Hard |
| More AI providers | OpenAI, Google Gemini, local models beyond Ollama | Easy |
| Email template system | Cold outreach templates for freelance client acquisition | Easy |
| Advanced analytics | Profile comparison, ROI by source, weekly activity trends | Medium |
| Webhook integrations | Slack / Discord notifications instead of email | Easy |
JobScoutAI/
├── config/
│ ├── settings.py — keywords, budget, platforms, location
│ ├── profile.json — your skills and contact info
│ ├── proposal_rules.txt — AI writing guidelines
│ ├── resume_content.txt — work history for resume builder
│ ├── filter_config.json — AI score thresholds
│ ├── notification_config.json — email notification settings
│ ├── profiles/ — search profile configs
│ └── ...
├── job_hunter/
│ ├── scraper.py — main pipeline orchestrator
│ ├── filter.py — two-tier AI job rating
│ ├── ai_client.py — unified Claude / Ollama interface
│ ├── notifier.py — email notifications
│ ├── proposer.py — proposal drafter
│ ├── resume_builder.py — AI resume generator
│ ├── browser.py — Selenium / undetected-chrome manager
│ ├── background.py — background thread execution
│ └── *_scraper.py — per-platform scrapers
├── tracker/
│ ├── app.py — Flask app entry point
│ ├── database.py — SQLite queries
│ ├── helpers.py — shared utilities
│ ├── routes/ — Flask blueprint routes
│ └── templates/ — HTML templates
├── data/ — job results, database, resumes (gitignored)
├── .env — API keys (gitignored)
├── requirements.txt
├── CLAUDE.md — developer guide
└── README.md
pip install setuptools. Required for undetected-chromedriver on Python 3.12+.gmail_token.json and restart the app to re-authenticate.d["values"], not d.values.python -m job_hunter.scraper while the web UI is also running in the same shell.python -m tracker.app — nearly every error prints a clear traceback or warning there.
CLAUDE.md.JobScoutAI is released under the MIT License. You are free to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the software, provided the license notice is preserved.
The software is provided "as is", without warranty of any kind. See the LICENSE file in the repository for the full text.