JobRadar:用本地 LLM 为职位列表评分的开源求职 Agent
英文标题:🔶 JobRadar: Open-source job search agent that scores listings with a local LLM
JobRadar 是一款命令行求职搜索 Agent,可同时从 8 个免费职位来源检索岗位,并利用本地运行的 LLM 根据用户个人资料进行匹配评分。它支持 Ollama 或 llama.cpp,默认使用约 1.1GB 的 qwen3:1.7b 模型,所有 AI 推理均在本地完成,无需云端 API 或订阅。项目提供职位缓存、终端可视化界面,以及运行于 localhost:3000 的看板式 Web 仪表盘。其核心理念是让 AI 负责搜索、过滤和摘要,而由求职者保留最终判断权。
49.6 KB
中文
一个 CLI 求职搜索 Agent,可同时搜索 8 个免费来源,并帮助你判断哪些职位真正值得投入时间。
它使用本地 LLM 根据你的个人资料为职位评分——但AI 只是辅助工具,而不是决策者。真正决定什么职位适合你的人是你自己。这正是它的核心理念。
大多数招聘网站会向你展示数百个职位,让你淹没在大量浏览器标签页中。JobRadar 可同时从多个来源获取职位、过滤噪声,并给出按优先级排列的职位列表,同时由 AI 生成说明,解释每份工作为何可能适合你(或不适合你)。
但关键在于:我们认为,最好的求职工具应当让人类始终参与其中。AI 可以评分和总结,但它无法理解你对公司文化的直觉,也无法知道你可能宁愿加入更小的团队,即便薪资较低。这部分判断属于你。
因此,请把评分当作起点,而不是结论。
- 同时搜索 8 个来源 —— Remotive、Arbeitnow、RemoteOK、Jobicy、Himalayas、Greenhouse(直接 ATS)、Ashby(直接 ATS),以及可选的 LinkedIn
- 使用本地 LLM 评估职位 —— 自动检测 Ollama 或 llama.cpp,从技能匹配度、经验匹配度、薪资匹配度和远程工作匹配度四个维度,为每个职位打出 0-100 分
- 记住你已经看过的职位 —— 持久化缓存,避免每次运行都重复审阅相同职位
- 可完全离线运行 —— 所有 AI 均在你的本地计算机运行,无云端 API、无订阅
- 终端界面美观易用 —— 彩色评分、进度条和清晰表格
- Web 仪表盘 —— 运行在 localhost:3000 的深色模式 SPA,提供看板流程、筛选器和配置编辑器
选项 1:一行命令(Linux / macOS)
curl -fsSL https://raw.githubusercontent.com/ANIRudH-lab-life/job-radar/main/setup.sh | bash
选项 2:npm(所有平台)
npx jobradar-setup
# or
git clone https://github.com/ANIRudH-lab-life/job-radar.git
cd job-radar
npm run setup
选项 3:PowerShell(Windows)
git clone https://github.com/ANIRudH-lab-life/job-radar.git
cd job-radar
.\setup.ps1
git clone https://github.com/ANIRudH-lab-life/job-radar.git
cd job-radar
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
pip install -r dashboard/requirements.txt
智能安装器(setup.sh / setup.ps1)会在下载前检查每项依赖:
| 步骤 | 检查项 | 缺失时下载内容 |
|---|---|---|
| 1. Python | PATH 中是否有 3.9+ 版本 | —(显示安装链接) |
| 2. pip 软件包 | 分别检查每个导入项 | 仅安装缺失的软件包 |
| 3. LLM 后端 | 由你选择:Ollama 或 llama.cpp | 安装 Ollama 并拉取模型,或下载 llama.cpp 二进制文件 |
| 4. LLM 模型 | 仅在选择 llama.cpp 时 | qwen3-1.7b Q4_K_M(约 1.1GB)GGUF |
| 5. 配置 | profile.yaml | 创建默认配置 |
可安全重复运行——第二次运行会立即完成,不会重复下载任何内容。
安装器会询问你偏好的 LLM 后端:
- Ollama(推荐) —— 自动安装模型,易于管理,开箱即用
- llama.cpp(更快) —— 原始性能更高,手动下载 GGUF 模型
| 平台 | 安装器 | llama-server 来源 |
|---|---|---|
| Linux(x64) | bash setup.sh |
Ollama(推荐)或 GitHub release zip |
| macOS(ARM) | bash setup.sh |
Ollama(推荐)或 brew install llama.cpp |
| macOS(Intel) | bash setup.sh |
Ollama(推荐)或 brew install llama.cpp |
| Windows(x64) | .\setup.ps1 |
Ollama(推荐)或 GitHub release zip |
cd job-radar
source .venv/bin/activate # Windows: .venv\Scripts\activate
# Quick search (no AI — fast)
python -m jobradar -q "python developer" --no-ai
# Search with AI rating (needs a local LLM running)
python -m jobradar -q "python developer" -p profile.yaml
# Interactive mode — just run it and type queries
python -m jobradar
# Web dashboard
cd dashboard && bash run.sh # Windows: python -m uvicorn app:app --port 3000
# Open http://localhost:3000
# Start the LLM server (for AI scoring)
# Option A: Ollama (recommended)
ollama serve & # if not already running
python -m jobradar -q "python dev" -p profile.yaml
# Option B: llama.cpp (faster)
llama-server --model models/qwen3-1.7b-q4_k_m.gguf --port 8080
python -m jobradar -q "python dev" -p profile.yaml
| 来源 | 类型 | 说明 |
|---|---|---|
| Remotive | 招聘网站 API | 远程职位 |
| Arbeitnow | 招聘网站 API | 全球职位,支持分页 |
| RemoteOK | 招聘网站 API | 远程职位,职位量较大 |
| Jobicy | 招聘网站 API | 包含薪资数据的远程职位 |
| Himalayas | 招聘网站 API | 标明职级的远程职位 |
| Greenhouse | 直接 ATS | 15 家精选科技公司(Gitlab、Figma、Stripe 等) |
| Ashby | 直接 ATS | 15 家精选科技公司(OpenAI、Anthropic、Linear 等) |
| 网页抓取 | ⚠️ 默认关闭——可能违反服务条款 |
Greenhouse 和 Ashby 来源通过其公开 API,直接从公司招聘页面获取信息。无需登录,也无需 API 密钥。你可以在 companies.yaml 中编辑公司列表。
创建包含你个人信息的 profile.yaml,让 AI 能够根据你的真实背景为职位评分:
name: "Your Name"
title: "Software Engineer"
experience_years: 5
skills: [Python, Docker, AWS, React]
desired_roles: [Backend Engineer, SRE]
salary_min: 100000
salary_max: 160000
location_preference: "Remote"
remote_ok: true
industries: [Fintech, SaaS]
你提供的细节越多,评分效果越好。但请记住——AI 的评分只是一项建议,而不是你必须遵从的排名。
编辑 companies.yaml,为 Greenhouse 和 Ashby 来源添加或移除公司。只需使用公司 slug(即其招聘页面 URL 中的对应部分):
greenhouse:
- gitlab
- figma
- discord
- shopify
- stripe
ashby:
- openai
- anthropic
- linear
- resend
- clerk
JobRadar 会记住你已经看过的职位,因此你不必每次运行时都重新审阅。默认情况下,它会在 ~/.jobradar/seen_jobs.db 中保存 7 天缓存。
# Change cache duration to 30 days
python -m jobradar -q "python" --cache-days 30
# Skip the cache entirely
python -m jobradar -q "python" --no-cache
# Clear the cache
python -m jobradar --clear-cache
仪表盘为所有功能提供可视化界面:
- 顶部统计数据 —— 发现的职位总数、高匹配职位、待审阅职位、已申请职位
- 职位卡片 —— 使用绿色/黄色/红色显示匹配评分
- 检查器面板 —— 完整职位描述、匹配关键词、LLM 推理说明
- 看板流程 —— 可将职位从“已发现”拖动至“审阅中”→“已申请”→“面试中”
- 配置编辑器 —— 可在 UI 中编辑 profile.yaml 和 companies.yaml
- 实时活动日志 —— 以终端风格控制台展示 LLM 评分进度
- 键盘快捷键 —— J/K 滚动、E 编辑、A 标记为已申请
使用以下命令启动:
cd dashboard
bash run.sh # Linux/macOS
# or
python -m uvicorn app:app --port 3000 # Windows
然后打开 http://localhost:3000。
| 参数 | 默认值 | 作用 |
|---|---|---|
-q, --query |
— | 搜索查询词 |
-l, --location |
— | 按地点筛选 |
-p, --profile |
profile.yaml |
个人资料文件路径 |
--no-ai |
off | 跳过 AI 评分(更快) |
--export |
— | 将结果保存为 .json 或 .csv |
--limit |
50 |
每个来源的最大职位数 |
--max-pages |
3 |
每个来源的最大页数 |
--max-concurrency |
3 |
并发 AI 评分请求数 |
--companies |
companies.yaml |
ATS 来源的公司列表 |
--cache-days |
7 |
记住已查看职位的天数 |
--no-cache |
off | 禁用缓存 |
--clear-cache |
— | 清除缓存后退出 |
--list-ats-companies |
— | 显示已配置的 ATS 公司 |
--enable-linkedin |
off | ⚠️ 启用 LinkedIn 抓取 |
--llm-url |
(自动检测) | LLM 服务器 URL(自动扫描 11434、8080、1234 端口) |
--llm-model |
qwen3:1.7b |
LLM 模型名称(覆盖自动检测结果) |
JobRadar 默认使用 qwen3:1.7b(1.1 GB,在 CPU 上运行较快)。如果你想使用其他模型:
# Pull a different model
ollama pull qwen3:8b # larger, better reasoning, slower
ollama pull qwen2.5:1.5b # smaller, faster, less accurate
# Use it with JobRadar
python -m jobradar -q "python dev" --llm-model qwen3:8b
或者将其永久设置在环境变量中:
export LLM_MODEL="qwen3:8b"
python -m jobradar -q "python dev"
job-radar/
├── setup.sh # Smart installer (Linux/macOS)
├── setup.ps1 # Smart installer (Windows)
├── package.json # npm wrapper
├── profile.yaml # Your profile (edit this)
├── companies.yaml # ATS company slugs (edit this)
├── jobradar/
│ ├── models.py # Job and Profile dataclasses
│ ├── rating.py # Local LLM rating with retry logic
│ ├── cache.py # SQLite seen-jobs cache
│ ├── display.py # Rich terminal UI
│ ├── cli.py # Search pipeline + argparse
│ └── sources/
│ ├── remotive.py # Remotive API
│ ├── arbeitnow.py # Arbeitnow API (paginated)
│ ├── remoteok.py # RemoteOK API
│ ├── jobicy.py # Jobicy API
│ ├── himalayas.py # Himalayas API
│ ├── greenhouse.py # Greenhouse ATS (direct API)
│ ├── ashby.py # Ashby ATS (direct API)
│ └── linkedin.py # LinkedIn scraping (opt-in)
└── dashboard/
├── app.py # FastAPI backend
├── database.py # SQLite storage
├── run.sh # Dashboard launcher
└── static/
└── index.html # Dark-mode SPA
关于在求职中使用 AI 的说明
我们开发 JobRadar,是因为求职过程令人疲惫,而现有工具要么向你倾倒过多职位,要么试图将整个过程完全自动化。我们认为最佳平衡点是:让机器完成繁琐工作(搜索、筛选、总结),而由人类作出真正的决策。
AI 评分的作用是节省你阅读职位信息的时间,而不是告诉你该申请什么。95/100 的评分并不代表“立即申请”——它代表“这份职位看起来相关,值得进一步了解”。40/100 的评分也不代表“跳过”——它可能是你会喜欢的职位,只是 AI 没有足够上下文来理解这一点。
你才是闭环中的核心。AI 只是过滤器。
LinkedIn 抓取功能默认关闭。它依赖于未公开的 HTML,而这些内容会频繁变化,并且可能违反其服务条款。我们保留该功能是因为它有时确实有用,但更希望你了解其中的权衡:
python -m jobradar -q "python dev" --enable-linkedin
pip install pytest
pytest tests/ -v
MIT —— 参见 LICENSE
English / 原文
A CLI job search agent that hunts across 8 free sources at once and helps you figure out which ones are actually worth your time.
It uses a local LLM to score jobs against your profile — but the AI is just a guide, not a decision-maker. You're the one who decides what fits. That's the whole point.
Most job boards show you hundreds of listings and leave you drowning in tabs. JobRadar pulls from multiple sources at once, filters out the noise, and gives you a ranked list with AI-generated notes on why each job might (or might not) be a fit.
But here's the thing: we believe the best job search tool puts a human in the loop. The AI can score and summarize, but it can't understand your gut feeling about a company culture, or that you'd rather work somewhere with a smaller team even if the salary is lower. That part is yours.
So use the scores as a starting point, not a verdict.
- Searches 8 sources at once — Remotive, Arbeitnow, RemoteOK, Jobicy, Himalayas, Greenhouse (direct ATS), Ashby (direct ATS), and optionally LinkedIn
- Rates jobs with a local LLM — auto-detects Ollama or llama.cpp, scores each job 0-100 on skills match, experience fit, salary fit, and remote fit
- Remembers what you've seen — persistent cache so you don't re-review the same jobs every run
- Works completely offline — all AI runs locally on your machine, no cloud APIs, no subscriptions
- Looks good in the terminal — color-coded scores, progress bars, clean tables
- Web dashboard — dark-mode SPA at localhost:3000 with Kanban pipeline, filters, and config editor
Option 1: One-liner (Linux / macOS)
curl -fsSL https://raw.githubusercontent.com/ANIRudH-lab-life/job-radar/main/setup.sh | bash
Option 2: npm (all platforms)
npx jobradar-setup
# or
git clone https://github.com/ANIRudH-lab-life/job-radar.git
cd job-radar
npm run setup
Option 3: PowerShell (Windows)
git clone https://github.com/ANIRudH-lab-life/job-radar.git
cd job-radar
.\setup.ps1
git clone https://github.com/ANIRudH-lab-life/job-radar.git
cd job-radar
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
pip install -r dashboard/requirements.txt
The smart installer (setup.sh / setup.ps1) checks each dependency before downloading:
| Step | Checks for | Downloads if missing |
|---|---|---|
| 1. Python | 3.9+ in PATH | — (shows install link) |
| 2. pip packages | Each import individually | Only missing packages |
| 3. LLM Backend | You choose : Ollama or llama.cpp | Ollama install + model pull, or llama.cpp binary |
| 4. LLM Model | Only if llama.cpp chosen | qwen3-1.7b Q4_K_M (~1.1GB) GGUF |
| 5. Config | profile.yaml | Creates defaults |
Safe to re-run — second run is instant, nothing re-downloaded.
The installer asks which LLM backend you prefer:
- Ollama (recommended) — auto-installs the model, easy to manage, works out of the box
- llama.cpp (faster) — raw performance, downloads GGUF model manually
| Platform | Installer | llama-server source |
|---|---|---|
| Linux (x64) | bash setup.sh |
Ollama (recommended) or GitHub release zip |
| macOS (ARM) | bash setup.sh |
Ollama (recommended) or brew install llama.cpp |
| macOS (Intel) | bash setup.sh |
Ollama (recommended) or brew install llama.cpp |
| Windows (x64) | .\setup.ps1 |
Ollama (recommended) or GitHub release zip |
cd job-radar
source .venv/bin/activate # Windows: .venv\Scripts\activate
# Quick search (no AI — fast)
python -m jobradar -q "python developer" --no-ai
# Search with AI rating (needs a local LLM running)
python -m jobradar -q "python developer" -p profile.yaml
# Interactive mode — just run it and type queries
python -m jobradar
# Web dashboard
cd dashboard && bash run.sh # Windows: python -m uvicorn app:app --port 3000
# Open http://localhost:3000
# Start the LLM server (for AI scoring)
# Option A: Ollama (recommended)
ollama serve & # if not already running
python -m jobradar -q "python dev" -p profile.yaml
# Option B: llama.cpp (faster)
llama-server --model models/qwen3-1.7b-q4_k_m.gguf --port 8080
python -m jobradar -q "python dev" -p profile.yaml
| Source | Type | Notes |
|---|---|---|
| Remotive | Job board API | Remote jobs |
| Arbeitnow | Job board API | Worldwide, paginated |
| RemoteOK | Job board API | Remote jobs, good volume |
| Jobicy | Job board API | Remote jobs with salary data |
| Himalayas | Job board API | Remote jobs with seniority levels |
| Greenhouse | Direct ATS | 15 curated tech companies (Gitlab, Figma, Stripe, etc.) |
| Ashby | Direct ATS | 15 curated tech companies (OpenAI, Anthropic, Linear, etc.) |
| Web scraping | ⚠️ Off by default — may violate ToS |
The Greenhouse and Ashby sources pull directly from company career pages via their public APIs. No login, no API keys. You can edit the company list in companies.yaml.
Create a profile.yaml with your details so the AI can score jobs against your actual background:
name: "Your Name"
title: "Software Engineer"
experience_years: 5
skills: [Python, Docker, AWS, React]
desired_roles: [Backend Engineer, SRE]
salary_min: 100000
salary_max: 160000
location_preference: "Remote"
remote_ok: true
industries: [Fintech, SaaS]
The more detail you put in, the better the scoring. But remember — the AI's score is a suggestion, not a ranking you have to follow.
Edit companies.yaml to add or remove companies for the Greenhouse and Ashby sources. Just use the company slug (the part of the URL on their careers page):
greenhouse:
- gitlab
- figma
- discord
- shopify
- stripe
ashby:
- openai
- anthropic
- linear
- resend
- clerk
JobRadar remembers jobs you've already seen so you don't re-review them on every run. By default, it keeps a 7-day cache in ~/.jobradar/seen_jobs.db.
# Change cache duration to 30 days
python -m jobradar -q "python" --cache-days 30
# Skip the cache entirely
python -m jobradar -q "python" --no-cache
# Clear the cache
python -m jobradar --clear-cache
The dashboard gives you a visual interface for everything:
- Header stats — total discovered, high match, pending review, applied
- Job cards with color-coded match scores (green/yellow/red)
- Inspector panel — full description, matched keywords, LLM reasoning
- Kanban pipeline — drag jobs from Discovered → Reviewing → Applied → Interviewing
- Config editor — edit profile.yaml and companies.yaml in the UI
- Live activity log — terminal-style console showing LLM scoring progress
- Keyboard shortcuts — J/K to scroll, E to edit, A to mark applied
Start it with:
cd dashboard
bash run.sh # Linux/macOS
# or
python -m uvicorn app:app --port 3000 # Windows
Then open http://localhost:3000.
| Flag | Default | What it does |
|---|---|---|
-q, --query |
— | Your search query |
-l, --location |
— | Filter by location |
-p, --profile |
profile.yaml |
Path to your profile |
--no-ai |
off | Skip AI rating (faster) |
--export |
— | Save results to .json or .csv |
--limit |
50 |
Max jobs per source |
--max-pages |
3 |
Max pages per source |
--max-concurrency |
3 |
Concurrent AI rating calls |
--companies |
companies.yaml |
Company list for ATS sources |
--cache-days |
7 |
Days to remember seen jobs |
--no-cache |
off | Disable the cache |
--clear-cache |
— | Clear cache and exit |
--list-ats-companies |
— | Show configured ATS companies |
--enable-linkedin |
off | ⚠️ Enable LinkedIn scraping |
--llm-url |
(auto-detect) | LLM server URL (auto-scans 11434, 8080, 1234) |
--llm-model |
qwen3:1.7b |
LLM model name (override auto-detection) |
JobRadar defaults to qwen3:1.7b (1.1 GB, fast on CPU). If you want a different model:
# Pull a different model
ollama pull qwen3:8b # larger, better reasoning, slower
ollama pull qwen2.5:1.5b # smaller, faster, less accurate
# Use it with JobRadar
python -m jobradar -q "python dev" --llm-model qwen3:8b
Or set it permanently in your environment:
export LLM_MODEL="qwen3:8b"
python -m jobradar -q "python dev"
job-radar/
├── setup.sh # Smart installer (Linux/macOS)
├── setup.ps1 # Smart installer (Windows)
├── package.json # npm wrapper
├── profile.yaml # Your profile (edit this)
├── companies.yaml # ATS company slugs (edit this)
├── jobradar/
│ ├── models.py # Job and Profile dataclasses
│ ├── rating.py # Local LLM rating with retry logic
│ ├── cache.py # SQLite seen-jobs cache
│ ├── display.py # Rich terminal UI
│ ├── cli.py # Search pipeline + argparse
│ └── sources/
│ ├── remotive.py # Remotive API
│ ├── arbeitnow.py # Arbeitnow API (paginated)
│ ├── remoteok.py # RemoteOK API
│ ├── jobicy.py # Jobicy API
│ ├── himalayas.py # Himalayas API
│ ├── greenhouse.py # Greenhouse ATS (direct API)
│ ├── ashby.py # Ashby ATS (direct API)
│ └── linkedin.py # LinkedIn scraping (opt-in)
└── dashboard/
├── app.py # FastAPI backend
├── database.py # SQLite storage
├── run.sh # Dashboard launcher
└── static/
└── index.html # Dark-mode SPA
A Note on AI in Job Search
We built JobRadar because job searching is exhausting and the tools out there either dump too many listings on you or try to automate the whole thing. We think the sweet spot is: let the machine do the grunt work (searching, filtering, summarizing) and keep the human making the actual decisions.
The AI scoring is there to save you time reading through listings, not to tell you what to apply for. A 95/100 score doesn't mean "apply immediately" — it means "this one looks relevant, worth a closer look." A 40/100 doesn't mean "skip it" — it might be a role you'd love that the AI just doesn't have enough context for.
You are the loop. The AI is just the filter.
LinkedIn scraping is off by default. It depends on undocumented HTML that breaks constantly and might violate their ToS. We keep it around because sometimes it's useful, but we'd rather you know the tradeoff:
python -m jobradar -q "python dev" --enable-linkedin
pip install pytest
pytest tests/ -v
MIT — see LICENSE