Model or dataset
elliottdehn/open-jobs avatar
elliottdehn/open-jobs

Open Jobs: 3.1 million job postings, ghost jobs included, released as data

~3M live jobs from 36 ATS, enriched with LLM-extracted fields + embeddings, released CC0. Includes agent tooling to search them (hull -> learn -> rank).

348 stars43 forksPythonCC0-1.0

At a glance

What is it?
A CC0 dataset and agent toolkit that crawls 65,000 career sites daily, grades every listing fresh, stale, re-stamped or ghost, and lets your AI agent search it locally with embeddings.
Who is it for?
Open Jobs fits job seekers tired of dead listings who use Claude Code or similar agents and want a fresh-first shortlist built locally, and developers who want a large, current, CC0 job corpus with embeddings for their own projects. Skip it if you need recruiter listings or aggregator coverage, guaranteed uptime from a funded team, or anything beyond the United States-centric career-site crawl.
Can I use it commercially?
Yes. CC0-1.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 2 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 18, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The ghost-jobs problem, named and graded

Job boards have an incentive problem the README states without diplomacy: they know which listings are dead and will not say, because revenue depends on a shelf that looks full. Open Jobs, by Elliott Dehn, attacks that with first-party evidence. It crawls career sites themselves, records the day it first sees every posting, and that first-seen clock cannot be re-stamped when a board refreshes the date to look fresh.

Every listing wears a verdict against a model of how long postings like it usually live. Fresh means younger than its peers, apply now. Stale means an outlier survivor, hard to fill, which can mean thin competition. Re-stamped means the posting claims to be newer than when the crawler first saw it, caught. Ghost means open for over a year, and the dataset holds forty thousand postings older than five years. Around 3.1 million current postings from 65,000 company career sites ship in the dataset, refreshed daily.

Using it with your agent

The agent path is the designed workflow, and the README makes it one paste: a single line asking your tool to clone the repository and help you find a job, working in Claude Code, Codex, Cursor or similar. There is also a Claude Code plugin route:

bash
/plugin marketplace add elliottdehn/open-jobs
/plugin install job-search@open-jobs

The flow that follows is conversational: the agent interviews you, writes a description of the job you want, pulls the nearest openings onto your disk, and returns a shortlist of fresh, eligible matches ranked by fit, with a local search page that learns from your yes and no responses on a laptop. The privacy claim is specific: your labels, notes and resume never leave your machine. An AGENTS.md file sits at the repository root with the instruction that agents read it in full before doing anything else, which is both a courtesy and a control.

Taking the data

The dataset is a first-class deliverable. One link provides an approximately 13 GB export, every open posting with full description, a 1536-dimension embedding and company fields, as one parquet file per applicant tracking system, rebuilt nightly and resumable if interrupted. Or three commands put the same data on disk with a query shell over it:

bash
git clone https://github.com/elliottdehn/open-jobs
cd open-jobs
uv run tools/jobs.py export

The only tooling requirement is uv, with one-line installers for every platform including winget on Windows. The licence is CC0, the strictest public-domain dedication in common use, so the data carries no reuse restrictions at all, which matters for anyone building a product on top: attribution is courteous, not required.

How it works, and what it costs

The pipeline has three stages described with unusual concreteness. Crawling uses one Cloudflare Durable Object per career site, 65,000 of them, each waking at its own time of day, diffing today's listings against yesterday's, and pulling the full description once for every new job; the first-seen date is written once and never changed. A nightly batch grades the fleet, trains estimators for posting age, salary, seniority and work arrangement, and publishes the search index as a few thousand groups of similar jobs with embeddings.

Search is deliberately local: your written description of the job you want is embedded once, the nearest groups download to your machine, and everything after that, ranking, labeling, learning from your feedback, happens locally. The whole system is around eleven thousand lines of code and roughly a dollar a day to run, numbers the README prints rather than implies, and the browser front end sends nothing except what you type.

Limits to weigh

The boundaries are the honest ones of a one-maintainer open project. There are no releases or tags, the last push was on 2026-09-16, and the support model is a form where you say what you are building and get an honest answer about what the maintainer can commit to, which is candid and finite. Coverage is career sites themselves, so aggregators and recruiter-posted listings outside those sites are out of scope by design. The grading model is learned, which means verdicts are calibrated estimates, not facts about an employer's intent.

The ghost-job framing also sets expectations: fresh is the default view, and the README's advice is built into the verdict, but a fresh listing is not a guaranteed real opening, it is a young one. Teams building on the data should read FIELDS.md for the enrichment fields and treat the nightly rebuild cadence as part of their own pipeline design.

Against job boards and scraped datasets

Commercial job boards offer reach and filters, and sell placement and freshness theater alongside; Open Jobs offers the underlying postings with an freshness verdict attached, no account, and a public-domain licence. Scraped dataset projects exist but usually ship stale snapshots without the per-listing age modeling that makes this one useful, and rarely with agent tooling that turns the data into a shortlist in five minutes.

The realistic comparison for a job seeker is between an evening of board-hopping and an evening of local search with honest dates. For a developer, the dataset is the rarer asset: millions of current postings with embeddings under CC0 is a foundation for matching engines, market research or salary analysis, and the README's support form suggests the maintainer wants to know what gets built. Both audiences are served by the same nightly artifact, which is efficient in the way good infrastructure usually is.

Editorial conclusion

Open Jobs fits job seekers tired of dead listings who use Claude Code or similar agents and want a fresh-first shortlist built locally, and developers who want a large, current, CC0 job corpus with embeddings for their own projects. Skip it if you need recruiter listings or aggregator coverage, guaranteed uptime from a funded team, or anything beyond the United States-centric career-site crawl. Verify the core claim in one evening: install uv, run the three export commands, and query the parquet files for your own role and city to see the fresh-versus-ghost split where you actually want to work.

Frequently asked questions

Is the Open Jobs data really free?

Yes. The dataset is CC0-licensed with no account required, and the full export, about 13 GB of postings with descriptions, embeddings and company fields, is downloadable directly or rebuilt locally with three commands.

How current are the job listings in Open Jobs?

Postings are crawled daily from 65,000 company career sites, and each one is graded fresh, stale, re-stamped or ghost against a model of typical posting lifetime. The first-seen date is recorded once and never re-stamped.

Can I use Open Jobs with my AI coding agent?

Yes. Paste the README's clone prompt into Claude Code, Codex or Cursor, or install the Claude Code plugin from the marketplace. The agent interviews you, pulls matching postings locally, and your labels and resume never leave your machine.

Official sources

  1. elliottdehn/open-jobs on GitHub
  2. Issues
  3. License: CC0-1.0
  4. README
Community notes

Community notes