Self-Hosting freehire: An Open-Source Job Search Engine
Description and use
freehire provides a transparent, open-source alternative to commercial job boards by crawling ATS platforms directly. It offers a self-hostable solution with a robust architecture using run-once workers and transactional outboxes, ensuring data consistency and direct links to original job postings.
Problem
Traditional job boards act as middlemen, reposting listings, creating dead links, and obscuring the original source. Developers and job seekers need a transparent, direct way to access job postings from company career pages without aggregator interference.
Outcome
freehire provides a transparent, open-source alternative to commercial job boards by crawling ATS platforms directly. It offers a self-hostable solution with a robust architecture using run-once workers and transactional outboxes, ensuring data consistency and direct links to original job postings.
Workflow
- Clone the freehire repository from GitHub.
- Run 'make up' to build and start the entire stack (API, web frontend, PostgreSQL, Meilisearch, Redis, MinIO) via Docker Compose.
- Verify the service is running by checking the health endpoint and fetching jobs via the API.
- Add new companies by editing YAML board files in the 'sources/' directory (one line per company).
- Retire boards by moving their configuration lines to 'sources/retired/' rather than deleting them.
- Configure an OpenAI-compatible endpoint if AI features (CV tailoring, assistant) are required.
- Use the keyless public API or the self-hosted instance to search for jobs, ensuring results link directly to the source ATS.
Evidence
freehire is an open-source job aggregator that crawls company career pages directly — no recruiter reposts, no aggregator middlemen, no dead links.
It is MIT-licensed, self-hostable, built in Go with PostgreSQL + Meilisearch, and the public API needs no key.
The most interesting design decision in freehire is how it handles background work. It is not a monolith with a job queue daemon... Everything else... is a run-once worker.
No semantic/hybrid search... If you want semantic job matching, you will need to build it yourself.
- Record date: 2026-09-06T14:52:00.674Z