Intelligent LinkedIn Easy Apply automation with AI-powered job matching
Automate Easy Apply, score job relevance with Gemini, and track every application — built by Md. Mahamudul Hasan.
- 🤖 Easy Apply automation — Fills LinkedIn application forms automatically
- 🎯 AI relevance scoring — Gemini scores each job 0–100; skips low-match listings
- 📝 AI cover letter tailoring — Generates per-job cover letters from your resume text
- 📊 Applied-jobs dashboard — Flask UI with relevance scores and external link tracking
- 🌐 Multi-provider AI — Gemini (default), OpenAI, and DeepSeek supported
- 🕵️ Stealth browser mode — Uses undetected-chromedriver to reduce bot detection
- 📁 CSV history — Full audit trail of applied, skipped, and failed jobs
| Category | Technologies |
|---|---|
| Language | Python 3.11+ |
| Browser automation | Selenium, undetected-chromedriver |
| AI | Google Gemini, OpenAI SDK, DeepSeek |
| Web dashboard | Flask, Flask-CORS |
| Desktop automation | PyAutoGUI |
| Data storage | CSV (local files) |
- Windows 10/11 (primary platform; Linux/macOS partially supported)
- Python 3.11+ — python.org/downloads
- Google Chrome (latest stable)
- LinkedIn account with Easy Apply access
- Gemini API key (optional, for AI features) — Google AI Studio
git clone https://github.com/mahamudul-hasan-cse/JobPilot-AI.git
cd JobPilot-AIpip install -r requirements.txtcopy config\secrets.example.py config\secrets.py
copy config\personals.example.py config\personals.py
copy config\questions.example.py config\questions.pyEdit config/secrets.py:
- Set your LinkedIn
usernameandpassword - Add your Gemini
llm_api_key - Set
ai_provider = "gemini"
Edit config/personals.py with your real name, phone, and address.
Place your PDF resume at:
all resumes/default/resume.pdf
Paste your resume as plain text in config/questions.py → base_resume_text for AI tailoring.
Run as Administrator on Windows:
setup\windows-setup.bat
| File | Purpose |
|---|---|
config/secrets.py |
LinkedIn login, API keys, AI feature flags |
config/personals.py |
Name, phone, address, EEO answers |
config/questions.py |
Resume path, salary, cover letter, AI resume text |
config/search.py |
Job titles, location, filters, blacklists |
config/settings.py |
Bot behavior, browser timeouts, CSV paths |
use_AI = True
ai_provider = "gemini"
llm_api_key = "YOUR_GEMINI_API_KEY"
llm_model = "gemini-2.0-flash"
use_relevance_scoring = True
ai_relevance_threshold = 65
strict_relevance_scoring = Falsesearch_terms = ["AI Engineer", "ML Engineer"]
location = "Bangladesh"
easy_apply_only = True
switch_number = 3 # Max successful applies per runSee SECURITY.md for what never to commit or share.
Windows — double-click:
| File | Description |
|---|---|
Start JobPilot AI.vbs |
Recommended — opens console and runs the bot |
start_jobpilotai.bat |
Command Prompt launcher |
Or from terminal:
python main.pyThe launcher will: close Chrome → validate config → open guest Chrome → log into LinkedIn → apply to jobs.
python app.pyOpen http://localhost:5000 to view applied jobs.
python scripts/preflight.pyJobPilot AI/
├── main.py # Bot entry point
├── app.py # Flask dashboard entry point
├── requirements.txt
├── README.md
├── CHANGELOG.md
├── COPYRIGHT
├── LICENSE
├── SECURITY.md
├── .gitignore
├── .env.example
├── Start JobPilot AI.vbs # Windows double-click launcher
├── start_jobpilotai.bat # Windows batch launcher
│
├── config/ # User settings (*.py gitignored except *.example.py)
│ ├── secrets.example.py
│ ├── personals.example.py
│ ├── questions.example.py
│ ├── search.py
│ └── settings.py
│
├── modules/ # Core application code
│ ├── auth.py # LinkedIn login
│ ├── helpers.py # Utilities and logging
│ ├── validator.py # Config validation
│ ├── browser/ # Chrome session + Selenium helpers
│ ├── ai/ # Gemini, scoring, tailoring, factory
│ └── jobs/ # Applier, form filler, filters, logger
│
├── scripts/
│ └── preflight.py # Pre-run config/deps check
│
├── setup/ # One-time environment setup
│ ├── windows-setup.bat
│ ├── windows-setup.ps1
│ ├── setup.sh
│ └── start_jobpilotai.ps1
│
├── web/
│ └── templates/
│ └── index.html # Dashboard UI
│
├── all excels/ # CSV history (gitignored, created at runtime)
├── all resumes/ # Resume files (gitignored)
└── logs/ # Debug logs (gitignored)
- Multi-account support with profile switching
- PostgreSQL / SQLite backend for application history
- Email notifications on apply completion
- Docker container for one-command deployment
- Improved Easy Apply button detection (Next / Review / Submit)
- Scheduled runs via Windows Task Scheduler integration
- Application analytics dashboard (success rate, company stats)
- Support for Indeed and Glassdoor
Md. Mahamudul Hasan
- GitHub: @mahamudul-hasan-cse
This project is licensed under the GNU Affero General Public License v3.0.
See LICENSE for the full text.
Copyright (C) 2026 Md. Mahamudul Hasan
⭐ Star this repo if JobPilot AI helps your job search!