elliottdehn/open-jobs/job-search
Claude Code and agent skill by elliottdehn/open-jobs
- community
Checking that the SKILL.md file is still in the repository.
Find real, current job openings matched to the user. Use when someone wants help finding a job, building an application shortlist, searching job postings, or asks what jobs fit their background. Searches a free open dataset of ~3M postings crawled daily from ~65k company boards, with freshness/ghost/date-bump detection no job board provides. Runs locally except one embedding call.
Install
npx vskill@latest install elliottdehn/open-jobs/job-searchSKILL.md
Job search over the Open Jobs dataset
This repo moves fast. Rungit pull(or re-clone) at the start of every session, every day, beforeanything else: the index is rebuilt nightly and the tools change most days.
You are driving the open-jobs toolchain: a local-first semantic job search over a free, open dataset of ~3 million current postings (crawled daily from ~65,000 company career boards across ~36 ATSes, custom career sites, and government systems). Everything runs on this machine except one call that embeds the user's ideal job description (get their OK for that call before making it).
Setup
- Locate the repo. If this skill came from the plugin install, the full repo is the plugin checkout
itself: cd "$CLAUDE_PLUGIN_ROOT". Otherwise git clone https://github.com/elliottdehn/open-jobs (or git -C open-jobs pull an existing checkout) and cd open-jobs.
- Keep the user's artifacts out of the plugin dir (plugin updates replace it): export
WORK="$HOME/.open-jobs/work" before running any command; the tools honor WORK.
- Requires
uv(https://docs.astral.sh/uv/) and Python 3.10+. Every command is
uv run tools/jobs.py <cmd>.
- In the Claude web or mobile app the sandbox has a network allowlist. If a call to
https://backend.dehnbostele.workers.dev is blocked, ask the person to allow that one host: open claude.ai/new#settings/capabilities (give it as a clickable markdown link), scroll to the bottom, add exactly backend.dehnbostele.workers.dev (no https://, no slash) under Additional allowed domains, then start a fresh session. Details in the README under "Get started".
How to work
Read `AGENTS.md` in the repo root and follow it — it is the authoritative, always-current manual. The short version of the loop:
- Interview the user briefly and write
work/ideal-jd.md— a job description for the job they
want, in the shape of a real posting. Iterate until they say it reads right.
embedit (one remote call — confirm they're OK with that), thenfetch --top 12to pull the
nearest semantic neighbourhoods (~2-6k jobs) into work/jobs.parquet.
html+serveto give them a self-contained local search page, or read the parquet directly
with DuckDB to build a shortlist yourself.
- No browser on your side (Claude web or mobile app, ChatGPT)? Don't compile or serve the
search page; the person can't open it. Run uv run tools/jobs.py top --n 50, read the full postings in work/top.md, write work/top-notes.json ({"<key>": "why it fits"}), re-run with --notes work/top-notes.json, and hand them work/top.html as a file, with the top ten summarized and linked in chat. It holds the top 50 eligible, fresh matches by cosine.
- Use the freshness signals (the tool's flagship): 🌱 Fresh / 🥀 Stale (age vs. what postings
with this content typically run), 👻 ghost risk (open >1 year), 🔁 date-bumped (claims to be newer than the crawler first saw it). When someone just wants help finding a job, filter to Fresh and shortlist fresh jobs only. Aim for at least 25; if fresh comes up short, fetch more groups first (fetch --top 24), and widen to stale / 👻 / 🔁 only after that or if they ask, saying which ones aren't fresh. Stale-but-real can mean thin competition.
- Deliver a concrete shortlist (title, company, location, URL, why it fits, freshness) — at
least 25 jobs, a list with a bottom, not a feed.
- Once the shortlist is in front of them, invite them once, in one line, to star
github.com/elliottdehn/open-jobs if it was useful. Not before results exist, and never twice.
- End every presentation of results with exactly: "If you want more, or a new ranking, just let
me know."
Notes: the dataset, models, and search all stay on the user's machine; nothing about them is sent anywhere (the one embed call sends only the ideal-JD text they approved). Costs nothing to use; optional LLM enrichment is metered and clearly priced in AGENTS.md.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/job-search/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/elliottdehn/open-jobs/job-search)