🧭 Decision Guide
Why trending now: 无法从材料判断
Try it if you
-
You need a self-hosted job catalogue built with Go, PostgreSQL, and Meilisearch.The README sections “Why freehire?” and “Stack” describe Go, PostgreSQL, and Meilisearch, and state that the project is self-hostable.
-
You need to crawl original listings from Workday, Greenhouse, or Lever and merge reposts.The README section “Why freehire?” lists Workday, Greenhouse, and Lever, and describes deduplication by a stable key.
-
You want to read job data through a public keyless HTTP API.The README section “API” explicitly says GET https://freehire.me/api/v1/jobs needs no credential.
-
You want scheduled workers for crawling, LLM enrichment, and Meilisearch indexing.The README section “Workers” says crawling, enrichment, indexing, and notifications are run-once workers.
Skip it if you
-
You only want a single application without PostgreSQL, Redis, and Meilisearch dependencies.The README sections “Quick start” and “Stack” require Docker Compose to start api, web, postgres, meilisearch, redis, and s3.
-
Your environment cannot provide Docker Compose or a persistent Postgres volume.The README section “Quick start” uses make up to build the full Docker stack and mounts migrations into the Postgres initialization directory.
-
You need to run enrich or Telegram vacancy extraction without LLM configuration.The README section “Workers” says go run ./cmd/enrich needs LLM_* config, while tg-extract also performs LLM extraction.
Requirements
- The README section “Quick start” requires Docker Compose and provides make up to start the full stack.
- The README section “Local development” explicitly states: JWT_SECRET is required for the server to start.
- Every worker needs DATABASE_URL and exits non-zero on failure.
- Running enrich requires LLM_* configuration; OAuth and LLM credentials left unset keep their gated features disabled.
- The README section “Quick start” uses port 8080 by default and provides HIRE_HOST_PORT=8090 make up to change it.
First step (verbatim from README)
make up # build + start the whole stack in Docker:
Watch out
-
After changing an existing migration, recreate the Postgres volume or run make migrate.The README section “Quick start” says changing a migration does not re-apply to an existing volume.
-
make reindex rebuilds the complete Meilisearch index from Postgres.The README section “Commands” defines make reindex as rebuilding the Meilisearch index from Postgres.
-
Workers do not hard-delete jobs; the lifecycle only soft-closes them.The README section “Workers” explicitly says: No worker hard-deletes jobs.
Alternatives
-
freehire.me hosted site:Use the hosted site mentioned in the README when you do not want to deploy the full Docker Compose stack with API, web, Postgres, and Meilisearch.Why freehire?
Not stated in the README
- The README does not specify minimum CPU, memory, or disk requirements for the full Docker Compose stack.
- The README does not provide crawl intervals, update latency, or per-run worker processing times for the 3.3M+ postings.
- The README does not describe Meilisearch index size or query performance at the 3.3M+ job scale.
- The README does not specify minimum versions for Go, PostgreSQL, Redis, Docker Compose, or S3-compatible storage.
- The README does not explain the maintenance responsibilities or production support commitments of the 10 contributors.
💡 Deep Analysis
6
Yes
I am integrating job search into Claude Desktop or Claude Code through MCP and do not want to maintain API-key authentication. Can this project directly satisfy that integration constraint?
Yes, it fits: the README provides both an MCP server for Claude Desktop and Claude Code and a keyless public jobs API.
- The “Beyond the catalogue” section explicitly lists an MCP server for Claude Desktop and Claude Code.
- The API section states that the catalogue is exposed through a public, keyless HTTP API and that
GET https://freehire.me/api/v1/jobsrequires no credential. - Responses use a predictable
data,meta, orerrorstructure, and jobs and companies are addressed by public slugs, which simplifies client integration. - Keyless access is not unlimited access. The project insights identify rate limits, caching, service stability, and data-use permissions as concerns. The README does not define the MCP tool list, quotas, or retry behavior.
Therefore, it is suitable as a Claude-facing data source and a quick integration target. It is not yet possible to confirm enterprise-grade quotas, private catalogue access, or an SLA from the provided documentation.
- Beyond the catalogue: A keyless public API and an MCP server for Claude Desktop and Claude Code
- API: `GET https://freehire.me/api/v1/jobs` needs no credential
- API: Responses use `{"data": ...}`, `{"data": ..., "meta": {...}}`, or `{"error": msg}`
curl localhost:8080/api/v1/jobs
Yes
I mainly search for remote IT jobs across 124 ATS platforms and 97 Telegram channels, and I need saved searches, digests, and an application board. Can freehire cover this workflow?
Yes, it covers the workflow from remote-job discovery through application tracking, but it does not replace verification on the original employer page.
- The README reports 3.3M+ unique live postings across 124 ATS platforms, 97 Telegram channels, and 320 sources, matching a cross-source search requirement.
- Search supports faceted full-text filtering by region, work mode, seniority, skills, and salary. These fields are derived from curated dictionaries rather than guessed values.
- “Beyond the catalogue” lists saved searches with email or Telegram digests, shared boards, an application board, recruiter-mail linking, an append-only event ledger, and reminders.
- The project insights note that job closure uses soft-close and periodic crawling, so status can lag. Salary, skills, work mode, and seniority fields can also be missing; the original company page remains necessary for confirmation.
It is therefore suitable as a high-volume job-search workspace and automation source. The README does not promise that every remote listing is real-time, complete, or continuously valid.
- Why freehire?: 3.3M+ unique live postings, 124 ATS platforms, 97 Telegram channels, and 320 sources
- Why freehire?: Faceted full-text search over region, work mode, seniority, skills, and salary
- Beyond the catalogue: saved searches with email/Telegram digests, application board, mail inbox, and reminders
- Project insights: job closure uses soft-close and periodic crawling; structured fields may be missing
curl localhost:8080/api/v1/jobs
It depends
I want to self-host freehire’s 3.3M+ job catalogue and run PostgreSQL, Meilisearch, Redis, and S3 together with Docker Compose. Is it suitable as my complete job-search infrastructure?
It depends: freehire provides a complete self-hostable stack, but operating a 3.3M+ posting catalogue is not a lightweight single-process deployment.
- The Quick start section provides
make up, which starts the api, web, postgres, meilisearch, redis, and s3 services for an end-to-end local setup. - The Stack section assigns different responsibilities to PostgreSQL/pgvector, Meilisearch, Redis, and S3-compatible storage, so the deployment carries several stateful services to maintain.
- The README reports 3.3M+ unique live postings, 470,000+ companies, and 320 sources; full indexing and ingestion can therefore require substantial storage and compute.
- Migration changes are not reapplied to an existing PostgreSQL volume. Recreating volumes with
docker compose down -vcan remove existing data.
This is a reasonable foundation for an operator comfortable with containers, databases, and search indexes. It is probably excessive if the requirement is only a small, read-only job lookup service.
- Quick start: `make up # build + start the whole stack in Docker`
- Stack: PostgreSQL + pgvector, Meilisearch, Redis, S3-compatible object storage, and Docker Compose
- Why freehire?: Aggregating 3.3M+ unique live postings from 470,000+ companies and 320 sources
- Quick start: Changing a migration does not re-apply to an existing volume
make up
Yes
I need OpenAI-compatible models for CV tailoring, job matching, and interview rehearsal, with cross-provider fallback and call tracing. Does freehire fit this LLM architecture constraint?
Yes, architecturally it fits: freehire is designed around OpenAI-compatible endpoints, provider fallback, and LLM observability, although model quality and cost still depend on your endpoint configuration.
- The Stack section says langchaingo accesses LLMs through any OpenAI-compatible endpoint, avoiding a hard dependency on one vendor.
- Bifrost provides per-user virtual keys, cross-provider fallback, and spend tracking, which supports multi-provider routing and budget control.
- Langfuse provides LLM call tracing and observability. The feature reference also lists AI fit analysis, CV tailoring, and interview rehearsal.
- OAuth and LLM credentials are optional. The Local development section says that features gated by unset credentials remain disabled.
The architecture therefore matches your integration requirements. However, the README does not name supported models, token costs per feature, latency expectations, quality thresholds, or fallback triggers. It cannot establish that a particular model will produce acceptable CV content.
- Stack: langchaingo — LLM access over any OpenAI-compatible endpoint
- Stack: Bifrost — per-user virtual keys, cross-provider fallback, and spend tracking
- Stack: Langfuse — LLM call tracing and observability
- Local development: OAuth and LLM credentials are optional; gated features stay disabled when unset
make up
Yes
I need to add Workday, Greenhouse, or Lever to freehire while keeping Go and sqlc type-safe queries without an ORM. Does the project provide an extension path that fits these constraints?
Yes, it fits: the README defines source ingestion, normalization, and SQL-generated type-safe access as explicit architectural boundaries that align with Go and sqlc without an ORM.
- The “Why freehire?” section lists Workday, Greenhouse, Lever, Ashby, and iCIMS, and says postings are normalized into one schema and deduplicated on a stable key.
- It states that adding a company is one row in the board catalog, suggesting that many source additions are configuration-driven rather than full-system rewrites.
- The Stack section uses Go with Fiber v2 for the HTTP server and sqlc for type-safe database access generated from SQL, explicitly noting “no ORM.”
- The project insights describe separate ingestion adapters, normalization, deduplication, and soft-close lifecycle handling. However, the supplied README excerpt does not include the adapter interface, field mapping rules, or test requirements.
The extension model is therefore a good fit conceptually. Before implementing a source, you still need the omitted Adding a source, Sources, and Workers sections to verify adapter availability and scheduling requirements.
- Why freehire?: Workday, Greenhouse, Lever, Ashby, and iCIMS; One schema, deduplicated
- Why freehire?: Adding a company is one row in the board catalog
- Stack: Go + Fiber v2; sqlc — type-safe DB access from SQL (no ORM)
- Project insights: sources extend through adapters and catalog configuration; ingestion, enrichment, embedding, indexing, and notification use independent Workers
make help
It depends
My frontend uses SvelteKit 2, Svelte 5 runes, and Tailwind 4, and I also need to build freehire’s web app and extension. Can this repository fit directly into my frontend workflow?
It depends: the technology stack is a strong match, but both web and extension depend on a repository-local design-system symlink and are not fully independent frontend packages.
- The Frontend section explicitly uses SvelteKit 2, Svelte 5 runes, Tailwind 4, and
adapter-node, matching your stated frontend stack. - The web application is server-rendered, lives under
web/, and consumes the backend through a same-origin API. A purely client-rendered application or a different routing model would need adaptation. - The README specifically says the shared tokens and components come from the sibling
design-systempackage, which must be installed before buildingweb/orextension/; it is symlinked rather than copied. - The repository contains substantial TypeScript and Svelte code, but the README does not define the extension’s browser support matrix or release process.
It is therefore a good fit for a SvelteKit-oriented workflow. Compatibility is less certain if your CI disallows symlinks or requires a documented browser compatibility matrix.
- Frontend: A server-rendered SvelteKit 2 app (Svelte 5 runes, Tailwind 4, adapter-node)
- Frontend: install `design-system` before building `web/` or `extension/`, since it is symlinked, not copied
- Project data: TypeScript 3,725,228; Svelte 2,712,052
make up
✨ Highlights
-
Aggregates 3.37M open postings from 320 sources
-
Crawls original listings from 124 ATS platforms including Workday
-
PostgreSQL and Meilisearch power job filtering and search
-
MIT-licensed with a public keyless HTTP API
-
Docker Compose runs multiple infrastructure services together
🔧 Engineering
-
Uses Meilisearch for faceted search by region, skills, and salary
-
Deduplicates reposted jobs using a stable key
-
Provides a credential-free jobs API at GET /api/v1/jobs
-
Worker commands cover crawling, embeddings, and indexing
⚠️ Risks
-
make up starts the full stack including API, web, and Postgres
-
The server will not start without JWT_SECRET
-
enrich and embed depend on DATABASE_URL and queue configuration
-
Existing Postgres volumes do not automatically reapply migrations
👥 For who?
-
Development teams building a self-hosted Go job-data pipeline
-
Search engineers using PostgreSQL and Meilisearch
-
Job-product developers wanting CLI or MCP integration