开源求职搜索引擎 freehire:直连 47 万家企业 ATS,集成 AI 简历匹配与 MCP 协议
英文标题:🔥 strelov1/freehire
freehire 是一款基于 MIT 协议完全开源、支持自部署的求职搜索引擎与求职管理工作区。该项目绕过招聘中介,直接从 Workday、Greenhouse、Lever 等 124 种 ATS 平台及 47 万家企业官网聚合抓取职位数据,构建了超 330 万条无重复有效职位的庞大索引。除分面检索与“幽灵岗位”识别外,freehire 还内置基于 pgvector 的语义匹配、原生支持 Claude Code 与 Claude Desktop 的 MCP Server、AI 简历定制与投递追踪系统,为开发者和求职者提供了透明可扩展的招聘基础设施。
1.7 KB
7.5 MB
中文
- 直达源头:所有职位信息均直接从企业自身的招聘管理系统(ATS)爬取——包括 Workday、Greenhouse、Lever、Ashby、iCIMS 以及大量长尾系统——并直链至原始发布页面。没有中介猎头的重复倒转,没有聚合平台的中间层剥削,也没有死链。
- 统一数据结构,全面去重:同一职位即使发布到三个渠道,也会合并为单一记录:每个职位均被标准化为同一种数据规格,并通过稳定的唯一键进行去重。
- 真正懂求职场景的搜索:支持针对地区、工作模式、工作年限/资历、技能与薪资的分面全文检索——所有维度均基于精选标准化词典映射,绝不妄加猜测。
- 真正开源:采用 MIT 协议且完全支持私有化自部署,数据流水线与数据源全部公开透明。添加一家新企业只需在看板目录中新增一行配置。
- 随心扩展构建:提供整洁易用的 HTTP API、CLI 命令行工具、Telegram 聚合摘要,以及基于职位目录构建的完整求职工作区。你可以直接使用官方托管服务,自行部署实例,或基于其二次开发。
目前已聚合来自 470,000+ 家企业、横跨 124 种 ATS 平台、多家长尾聚合器/直达数据源以及 97 个 Telegram 频道的 330 万+ 条独立在线职位——总计 320 个数据源。跨渠道发布的重复职位均已合并去重,因此本文提及的每一项数据均与 freehire.me/jobs 上的实际展示完全一致。
如果 freehire 为你节省了时间——或者你认同“直达源头获取职位”的理念——点一个 ⭐ 能帮助更多人发现它。
找到职位仅仅解决了一半问题。另一半痛点——编写简历、完成投递并追踪后续进展——均基于相同的数据、在同一个代码仓库内以相同的开源协议实现。
| 模块 | 功能说明 |
|---|---|
| Find(检索) | 分面检索、精选合集、支持邮件/Telegram 摘要推送的已保存搜索、共享看板、市场数据分析、“幽灵职位”识别信号 |
| Apply(申请) | 简历生成器(支持通过 ATS 筛选的安全 PDF 模板)、确定性简历↔职位评分、AI 匹配度分析、绝不胡编乱造的定制化简历调整、追踪链接、内推渠道 |
| Track(追踪) | 支持各阶段流转的申请管理看板、可自动将招聘人员回复关联至对应申请记录的收件箱、仅支持追加操作的事件账本、提醒事项 |
| Ask(问答) | 拥有 5 种预置模式(聊天、浏览、画像、简历定制、面试演练)的进程内 Agent——无需 Shell 权限,亦无需预制密钥凭证 |
| Build on(扩展) | 无需鉴权密钥的公开 API、CLI、面向 Claude Desktop 与 Claude Code 的 MCP server、表单自动填充浏览器扩展、ChatGPT Actions |
完整特性参考手册 → docs/features.md — 详细说明了每项功能的作用、在目录树中的具体位置、哪些功能需要配置 LLM 端点,以及哪些功能会消耗 AI 额度。
技术栈
- Go + Fiber v2 — HTTP API 服务端
- PostgreSQL + pgvector — 数据存储、过滤检索与语义嵌入(embeddings)
- sqlc — 基于原生 SQL 生成类型安全的数据库访问代码(无 ORM 负担)
- Meilisearch — 全文搜索与分面职位检索
- langchaingo — 面向任意兼容 OpenAI 端点的 LLM 统一访问层(无特定厂商绑定)
- Bifrost — LLM 网关:支持基于单用户的虚拟密钥分配、跨厂商故障转移及开销追踪
- Langfuse — LLM 调用链路追踪与可观测性体系
- SvelteKit 2(Svelte 5 runes)+ Tailwind 4 — 位于
web/下的服务端渲染前端应用 - Redis — 请求限流与实时事件分发 · S3 兼容对象存储 — 保存简历、头像及预览文件
- Prometheus(通过 node_exporter textfile collector)+ Grafana — 数据摄入与 LLM 基础设施监控指标和仪表盘
- Docker Compose — 本地开发容器编排
本地快速上手
bash make up # 在 Docker 中构建并启动完整技术栈: # api, web, postgres, meilisearch, redis, s3 curl localhost:8080/health curl localhost:8080/api/v1/jobs
数据库迁移脚本会在 Postgres 存储卷首次初始化时自动执行(migrations/ 目录已挂载至容器的 /docker-entrypoint-initdb.d)。修改迁移文件不会自动对已有存储卷生效——可通过 docker compose down -v && make up 重建,或通过 make migrate 手动应用未执行的迁移。
若本地 8080 端口已被占用,可指定其他主机端口:
bash HIRE_HOST_PORT=8090 make up
若仅在容器中运行数据库、服务在宿主机运行:
bash docker compose up -d db # 仅启动数据库容器 make run # 在宿主机启动服务,自动读取 DATABASE_URL
复制 .env.example 并重命名为 .env,按需修改配置。服务启动必须配置 JWT_SECRET;OAuth 及 LLM 凭证为选填项(未配置时对应的功能特性将保持停用)。
bash make help # 查看所有可用命令 make sqlc # 基于 SQL 文件重新生成 Go 数据库代码(通过 Docker 运行,无需本地安装 sqlc) make tidy # 执行 go mod tidy make psql # 进入数据库容器执行 psql make reindex # 从 Postgres 数据全量重建 Meilisearch 索引 make migrate # 对已有数据库存储卷手动应用迁移文件
服务端只负责处理并提供 API。其他全部任务——爬虫、数据加工增强、索引构建、通知推送——均由独立的单次运行 Worker(专为 Cron 定时任务设计)处理:它们在执行完爬取或消费完队列后即自动退出。执行 ls cmd/ 可查看完整列表,以下是核心命令:
bash go run ./cmd/migrate # 应用未执行的迁移(在部署依赖新 schema 的代码前运行) go run ./cmd/ingest greenhouse # 抓取单个提供商目录下的看板并 upsert 职位(也可通过 INGEST_PROVIDER 指定) go run ./cmd/enrich # 消费数据加工队列(调用 LLM,需要配置 LLM_* 环境变量) go run ./cmd/embed # 消费语义向量队列并将分块结果存入 pgvector go run ./cmd/search-drain # 将排队的职位写入任务增量刷入在线搜索索引(建议每 1-2 分钟运行一次) go run ./cmd/reindex # 从 Postgres 全量重建 Meilisearch 索引(无缝切换) go run ./cmd/tg-ingest # 抓取 telegram_channels 中的活跃频道 go run ./cmd/tg-extract # 通过 LLM 从抓取的 Telegram 帖子中提取职位信息 go run ./cmd/capture-apply-form # 抓取待处理职位的 ATS 原始申请表单结构 go run ./cmd/backfill-derive # 通过单次 keyset 遍历全量重新推导所有确定性字段(分面属性、指纹识别、slug 等;完成后建议执行 make reindex)
每个 Worker 都必须提供 DATABASE_URL,失败时会以非零状态码退出。没有任何 Worker 会对职位进行物理硬删除,职位生命周期管理仅进行软关闭(soft-close)。
目录结构
text cmd/ 程序入口:包含 API 服务端以及上述各独立 Worker migrations/ SQL 数据库架构定义(同时作为 sqlc 代码生成与 initdb 初始化的源头) web/ 基于 SvelteKit 构建的前端项目 extension/ Chrome 侧边栏面板扩展 design-system/ 共享设计规范与通用组件,通过软链接共享给 web/ 与 extension/ internal/ 包含约 130 个领域包,核心模块包括: config/ 环境变量配置解析 database/ db/ pgxpool 连接池管理;sqlc 生成代码及 queries/*.sql 源码 handler/ HTTP 路由处理器 auth/ 认证原语(JWT Cookie、API Key)及 OAuth 登录 sources/ 数据源适配器(greenhouse / lever / adzuna 等)与注册中心 boardcatalog/ 看板目录:记录哪家企业在哪个 ATS 下对应何种 board id pipeline/ 数据摄入执行引擎(拉取 → 标准化 → 去重 → upsert 写入) linksource/ 解析 Telegram 消息中发现的出站职位外部链接 telegram/ Telegram 频道爬取与基于 LLM 的职位信息抽取 enrich/ 强类型的 AI 数据加工契约及队列消费执行器 search/ searchdrain/ Meilisearch 索引维护与检索;写入队列的增量消费 embed/ 将语义分块向量嵌入写入 pgvector location/ classify/ skilltag/ 人工校验维护的分面字典——绝不猜测,未匹配则留空 ghost/ 识别“该职位是否真实存在”的岗位真实性信号分析 jobview/ 对外公开的单条职位统一传输格式 cv/ cvedit/ 结构化简历及 PDF 渲染导出;cvedit 是唯一的写入口 experience/ 支撑简历各项描述的不可变真实任职与佐证事实原子库 cvmatch/ matchanalysis/ 确定性简历↔职位评分机制;在此基础上的 LLM 深度匹配分析 applyform/ 已捕获的 ATS 申请表单结构(保留各 ATS 平台自身的字段规范) userjob/ appevent/ 用户维度的状态追踪(浏览/申请/收藏/状态流转)及事件账本 inbox/ 招聘人员来信处理 → 分类识别 → 自动关联对应求职记录 assistant/ 进程内 Agent:执行轮次循环、工具调用与对话记录管理 browsertools/ 负责在 Agent 与浏览器扩展之间转发工具帧消息 referral/ collections/ 员工内推管理;精选企业标签归类 llm/ llmkey/ 解耦各厂商的统一 LLM 客户端,支持按用户归因开销统计
系统各组件如何协作(包括从爬取到搜索的拓扑图、各目录的职责划分、职位检索/简历定制/应用内助手三大核心流程链路拆解,以及认证模型、通知系统与职位生命周期),详见架构说明文档:docs/architecture.md。
架构文档是系统的蓝图地图;而其所链接的各个包目录下的 AGENTS.md 文件则是具体落地的代码实况。
公开 API
职位目录通过无需认证的公共 HTTP API 对外开放——调用 GET https://freehire.me/api/v1/jobs 不需要任何密钥凭据。所有接口响应均采用统一规范:{"data": ...}(单条记录)、{"data": ..., "meta": {...}}(列表数据)或 {"error": msg};职位与公司均通过公开 slug 进行标识与访问。
完整接口文档——包含所有端点定义、请求参数、鉴权模式以及全量搜索过滤条件词汇表:freehire.me/docs/api。
数据源分布与统计
截至 2026-10-20 的数据快照——覆盖 477,323 家企业、320 个数据源,共计 3,371,563 条唯一在线职位;其中 304 个数据源在当天保有活跃招聘记录。以上计数均为去重后的独立有效职位:即使一个职位跨多个渠道发布也仅计算一次(下方按类别汇总的数量略高于此总数,因为同一条跨渠道职位会被分别计入对应的源分类中)。所有数据源分为以下三大类别:
- ATS 招聘管理系统平台:面向多租户 ATS 系统的适配器,每个系统接入众多企业(Workday、Greenhouse、Lever、iCIMS 等)。共计 117 个拥有活跃职位的平台 · 2,936,676 条有效职位。
- 聚合平台与招聘看板:集中分发多家公司职位的第三方数据流(Adzuna、trudvsem、himalayas 以及 97 个 Telegram 频道等)。共计 133 个拥有活跃职位的数据源 · 444,654 条有效职位。
- 企业官方招聘主页:直接针对企业自身招聘官网爬取的单企业专属数据流(Amazon、Apple、Google、Yandex、Sber 等)。共计 52 个拥有活跃职位的源 · 23,293 条有效职位。
数据源的类别并非外部配置,而是由适配器自身 Go 类型的固有属性决定,因此 internal/ingest/sources 无需发起网络请求即可对每个接入源完成归类。
各数据源的详细拆解清单(包含每个源各自的有效职位数)记录于独立文档:docs/sources.md,最新数据可随时访问 freehire.me/sources 查看。
扩展与接入新企业
新增一家企业非常简单,仅需在 boards 目录中新增一行配置——包含 company + provider + board——你可以通过官方网站上的“contribute a board(贡献看板)”表单提交,维护人员也可以直接执行命令录入:go run ./cmd/add-board --provider=… --board=… --company=… --apply。而新增一种 ATS 平台,则需要在 internal/ingest/sources 中实现对应的新适配器,并在 sources.All 中增加一行注册——所有适配器均实现统一的 Source 接口,并且任何看板配置在进入目录之前,都会先经过注册中心的有效性校验。
对于绝大多数企业,其所采用的 ATS 平台早已得到系统支持,因此添加它们只需一行目录配置。只有当某家企业使用的是系统尚未支持的 ATS 系统时,才需要编写全新的提供商适配器。无论属于哪种情况,如果你希望添加新的数据源,推荐首先提交一个 Issue——附上企业名称与其招聘主页 URL,我们会在编写代码前协助确认这是一行配置即可搞定,还是需要开发全新的适配器。
前端与浏览器插件
- Web 前端:基于 SvelteKit 2(Svelte 5 runes、Tailwind 4、
adapter-node)构建的服务端渲染应用位于web/目录下,与 API 同域通信;开发模式下通过 Vite 代理将/api请求转发至后端。共享的设计 Token 与组件提取在同级的design-system/包中——在构建web/或extension/之前请务必先安装该包,因为它通过符号链接进行引用而非文件拷贝。参见 web/AGENTS.md。 - Chrome 扩展:该扩展能够将求职申请 Agent 放置在侧边栏面板中,随时附着在你的职位浏览页面旁:当你提问时它能实时读取当前页面,针对你的 freehire 画像输出确定性的技能覆盖匹配度,并能协助你自动填写求职申请表单。扩展源码位于
extension/目录(参见 extension/AGENTS.md)。
参与贡献
项目非常欢迎社区贡献,Issue 与 PR 对所有人开放。 无需白名单,没有审批门槛——随时提交。
最简单的参与方式就是贡献数据源:通过网站上的“contribute a board”表单提交目标企业看板,或者在 internal/ingest/sources 中提交新的适配器 PR。发现你心仪的企业暂未收录?只需提交该公司的招聘主页 URL,这就是对本项目最有价值的帮助。
各种疑问或初步构想同样欢迎在 Discussions 中提出——无需先整理成严肃的 Issue。对于较大型的功能改造,提前开 Issue 沟通能避免走弯路,当然你也可以直接提交 PR。
有关持续集成运行的代码检查规范请参考 CONTRIBUTING.md,关于系统架构与开发约定的更多信息请阅读 AGENTS.md。
English / 原文
- Straight from the source. Every listing is crawled directly from a company's own ATS — Workday, Greenhouse, Lever, Ashby, iCIMS and a long tail of others — and links to the original posting. No recruiter reposts, no aggregator middlemen, no dead links.
- One schema, deduplicated. The same role posted to three boards collapses into one entry: every posting is normalized into a single shape and deduplicated on a stable key.
- Search that understands jobs. Faceted full-text search over region, work mode, seniority, skills and salary — derived from curated dictionaries, never guessed.
- Actually open. MIT-licensed and self-hostable, pipeline and data both in the open. Adding a company is one row in the board catalog (how).
- Yours to build on. A clean HTTP API, a CLI, Telegram digests, and a whole workspace on top of the catalogue — see Beyond the catalogue. Use the hosted site, run your own, or build on top.
Aggregating 3.3M+ unique live postings from 470,000+ companies across 124 ATS platforms , a long tail of aggregators and direct feeds, and 97 Telegram channels — 320 sources in all, see Sources for the full breakdown. Reposts of one job across boards are collapsed, so every figure here is what freehire.me/jobs actually shows.
If freehire saves you time — or you just like the idea of jobs straight from the source — a ⭐ helps other people find it.
Finding the posting is half the problem. The other half — writing the CV, sending it, and knowing what happened to it — is built on the same data, in the same repository, under the same licence.
|
---|---
Find | Faceted search, curated collections, saved searches with email/Telegram digests, shared boards, market analytics, the ghost-job signal
Apply | CV builder with ATS-safe PDF templates, deterministic CV↔vacancy scoring, AI fit analysis, CV tailoring that invents nothing, tracer links, referrals
Track | An application board with stages, a mail inbox that links recruiter replies to the application they answer, an append-only event ledger, reminders
Ask | An in-process agent with five presets — chat, browse, profile, CV tailoring, interview rehearsal — with no shell and no minted credential
Build on | A keyless public API, a CLI, an MCP server for Claude Desktop and Claude Code, a form-filling browser extension, ChatGPT Actions
Full feature reference →docs/features.md — what each one does, where it lives in the tree, which need an LLM endpoint configured, and which draw on AI credits.
-
Go + Fiber v2 — HTTP server
-
PostgreSQL + pgvector — storage, filtering, semantic embeddings
-
sqlc — type-safe DB access from SQL (no ORM)
-
Meilisearch — full-text and faceted job search
-
langchaingo — LLM access over any OpenAI-compatible endpoint (no vendor baked in)
-
Bifrost — LLM gateway: per-user virtual keys, cross-provider fallback, spend tracking
-
Langfuse — LLM call tracing and observability
-
SvelteKit 2 (Svelte 5 runes) + Tailwind 4 — the server-rendered frontend under
web/ -
Redis — rate limiting and realtime fan-out · S3-compatible object storage — CVs, headshots, previews
-
Prometheus (via the node_exporter textfile collector) + Grafana — metrics and dashboards for the ingest/LLM infrastructure
-
Docker Compose — local development
make up # build + start the whole stack in Docker: # api, web, postgres, meilisearch, redis, s3 curl localhost:8080/health curl localhost:8080/api/v1/jobs
Migrations are applied automatically on first Postgres volume init (the migrations/ folder is mounted into /docker-entrypoint-initdb.d). Changing a migration does not re-apply to an existing volume — recreate it with docker compose down -v && make up, or apply pending files manually with make migrate.
If port 8080 is already taken, pick another host port:
HIRE_HOST_PORT=8090 make up
docker compose up -d db # database only
make run # server on host, reads DATABASE_URL
Copy .env.example to .env and adjust as needed. JWT_SECRET is required for the server to start; OAuth and LLM credentials are optional (the features they gate stay disabled when unset).
make help # list all commands
make sqlc # regenerate code from SQL (via Docker, no local sqlc needed)
make tidy # go mod tidy
make psql # psql inside the DB container
make reindex # rebuild the Meilisearch index from Postgres
make migrate # apply migrations manually to an existing DB volume
The server only serves the API. Everything else — crawling, enrichment, indexing, notifications — is a standalone, run-once worker meant for cron: it crawls or drains its queue and exits. ls cmd/ for the full list; the ones you are most likely to run:
go run ./cmd/migrate # apply pending migrations (run before deploying code that reads new schema)
go run ./cmd/ingest greenhouse # crawl one provider's catalog boards and upsert jobs (also via INGEST_PROVIDER)
go run ./cmd/enrich # drain the enrichment queue (LLM); needs LLM_* config
go run ./cmd/embed # drain the semantic queue into pgvector chunks
go run ./cmd/search-drain # push queued job writes into the live search index (run every 1-2 min)
go run ./cmd/reindex # rebuild the Meilisearch index from Postgres (full swap)
go run ./cmd/tg-ingest # crawl the active channels in telegram_channels
go run ./cmd/tg-extract # LLM-extract vacancies from crawled Telegram posts
go run ./cmd/capture-apply-form # fetch queued postings' ATS application forms
go run ./cmd/backfill-derive # re-derive every deterministic column — facets, fingerprints,
# slugs — in one keyset pass (follow with make reindex)
Every worker needs DATABASE_URL and exits non-zero on failure. No worker hard-deletes jobs; the lifecycle only soft-closes them.
cmd/ entry points: server + the standalone workers above
migrations/ SQL schema (source for both sqlc and initdb)
web/ the SvelteKit frontend
extension/ the Chrome side-panel extension
design-system/ shared tokens and components, linked into web/ and extension/
internal/ ~130 domain packages; the load-bearing ones:
config/ env configuration
database/ db/ pgxpool pool; generated sqlc code + queries/*.sql
handler/ HTTP handlers
auth/ auth primitives (JWT cookie, API keys) + OAuth sign-in
sources/ source adapters (greenhouse / lever / adzuna / …) + registry
boardcatalog/ the board catalog: which company crawls on which ATS, under what board id
pipeline/ ingest runner (fetch → normalize → dedup → upsert)
linksource/ resolves outbound job links found in Telegram posts
telegram/ Telegram-channel crawl + LLM vacancy extraction
enrich/ typed AI-enrichment contract + queue-draining runner
search/ searchdrain/ Meilisearch indexing and query; incremental drain of the write queue
embed/ semantic chunk embeddings into pgvector
location/ classify/ skilltag/ the curated facet dictionaries — never guess, emit nothing
ghost/ the posting-reality signal behind "is this job real?"
jobview/ the single public wire shape of a job
cv/ cvedit/ structured CVs + PDF rendering; cvedit is their only writer
experience/ durable employments + evidence atoms behind every CV claim
cvmatch/ matchanalysis/ deterministic CV↔vacancy score; the LLM fit analysis on top
applyform/ captured ATS application forms, in the platform's own vocabulary
userjob/ appevent/ per-user tracking (view / apply / save / stages) + the event ledger
inbox/ recruiter mail → classify → link to an application
assistant/ the in-process agent: turn loop, tools, transcripts
browsertools/ relays tool frames between the agent and the browser extension
referral/ collections/ employee referrals; curated company tags
llm/ llmkey/ provider-agnostic LLM client + per-user spend attribution
How the pieces fit together — the crawl-to-search topology, what each directory above is for, and walkthroughs of the three main flows (finding a job, tailoring a CV, the in-app assistant), plus the auth model, notifications and the job lifecycle: docs/architecture.md.
It is the map; the per-package AGENTS.md files it links to are the territory.
The catalogue is served over a public, keyless HTTP API — GET https://freehire.me/api/v1/jobs needs no credential. All responses use {"data": ...} (single), {"data": ..., "meta": {...}} (lists), or {"error": msg}; jobs and companies are addressed by their public slug.
Full reference — every endpoint, its parameters, auth mode and the whole search-filter vocabulary:freehire.me/docs/api.
Snapshot of 2026-10-20 — 3,371,563 unique open postings across 477,323 companies , from 320 sources ; 304 of them carry a posting today. Counts are unique open postings: a job reposted on several boards is counted once (the per-kind sums below run slightly higher, since a posting two sources carry is counted under each). Every source is one of three kinds:
- ATS platforms — one adapter per multi-tenant applicant-tracking system, each serving many companies (Workday, Greenhouse, Lever, iCIMS…). 117 platforms with postings · 2,936,676 open postings.
- Aggregators & job boards — third-party feeds that republish many companies' postings (Adzuna, trudvsem, himalayas, 97 Telegram channels …). 133 with postings · 444,654 open postings.
- Company career sites — direct single-company feeds crawled from a company's own careers page (Amazon, Apple, Google, Yandex, Sber…). 52 feeds with postings · 23,293 open postings.
A source's kind is not configuration but a property of the adapter's own Go type, so internal/ingest/sources classifies every provider without a network call.
Full per-source breakdown — every source with its own open-jobs count — lives on its own page: docs/sources.md, and always current at freehire.me/sources.
Adding a company is one row in the boards catalog — company + provider + board — added through the "contribute a board" form on the site, or by a curator with go run ./cmd/add-board --provider=… --board=… --company=… --apply. Adding an ATS platform is a new adapter in internal/ingest/sources plus one line in sources.All — every adapter speaks the same Source interface, and a board is validated against the registry when it enters the catalog, before any crawl.
For most companies the platform is already supported, so adding them is just one catalog row. Only when a company runs on an ATS we don't cover yet does it need a new provider (a new adapter). Either way, if you want a source added, start byopening an issue — name the company and its careers URL, and we'll confirm whether it's a one-line add or a new provider before any code.
A server-rendered SvelteKit 2 app (Svelte 5 runes, Tailwind 4, adapter-node) lives under web/ and consumes the API same-origin; a dev Vite proxy forwards /api to the backend. Shared tokens and components come from the sibling design-system/ package — install it before building web/ or extension/, since it is symlinked, not copied. See web/AGENTS.md.
A Chrome extension puts the job-application agent in a side panel next to whatever posting you're on: it reads the page when you ask it something, shows a deterministic skill-coverage match against your freehire profile, and can fill the application form for you. Source lives under extension/ (extension/AGENTS.md).
Install it from the Chrome Web Store →
Contributions are welcome, and issues and PRs are open to everyone. No allowlist, no approval step — open one.
The easiest way to help is to add a source : submit a board through the "contribute a board" form on the site, or send a new adapter in internal/ingest/sources. Missing a company you would apply to? Contributing its board takes a URL, and it is the single most useful thing you can send.
Questions and half-formed ideas are equally welcome in Discussions — no need to polish them into an issue first. For anything large, an issue up front saves you from building the wrong thing, but nothing stops you from just opening the PR.
See CONTRIBUTING.md for the checks CI runs and AGENTS.md for the architecture and conventions.
Found a vulnerability? Report it privately — see SECURITY.md. Do not open a public issue for security-sensitive reports.