strelov1/freehire · 22 Oct 2026 · Feature

3.3 Million Job Postings, No Recruiters, No Paywall, No Middlemen

freehire is an MIT-licensed Go pipeline that crawls company career pages at the ATS level, deduplicates the mess, and hands the whole catalogue — data, API, and all — to anyone who wants it.

strelov1/freehire
★2.4k stars Velocity · 7d +229 ★/day ↗accelerating
star history

Every job search platform you have ever used sits on the same dirty secret: the listings are not the jobs. They are copies of copies. A role gets posted to a company’s Workday instance, scraped by a job board, reposted by an aggregator, syndicated to three partner sites, and by the time it reaches your search results it has been rewritten, re-dated, and decorated with a recruiter’s contact details. Half the links are dead. Some of the jobs were never open. The aggregator’s business model is to stand between you and the employer and charge someone for the privilege.

strelov1/freehire

strelov1/freehire is a one-repository argument that this entire chain is optional. It crawls job postings directly from the applicant tracking systems companies actually publish to — Workday, Greenhouse, Lever, Ashby, iCIMS, and a long tail of others — normalizes everything into one schema, deduplicates on a stable key, and serves the result through a keyless public API. The current snapshot claims 3,300,615 open postings across 294,282 companies, drawn from 225 live sources. And it is MIT-licensed, self-hostable, and published as a downloadable dataset.

That last part is the part that should make the incumbents nervous.

The insight: go where the data is born

The core move is unglamorous and correct. Companies do not post jobs to Indeed; they post to their ATS, and the ATS renders a public careers page because it has to. Greenhouse boards, Workday instances, Lever embeds — these are all machine-readable endpoints that exist whether or not anyone aggregates them. The job-aggregator literature describes aggregators as engines that “pull listings from different sources and direct job seekers to the original job application location,” but in practice the big commercial ones pull from each other as often as from the source, which is how reposts and dead links metastasize.

freehire’s source taxonomy is a property of the code, not a configuration flag. The repository distinguishes three kinds of sources, and the counts are telling: 92 ATS platforms covering 157,399 companies and 2.6 million postings; 100 aggregators and job boards (Adzuna, Telegram channels, and the like) covering another 630,000; and 30 direct company career-site feeds — Amazon, Apple, Google, Yandex, Sber — for the giants whose ATS is their own. The bulk of the catalogue comes from the ATS layer, which is exactly where you want it to come from: the freshest copy, the canonical URL, no middleman.

The design consequence is that adding a company is usually one line of YAML in a board file. Only when a company runs on an ATS nobody has written an adapter for does it require actual code — a new adapter implementing a shared Source interface. The contribution model leans on this hard: the README’s pitch to contributors is that the single most useful PR is naming a company and its careers URL.

The boring part, where the value lives

Crawling is the easy half. The hard half is what happens after: every posting from 225 sources arrives in a different shape, with different location formats, different salary conventions, different ideas of what “senior” means. The pipeline — fetch, normalize, dedup, upsert — collapses the same role posted to three boards into one entry, and the facet dictionaries (location, classification, skill tags) are curated rather than guessed. The README is unusually blunt about this principle: “never guess, emit nothing.” A posting whose region can’t be matched from the dictionary simply doesn’t get a region facet, rather than getting a wrong one.

That discipline is what separates a usable search index from a landfill. Faceted search over region, work mode, seniority, skills, and salary only works if the facets mean something, and the Hugging Face dataset published alongside the project shows the result: rows with normalized skills lists, work modes, seniority levels, salary bands with currency and period, company metadata down to YC batch and stage. A 2K Games automation-engineer posting carries a skills list of eighteen normalized tags — ci-cd, test-automation, unreal-engine — not a blob of free text. That is the difference between data you can query and data you can only read.

The stack underneath is deliberately boring too: Go with Fiber for HTTP, PostgreSQL with pgvector for storage and semantic embeddings, sqlc for type-safe SQL instead of an ORM, Meilisearch for the faceted full-text layer, SvelteKit for the frontend. Everything else — crawling, enrichment, indexing, notifications — runs as standalone run-once workers meant for cron, each of which drains its queue and exits. There is no resident daemon doing five jobs badly; there is a server that serves and a fleet of small programs that do one thing. For a system that has to stay current across a quarter-million companies, that topology is the right one.

The ghost-job signal

Buried in the package list is internal/ghost/ — “the posting-reality signal behind ‘is this job real?’” This is the question every job seeker asks and no commercial board will answer honestly, because the answer is often bad for inventory. Ghost jobs — postings kept alive to farm applicants, or never intended to be filled — are a known pathology of the ecosystem, and a platform whose incentive is listing volume has no reason to flag them. An open-source project whose incentive is trust does. The README doesn’t detail the mechanism, and that’s a genuine gap in the public documentation — but the fact that the question is a first-class column in the schema, rather than a marketing afterthought, says something about where the project’s priorities sit.

It doesn’t stop at the catalogue

