{"slug": "jobradar-open-source-job-search-agent-that-scores-listings-with-a-local-llm", "title": "JobRadar: Open-source job search agent that scores listings with a local LLM", "summary": "JobRadar, an open-source command-line job search agent, searches 8 free job sources simultaneously and uses a local LLM to score listings 0-100 on skills, experience, salary, and remote fit, with the AI serving as a guide rather than a decision-maker. The tool, which supports Ollama or llama.cpp backends and works fully offline, includes a web dashboard at localhost:3000 and is available via GitHub at ANIRudH-lab-life/job-radar.", "body_md": "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.\n\nIt 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.\n\nMost 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.\n\nBut 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.\n\nSo use the scores as a starting point, not a verdict.\n\n**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\n\n```\ncurl -fsSL https://raw.githubusercontent.com/ANIRudH-lab-life/job-radar/main/setup.sh | bash\nnpx jobradar-setup\n# or\ngit clone https://github.com/ANIRudH-lab-life/job-radar.git\ncd job-radar\nnpm run setup\ngit clone https://github.com/ANIRudH-lab-life/job-radar.git\ncd job-radar\n.\\setup.ps1\ngit clone https://github.com/ANIRudH-lab-life/job-radar.git\ncd job-radar\npython3 -m venv .venv\nsource .venv/bin/activate   # Windows: .venv\\Scripts\\activate\npip install -r requirements.txt\npip install -r dashboard/requirements.txt\n```\n\nThe smart installer (`setup.sh`\n\n/ `setup.ps1`\n\n) checks each dependency before downloading:\n\n| Step | Checks for | Downloads if missing |\n|---|---|---|\n| 1. Python | 3.9+ in PATH | — (shows install link) |\n| 2. pip packages | Each import individually | Only missing packages |\n| 3. LLM Backend | You choose: Ollama or llama.cpp |\nOllama install + model pull, or llama.cpp binary |\n| 4. LLM Model | Only if llama.cpp chosen | qwen3-1.7b Q4_K_M (~1.1GB) GGUF |\n| 5. Config | profile.yaml | Creates defaults |\n\nSafe to re-run — second run is instant, nothing re-downloaded.\n\nThe installer asks which LLM backend you prefer:\n\n**Ollama (recommended)**— auto-installs the model, easy to manage, works out of the box** llama.cpp (faster)**— raw performance, downloads GGUF model manually\n\n| Platform | Installer | llama-server source |\n|---|---|---|\n| Linux (x64) | `bash setup.sh` |\nOllama (recommended) or GitHub release zip |\n| macOS (ARM) | `bash setup.sh` |\nOllama (recommended) or `brew install llama.cpp` |\n| macOS (Intel) | `bash setup.sh` |\nOllama (recommended) or `brew install llama.cpp` |\n| Windows (x64) | `.\\setup.ps1` |\nOllama (recommended) or GitHub release zip |\n\n```\ncd job-radar\nsource .venv/bin/activate   # Windows: .venv\\Scripts\\activate\n\n# Quick search (no AI — fast)\npython -m jobradar -q \"python developer\" --no-ai\n\n# Search with AI rating (needs a local LLM running)\npython -m jobradar -q \"python developer\" -p profile.yaml\n\n# Interactive mode — just run it and type queries\npython -m jobradar\n\n# Web dashboard\ncd dashboard && bash run.sh   # Windows: python -m uvicorn app:app --port 3000\n# Open http://localhost:3000\n\n# Start the LLM server (for AI scoring)\n# Option A: Ollama (recommended)\nollama serve &                              # if not already running\npython -m jobradar -q \"python dev\" -p profile.yaml\n\n# Option B: llama.cpp (faster)\nllama-server --model models/qwen3-1.7b-q4_k_m.gguf --port 8080\npython -m jobradar -q \"python dev\" -p profile.yaml\n```\n\n| Source | Type | Notes |\n|---|---|---|\n| Remotive | Job board API | Remote jobs |\n| Arbeitnow | Job board API | Worldwide, paginated |\n| RemoteOK | Job board API | Remote jobs, good volume |\n| Jobicy | Job board API | Remote jobs with salary data |\n| Himalayas | Job board API | Remote jobs with seniority levels |\n| Greenhouse | Direct ATS |\n15 curated tech companies (Gitlab, Figma, Stripe, etc.) |\n| Ashby | Direct ATS |\n15 curated tech companies (OpenAI, Anthropic, Linear, etc.) |\n| Web scraping |\n\nThe 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`\n\n.\n\nCreate a `profile.yaml`\n\nwith your details so the AI can score jobs against your actual background:\n\n```\nname: \"Your Name\"\ntitle: \"Software Engineer\"\nexperience_years: 5\nskills: [Python, Docker, AWS, React]\ndesired_roles: [Backend Engineer, SRE]\nsalary_min: 100000\nsalary_max: 160000\nlocation_preference: \"Remote\"\nremote_ok: true\nindustries: [Fintech, SaaS]\n```\n\nThe 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.\n\nEdit `companies.yaml`\n\nto add or remove companies for the Greenhouse and Ashby sources. Just use the company slug (the part of the URL on their careers page):\n\n```\ngreenhouse:\n  - gitlab\n  - figma\n  - discord\n  - shopify\n  - stripe\n\nashby:\n  - openai\n  - anthropic\n  - linear\n  - resend\n  - clerk\n```\n\nJobRadar 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`\n\n.\n\n```\n# Change cache duration to 30 days\npython -m jobradar -q \"python\" --cache-days 30\n\n# Skip the cache entirely\npython -m jobradar -q \"python\" --no-cache\n\n# Clear the cache\npython -m jobradar --clear-cache\n```\n\nThe dashboard gives you a visual interface for everything:\n\n**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\n\nStart it with:\n\n```\ncd dashboard\nbash run.sh          # Linux/macOS\n# or\npython -m uvicorn app:app --port 3000   # Windows\n```\n\nThen open [http://localhost:3000](http://localhost:3000).\n\n| Flag | Default | What it does |\n|---|---|---|\n`-q` , `--query` |\n— | Your search query |\n`-l` , `--location` |\n— | Filter by location |\n`-p` , `--profile` |\n`profile.yaml` |\nPath to your profile |\n`--no-ai` |\noff | Skip AI rating (faster) |\n`--export` |\n— | Save results to `.json` or `.csv` |\n`--limit` |\n`50` |\nMax jobs per source |\n`--max-pages` |\n`3` |\nMax pages per source |\n`--max-concurrency` |\n`3` |\nConcurrent AI rating calls |\n`--companies` |\n`companies.yaml` |\nCompany list for ATS sources |\n`--cache-days` |\n`7` |\nDays to remember seen jobs |\n`--no-cache` |\noff | Disable the cache |\n`--clear-cache` |\n— | Clear cache and exit |\n`--list-ats-companies` |\n— | Show configured ATS companies |\n`--enable-linkedin` |\noff | |\n`--llm-url` |\n(auto-detect) |\nLLM server URL (auto-scans 11434, 8080, 1234) |\n`--llm-model` |\n`qwen3:1.7b` |\nLLM model name (override auto-detection) |\n\nJobRadar defaults to `qwen3:1.7b`\n\n(1.1 GB, fast on CPU). If you want a different model:\n\n```\n# Pull a different model\nollama pull qwen3:8b          # larger, better reasoning, slower\nollama pull qwen2.5:1.5b      # smaller, faster, less accurate\n\n# Use it with JobRadar\npython -m jobradar -q \"python dev\" --llm-model qwen3:8b\n```\n\nOr set it permanently in your environment:\n\n```\nexport LLM_MODEL=\"qwen3:8b\"\npython -m jobradar -q \"python dev\"\njob-radar/\n├── setup.sh              # Smart installer (Linux/macOS)\n├── setup.ps1             # Smart installer (Windows)\n├── package.json          # npm wrapper\n├── profile.yaml          # Your profile (edit this)\n├── companies.yaml        # ATS company slugs (edit this)\n├── jobradar/\n│   ├── models.py         # Job and Profile dataclasses\n│   ├── rating.py         # Local LLM rating with retry logic\n│   ├── cache.py          # SQLite seen-jobs cache\n│   ├── display.py        # Rich terminal UI\n│   ├── cli.py            # Search pipeline + argparse\n│   └── sources/\n│       ├── remotive.py   # Remotive API\n│       ├── arbeitnow.py  # Arbeitnow API (paginated)\n│       ├── remoteok.py   # RemoteOK API\n│       ├── jobicy.py     # Jobicy API\n│       ├── himalayas.py  # Himalayas API\n│       ├── greenhouse.py # Greenhouse ATS (direct API)\n│       ├── ashby.py      # Ashby ATS (direct API)\n│       └── linkedin.py   # LinkedIn scraping (opt-in)\n└── dashboard/\n    ├── app.py            # FastAPI backend\n    ├── database.py       # SQLite storage\n    ├── run.sh            # Dashboard launcher\n    └── static/\n        └── index.html    # Dark-mode SPA\n```\n\nWe 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.**\n\nThe 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.\n\n**You are the loop. The AI is just the filter.**\n\nLinkedIn 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:\n\n```\npython -m jobradar -q \"python dev\" --enable-linkedin\npip install pytest\npytest tests/ -v\n```\n\nMIT — see [LICENSE](/ANIRudH-lab-life/job-radar/blob/main/LICENSE)", "url": "https://wpnews.pro/news/jobradar-open-source-job-search-agent-that-scores-listings-with-a-local-llm", "canonical_source": "https://github.com/ANIRudH-lab-life/job-radar", "published_at": "2026-08-02 05:30:33+00:00", "updated_at": "2026-08-02 05:52:37.982185+00:00", "lang": "en", "topics": ["artificial-intelligence", "ai-tools", "ai-agents", "large-language-models"], "entities": ["JobRadar", "ANIRudH-lab-life", "Ollama", "llama.cpp", "Remotive", "Arbeitnow", "RemoteOK", "Jobicy"], "alternates": {"html": "https://wpnews.pro/news/jobradar-open-source-job-search-agent-that-scores-listings-with-a-local-llm", "markdown": "https://wpnews.pro/news/jobradar-open-source-job-search-agent-that-scores-listings-with-a-local-llm.md", "text": "https://wpnews.pro/news/jobradar-open-source-job-search-agent-that-scores-listings-with-a-local-llm.txt", "jsonld": "https://wpnews.pro/news/jobradar-open-source-job-search-agent-that-scores-listings-with-a-local-llm.jsonld"}}