Job Hunter
Automated job search pipeline with JD parsing, resume tailoring, and application tracking.
Setup
1. Initialize Project
Create the project structure in the workspace:
CODEBLOCK0
2. Gather User Profile
Ask the user for (store in config.json):
- - Current role, company, years of experience
- Core skills and technologies
- Target roles (e.g., "Senior iOS Engineer", "Staff Engineer")
- Location priority tiers (e.g., Remote then City A then City B then Other)
- Salary preference: disclose or private
- Resume file (extract text from PDF if needed, save as
resumes/base_resume.md)
3. Configure APIs
See references/apis.md for full API documentation.
Free, no auth required:
- - LinkedIn guest API (best for local/country-specific jobs)
- Jobicy (remote jobs)
- RemoteOK (remote tech jobs)
- Remotive (remote dev jobs)
Free, API key required (ask user to register):
- - Adzuna (country-specific, https://developer.adzuna.com)
- JSearch/RapidAPI (aggregates Indeed/Glassdoor, https://rapidapi.com — search "JSearch")
Store keys in api_keys.json with rate limits:
CODEBLOCK1
Core Workflows
Job Finding
- 1. Query all configured APIs (see references/apis.md)
- For each result, check against
tracked_jobs.json — skip duplicates (match by URL or title+company) - Read the actual JD for each new job — extract real data only:
- Required skills/technologies (from JD text, not assumed)
- Years of experience required (from JD text)
- Salary (only if posted in listing)
- Location and remote policy
- 4. Calculate match score (0-100) by comparing user's actual skills against JD requirements
- Assign location tier based on user's priority config
- Add to INLINECODE4
Critical rule: Never hallucinate or assume JD data. If the JD can't be fetched, mark fields as "not fetched" and note it.
Salary estimates: Only use JSearch estimated-salary API endpoint. Label clearly as "market estimate" vs "posted salary".
JD Parsing
Extract from actual job posting text:
CODEBLOCK2
Resume Customization
When user says "customize resume for [company]":
- 1. Read the base resume from INLINECODE5
- Read the parsed JD for that job from INLINECODE6
- Reorder and reframe existing experience to match JD requirements
- Emphasize matching skills, use language from the JD
- Never add skills, experience, or achievements the user doesn't have
- Never inflate numbers or add hallucinated data
- Save to INLINECODE7
Application Tracking
Track status in tracked_jobs.json:
CODEBLOCK3
Each entry:
CODEBLOCK4
Automation
Cron Jobs
Set up two cron jobs:
- 1. Job Finder — Daily at user's preferred time (default 9 AM local):
- Query all APIs, parse new JDs, update tracker
-
sessionTarget: "isolated", INLINECODE10
- 2. Status Update — Daily at user's preferred time (default 11 AM local):
- Read tracker, compile summary, send to user's messaging channel
-
sessionTarget: "isolated", INLINECODE12
WhatsApp/Messaging Format
Format updates for mobile readability (40-50 chars per line). Group jobs by:
- 1. 🌐 Remote (user's country)
- 🌍 Remote (international)
- 🏠 Office (by city, user's priority order)
Per job card:
CODEBLOCK5
Only show data from actual JD. Mark unfetched JDs with ⚠️.
Interactive Commands
Users can ask anytime:
- - "show jobs" / "what's available" → list tracked jobs
- "show hyderabad jobs" → filter by location
- "customize resume for [company]" → trigger customizer
- "apply to [company]" → update status, note action needed
- "status" → summary of all applications
- "mark [company] as [status]" → update tracker
求职助手
自动化求职流程,包含职位描述解析、简历定制和申请追踪。
设置
1. 初始化项目
在工作区创建项目结构:
job-hunter/
├── config.json # 用户资料、目标职位、API配置
├── api_keys.json # API凭证(已加入gitignore)
├── resumes/
│ ├── base_resume.md # 用户主简历(文本格式)
│ └── [公司]_[职位].md # 按职位定制的简历
├── jobs/
│ └── tracked_jobs.json # 所有已发现的职位及状态
2. 收集用户资料
向用户询问以下信息(存储在config.json中):
- - 当前职位、公司、工作年限
- 核心技能和技术栈
- 目标职位(例如:高级iOS工程师、资深工程师)
- 地点优先级层级(例如:远程优先,其次是A城市、B城市,最后是其他地区)
- 薪资偏好:公开或保密
- 简历文件(如有需要从PDF中提取文本,保存为resumes/base_resume.md)
3. 配置API
完整API文档请参见references/apis.md。
免费,无需认证:
- - LinkedIn访客API(最适合本地/特定国家职位)
- Jobicy(远程职位)
- RemoteOK(远程技术职位)
- Remotive(远程开发职位)
免费,需要API密钥(请用户注册):
- - Adzuna(特定国家,https://developer.adzuna.com)
- JSearch/RapidAPI(聚合Indeed/Glassdoor,https://rapidapi.com — 搜索JSearch)
将密钥存储在api_keys.json中,并注明速率限制:
json
{
adzuna: { appid: ..., appkey: ..., daily_budget: 4 },
rapidapi: { key: ..., daily_budget: 2 }
}
核心工作流程
职位发现
- 1. 查询所有已配置的API(参见references/apis.md)
- 对每个结果,与trackedjobs.json进行比对 — 跳过重复项(按URL或标题+公司匹配)
- 读取每个新职位的实际职位描述 — 仅提取真实数据:
- 所需技能/技术栈(来自职位描述文本,而非假设)
- 所需工作年限(来自职位描述文本)
- 薪资(仅在招聘信息中公布时)
- 地点和远程政策
- 4. 通过将用户实际技能与职位描述要求进行对比,计算匹配分数(0-100)
- 根据用户优先级配置分配地点层级
- 添加到tracked_jobs.json
关键规则:切勿虚构或假设职位描述数据。如果无法获取职位描述,将字段标记为未获取并注明。
薪资估算:仅使用JSearch估算薪资API端点。明确标注为市场估算与公布薪资。
职位描述解析
从实际职位发布文本中提取:
- - 职位名称、公司、地点
- 所需技能[](来自职位描述)
- 工作年限(来自职位描述)
- 薪资(仅当公布时)
- 技术栈[](来自职位描述)
- 加分项[](来自职位描述)
- 申请链接
简历定制
当用户说为[公司]定制简历时:
- 1. 从resumes/baseresume.md读取基础简历
- 从trackedjobs.json读取该职位的已解析职位描述
- 重新排序和重构现有经验,以匹配职位描述要求
- 强调匹配的技能,使用职位描述中的语言
- 切勿添加用户不具备的技能、经验或成就
- 切勿夸大数字或添加虚构数据
- 保存到resumes/[公司]_[职位].md
申请追踪
在tracked_jobs.json中追踪状态:
新发现 → 已解析 → 已定制 → 已申请 → 筛选中 → 面试中 → 已录用/已拒绝
每个条目:
json
{
id: 唯一标识,
source: linkedin|jobicy|remoteok|adzuna|jsearch,
title: 来自API,
company: 来自API,
location: 来自API,
location_tier: 1,
match_score: 85,
salary: 仅当公布时,
tech_stack: [来自实际职位描述],
experience_required: 来自实际职位描述,
apply_url: 链接,
status: 新发现,
found_date: YYYY-MM-DD,
notes:
}
自动化
定时任务
设置两个定时任务:
- 1. 职位发现 — 每天在用户偏好的时间(默认当地时间上午9点):
- 查询所有API,解析新职位描述,更新追踪器
- sessionTarget: isolated, delivery: announce
- 2. 状态更新 — 每天在用户偏好的时间(默认当地时间上午11点):
- 读取追踪器,编译摘要,发送到用户的消息渠道
- sessionTarget: isolated, delivery: announce
WhatsApp/消息格式
为移动端可读性格式化更新(每行40-50个字符)。按以下分组职位:
- 1. 🌐 远程(用户所在国家)
- 🌍 远程(国际)
- 🏠 办公室(按城市,用户优先级顺序)
每个职位卡片:
━━━━━━━━━━━━━━━━━━
🏢 公司名称
📋 职位名称
📅 X年以上(来自职位描述)
💰 薪资(如果公布)
🛠 技术栈:来自实际职位描述
📍 地点
🎯 匹配度:X% — 原因
仅显示来自实际职位描述的数据。未获取的职位描述用⚠️标记。
交互命令
用户可以随时询问:
- - 显示职位 / 有哪些可用职位 → 列出追踪的职位
- 显示海德拉巴的职位 → 按地点筛选
- 为[公司]定制简历 → 触发定制器
- 申请[公司] → 更新状态,注明需要采取的行动
- 状态 → 所有申请的摘要
- 将[公司]标记为[状态] → 更新追踪器