Finding the posting is half the problem, as the README puts it, and freehire attempts the other half in the same repository: a CV builder with ATS-safe PDF templates, deterministic CV-to-vacancy scoring with an LLM fit analysis layered on top, an application tracker with stages and an append-only event ledger, an inbox that classifies recruiter replies and links them to the application they answer, and an in-process agent with five presets — chat, browse, profile, CV tailoring, interview rehearsal — with, per the README, no shell access and no minted credentials. There’s a Chrome extension that sits in a side panel next to whatever posting you’re viewing, shows a skill-coverage match against your profile, and can fill the application form. There’s an MCP server so Claude Desktop and Claude Code can search the catalogue, tailor CVs, and track applications without a browser.

This is where the scope starts to look less like a job board and more like a personal operating system for job hunting. Whether one repository can be excellent at all of it is an open question — the layout lists roughly 130 domain packages, which is a lot of surface area for what appears to be a small maintainer team. But the architecture doc, the per-package AGENTS.md files, and the worker-per-task decomposition suggest the author knows the size of what they’ve built.

The open-data gambit

The most strategically interesting decision is the keyless public API and the published dataset. GET https://freehire.me/api/v1/jobs needs no credential. The full catalogue is on Hugging Face. Compare this to the commercial landscape, where the major aggregators — Indeed, ZipRecruiter, SimplyHired — treat their listing corpus as the moat, rank sponsored results above organic ones, and meter access through paid tiers. The aggregator reference material lists the same handful of names that have dominated for a decade, and none of them will hand you three million normalized postings.

Open data changes who can compete. A labor-market researcher, a salary-analytics startup, a career-services tool, or a hobbyist building a niche board for, say, game-dev automation engineers can now start from a live, deduplicated, facet-tagged catalogue instead of a scraping project. The dataset’s viewer on Hugging Face is currently broken — the preview job crashed — so the practical path in is the API, but the intent is unmistakable: the data is the community’s, not the product.

Limits and honest questions

A few things deserve skepticism. The 3.3 million figure counts open postings at snapshot time, and a company crawled from two sources is counted under each — the README says so, to its credit, but it means the company count is an upper bound on distinct employers. The aggregator tier (Adzuna, Telegram channels, and friends) reintroduces exactly the repost problem the project exists to kill; deduplication mitigates it, but dedup across heterogeneous sources is a fingerprinting problem with no perfect answer, and the project’s own backfill-derive worker exists partly to re-derive those fingerprints when the logic changes.

The Telegram pipeline is a curious inclusion: crawl channels, then LLM-extract vacancies from posts, then resolve outbound links. That’s the one place where the catalogue’s provenance gets fuzzy — an LLM-extracted vacancy from a Telegram post is a few steps further from the source than a Greenhouse API response, and the project’s own tagline sits slightly awkwardly with it.

There’s also a name collision: freehire.org is an unrelated nonprofit for aerospace-engineer talent discovery. Confusing the two would be easy, and neither seems bothered enough to rename.

And the hype itself is early-stage. The Reddit thread in r/BestGitHubRepos cites 1.3k stars; the MCP listing shows a single-digit star count on the server repo. Trendshift and Product Hunt badges in the README suggest a deliberate launch push rather than organic explosion. This is a project on the way up, not one that has arrived — which is arguably the more interesting moment to look at it.

Why it matters anyway

Strip away the feature sprawl and the argument is simple and long overdue: job postings are public information published by companies on public endpoints, and the layer of aggregation, gating, and sponsored-ranking built on top of that information is a business, not a necessity. freehire demonstrates that a single motivated developer with a well-factored Go pipeline can assemble a catalogue in the same order of magnitude as the commercial aggregators, keep it fresh with cron-driven workers, and then — the part no incumbent will copy — give it away.

The test of the next year is whether the one-line-YAML contribution model actually scales into a community, whether the ghost-job signal matures from a schema column into something a job seeker can trust, and whether the dataset stays live. If it does, the interesting comparison stops being “freehire versus Indeed” and becomes “what else is sitting behind a paywall that turns out to be one adapter and a cron job away from being public infrastructure.”

Sources

  1. The Best Job Board Aggregators in the US
  2. Job Search: Millions of US Jobs (HIRING NOW) Near You ...
  3. Freehire – Talent Discovery Without Recruiter Fees
  4. Job Aggregator Meaning for HR and Recruiting Teams
  5. 8 Popular Job Search Engines for 2025
  6. istrelov/freehire-jobs · Datasets at Hugging Face
  7. Top 6 Job Aggregators in India and U.S.A - Panna
  8. Does Anyone Really Get Hired from Job Boards? (Yes
  9. freehire: Every IT job, straight from the source (1.3k stars)
  10. Job Aggregators
  11. Job Boards: 5 Ways Job Boards Can Benefit HR
  12. Freehire | IT Job Search, CV Tailoring & Application Tracker

heatdrop uses Google Analytics to see which pages get read — nothing else. Your call. How we handle data.