AI-powered job search automation as an OpenClaw skill. Search LinkedIn and Indeed every day. Score results against your profile. Track everything in a local CSV. Zero backend, zero dashboard β just you and your data.
- Multi-platform search: LinkedIn + Indeed via python-jobspy
- Two search modes:
coding(ML engineer, data scientist, AI engineer) andnoncoding(research, no-leetcode, consulting roles) - AI scoring: Jobs scored 0β100 against your skill profile. Only qualified jobs (β₯70 by default) are saved.
- CSV tracker: All jobs saved to
jobs.csvwith 21 columns β no database server needed - Smart dedup: Won't add the same company+role or URL twice
- Daily automation: One cron job, one notification each morning
/newjob <url>: Paste any job URL and get an instant score + analysis
- Python 3.10+
- OpenClaw (for skill integration and notifications)
python-jobspy:pip install python-jobspy
clawhub install jobclawgit clone https://github.com/weixijia/jobclaw ~/.npm-global/lib/node_modules/openclaw/skills/jobclawPull requests welcome. The CI pipeline auto-publishes to ClawHub on every push to main β no manual release step needed.
Talk to your OpenClaw agent:
"Set up my job search"
The agent walks you through everything conversationally β one question at a time:
- Your name
- Background β a sentence about what you do (used for job scoring context)
- Key skills β e.g.
python, pytorch, sql, docker - Target roles β e.g.
ML engineer, data scientist - Locations β e.g.
London, UK,Remote,Berlin, DE - Search preferences β how recent, minimum score (defaults work fine)
- Daily schedule β what time to run, timezone
- Notifications β Telegram bot, OpenClaw channel, or none
At the end, the agent writes ~/Documents/JobClaw/config.json and offers to run the first search immediately. No editing files, no CLI wizard.
{
"user": {
"name": "Alex",
"background": "Software engineer with ML experience",
"skill_keywords": ["python", "pytorch", "machine learning", "deep learning"]
},
"search": {
"locations": ["London, UK", "Remote"],
"min_score": 70,
"hours_old": 48,
"platforms": ["linkedin", "indeed"]
},
"notifications": {
"enabled": true,
"telegram_bot_token": "your_bot_token",
"telegram_chat_id": "your_chat_id"
},
"schedule": {
"daily_time": "07:30",
"weekdays_only": true,
"timezone": "Europe/London"
}
}Another example β data science background:
{
"user": {
"name": "Sam",
"background": "Data scientist, fintech experience",
"skill_keywords": ["pandas", "scikit-learn", "sql", "statistics", "forecasting"]
},
"search": {
"locations": ["New York, NY", "San Francisco, CA", "Remote"],
"min_score": 65
}
}See jobclaw/assets/config.example.json for the full template with all options.
| Command | What happens |
|---|---|
run job search |
Full search (coding + noncoding) |
run coding job search |
ML engineer, AI engineer, data scientist roles |
run noncoding job search |
Research, consulting, no-leetcode roles |
/newjob https://... |
Analyse a specific job posting |
show job stats |
Total, by status, new today |
top jobs |
Top 10 by match score |
search for "LLM engineer" in Berlin |
Custom keyword + location |
set up daily search at 8am |
Configure OpenClaw cron |
# Full search
python3 scripts/search.py --mode all
# Coding roles only
python3 scripts/search.py --mode coding
# Research / no-leetcode roles only
python3 scripts/search.py --mode noncoding
# Preview without saving
python3 scripts/search.py --mode all --dry-run
# Custom keyword and location
python3 scripts/search.py --mode coding --keyword "MLOps engineer" --location "Berlin, DE"
# Tracker stats
python3 scripts/tracker.py stats
python3 scripts/tracker.py top- Base score: 50
- Each matching positive keyword in the job title/description: +5 (capped at 100)
- Negative keywords (e.g. "intern", "unpaid"): β15 each
- Keywords in your
skill_keywordsconfig are added to the positive list
Coding mode positive keywords: machine learning, deep learning, pytorch, llm, nlp, computer vision, mlops, rlhf, fine-tuning, generative ai β¦
Noncoding mode positive keywords: healthcare, clinical, research scientist, fintech, fraud, postdoc, product manager, consulting β¦
Adjust min_score in config (default: 70) for more or fewer results.
JobClaw tags each job with an estimated interview type:
| Type | Description | Typical for |
|---|---|---|
| Research Talk | Presentation + Q&A, no coding | Postdoc, Research Scientist at labs |
| No Leetcode | Behavioural + ML knowledge | Startups, many mid-size companies |
| Case Study | Business/ML case + presentation | Consulting, pharma, finance |
| Take-Home | 1β3 day ML task | Startups |
| Fair Coding | Basic Python + ML discussion | Applied scientist roles |
| Standard Coding | LeetCode medium | Most tech companies |
| Heavy Leetcode | LeetCode hard | Big tech (FAANG) |
~/Documents/JobClaw/data/jobs.csv:
| Column | Description |
|---|---|
company |
Company name |
role |
Job title |
location |
City, country |
work_mode |
Remote / Hybrid / On-site / Unknown |
salary |
Salary if listed |
job_url |
Link to posting |
date_posted |
When posted (YYYY-MM-DD) |
date_found |
When JobClaw found it |
source |
Daily Search / Manual |
match_score |
0β100 relevance score |
ml_direction |
e.g. NLP/LLM, Healthcare AI, General ML/AI |
seniority |
Junior / Mid / Senior / Lead |
interview_type |
Research Talk / No Leetcode / Standard Coding / β¦ |
status |
New / Applied / Phone Screen / Offer / Rejected / β¦ |
date_applied |
Fill in when you apply |
referral |
Referral contact |
recruiter_contact |
Recruiter info |
followup_date |
When to follow up |
priority |
High / Medium / Low |
notes |
Source platform, description excerpt |
job_category |
coding / noncoding |
Option 1: Telegram Bot (standalone, no OpenClaw needed)
- Message @BotFather β
/newbotβ copy the token - Message @userinfobot β copy your chat ID
- Add both to
config.jsonundernotifications
Test: python3 scripts/notify.py --test
Option 2: OpenClaw channel
- Set
openclaw_channel(e.g.telegram),openclaw_account, andtelegram_chat_id - Routed through OpenClaw's messaging system
- LinkedIn: Best coverage for tech/ML roles; occasionally rate-limited
- Indeed: Strong UK/EU/US coverage, often surfaces roles not on LinkedIn
- Both searched simultaneously via
python-jobspy
jobclaw/
βββ SKILL.md # OpenClaw skill definition
βββ scripts/
β βββ setup.py # First-run setup wizard
β βββ search.py # Search engine (jobspy + scoring)
β βββ tracker.py # CSV read/write/dedup
β βββ notify.py # Notifications (OpenClaw / Telegram)
β βββ run_daily.sh # Daily automation runner
βββ references/
β βββ screening_guide.md # Scoring rules, interview types
β βββ keywords.md # Keyword lists and search strategy
β βββ commands.md # All commands reference
βββ assets/
βββ config.example.json # Config template
- AI-powered JD analysis (Claude) for richer scoring
- Cover letter generation per job
- Interview prep mode (
/prep <company>) - Export to Notion / Airtable
- More platforms (ZipRecruiter, Google Jobs)
-
jobs.ac.ukscraper for academic roles
Contributions welcome β open an issue or PR. The CI pipeline auto-publishes updates to ClawHub on every push to main.
MIT β see LICENSE
Built with β€οΈ and job search anxiety. Powered by python-jobspy and OpenClaw.