跳到正文
cccskills
免费在 GitHub 公开中文介绍

freehire-search

通过freehire.me搜索多个国家的软件、数据及工程职位,按国家、城市、远程办公、经验、技能和发布时间筛选,直接在搜索结果中查看完整招聘内容。

原文查看原文说明

Use this skill to search live software / tech / data / engineering job listings across many countries and markets (and remote) via the freehire.me aggregator's public API, or to look up a specific posting. It aggregates roles from ~50 ATS platforms into one schema, so a single skill covers many markets — but its faceted filtering (skills, category, seniority) is tuned tech-first, so scope triggers to technical roles. Trigger phrases: find a tech job, software job search, developer jobs, engineering vacancies, data/ML jobs, DevOps roles, remote developer jobs, "are there any <tech role> jobs in <place>", look up this freehire job posting.

集成工具LinkedIn

实测评分 未实测

查看安装方法

适用场景

  • 查找欧盟的远程React职位
  • 查找德国新发布的DevOps职位
  • 一次搜索Go或Rust相关职位
  • 查看他人分享的freehire职位详情

中文介绍

功能

搜索freehire.me汇集的多国软件、数据及工程类职位。可按国家、城市、是否支持远程办公、经验等级、职位类别、技能和发布时间筛选。JSON搜索结果包含完整招聘内容,无需逐条重新获取详情即可查看条件。使用OR可合并搜索多个选项,使用title:可将搜索范围限定为职位标题。

适用场景

适合寻找海外技术职位或远程工作,也适合将多种技术栈作为候选条件比较职位。对于他人分享的职位,以及已经结束招聘、不再出现在搜索结果中的职位,也能通过标识符或freehire网址查看详情。

使用示例

  • “请查找欧盟支持远程办公的React职位。”
  • “请列出德国过去十四天发布的DevOps职位。”
  • “请一次搜索使用Go或Rust的工作。”

注意事项

运行需要bun,无需认证或API密钥。筛选功能以技术职位为主,不适合广泛搜索非技术职位。外部服务没有正式的可用性保证。地区信息尚未确定的职位,可能在按地区筛选时被排除。

本介绍由 AI(OpenAI Codex)根据公开的 SKILL.md 撰写。准确的规格请查看下方原文。

文档检查

AI 根据 SKILL.md 的内容检查了需要注意的操作和使用前提。评分只依据实际运行的结果(实测对比)。

安全性发送数据、删除文件、执行命令等是否有说明
A良好资料明确说明读取公开接口无需认证,并解释了外部服务依赖及故障时的行为。
安装难易度所需工具和 API 密钥是否少且有说明
B部分不足资料说明只需bun且无需认证,但没有提供bun的安装步骤。

不计入评分。 由 AI(OpenAI Codex)于 2026年10月24日 评估。仅供参考,安装前请同时查看原文。

如果您认为评估有误,请申请复核

请写明哪一项有误以及原因。无需登录。我们会对照 SKILL.md 重新评估,并在此处更新结果。

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

包含的文件(19)

  • SKILL.md13.3 KB
  • cli/package.json612 B
  • cli/README.md4.4 KB
  • cli/src/cli.ts13.2 KB
  • cli/src/commands/detail.ts2.3 KB
  • cli/src/commands/search.ts8.1 KB
  • cli/src/helpers.ts12.0 KB
  • cli/tests/cli-flag-validation.test.ts8.4 KB
  • cli/tests/commands.test.ts9.2 KB
  • cli/tests/detail-flags.test.ts2.6 KB
  • cli/tests/helpers.ts1.0 KB
  • cli/tests/parsing.test.ts7.8 KB
  • cli/tests/region-value-warning.test.ts6.0 KB
  • cli/tests/remote-mode.test.ts3.3 KB
  • cli/tests/request-timeout.test.ts957 B
  • cli/tests/required-search-values.test.ts3.1 KB
  • cli/tests/retry-backoff.test.ts5.2 KB
  • cli/tsconfig.json305 B
  • url-reference.md7.2 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

freehire Search Skill

Search live job listings from the freehire.me job aggregator — an open-source IT job board that normalizes postings from ~50 ATS platforms across many countries into one schema. No authentication, no API key, and zero runtime dependencies — it runs with just bun. The market is chosen per query via facet flags (--region, --country), so the same skill works for a forker in any market out of the box.

This is a country-agnostic worked example of the repo's job-portal-skill pattern, like linkedin-search. Unlike the HTML-scraping portals, it queries freehire's public JSON API, so results are structured (skills, seniority, region facets) rather than parsed from markup.

⚠️ Scope: tech-focused

freehire's corpus already includes some non-tech postings (it crawls whole company career pages), but its faceted filtering — skills, categories, and seniority dictionaries — is tuned tech-first today, so this skill scopes its triggers to software / data / engineering / tech roles, where the filtering is strong. Non-tech coverage exists but is still maturing; don't rely on this skill for general (non-technical) job coverage yet.

ℹ️ Hosted-service dependency (best-effort, no SLA)

This skill depends on a third-party hosted service, freehire.me. Reads are public and unauthenticated — the same zero-signup bar as linkedin-search.

freehire.me is a personal project but actively maintained; it runs on a best-effort basis (no formal SLA). If the API is unreachable, the CLI fails gracefully — a non-zero exit with a clear error message — so an outage degrades this source rather than breaking the surrounding workflow.

Self-hosting / swappable base URL. The freehire backend is a separate MIT-licensed repo — strelov1/freehire (Go + PostgreSQL + Meilisearch) — that stands up with one command via Docker Compose (make up → API on :8080, same /api/v1/... paths). The skill honors a base-URL env var, FREEHIRE_API_URL (default https://freehire.me), so pointing it at a local instance is a one-line change:

FREEHIRE_API_URL=http://localhost:8080 bun run .agents/skills/freehire-search/cli/src/cli.ts search -q "go"

Caveat: standing up the API is light, but keeping a full, continuously-fresh mirror (millions of postings across ~50 platforms) is resource-heavy — a self-hoster would either crawl a scoped subset of sources or point the env var back at the hosted API.

When to use this skill

  • Search for tech job openings by keyword, in a given region/country or remotely — each result comes back with its full description, no per-hit follow-up needed
  • Filter by seniority, category, skills, or recency (posted within N days)
  • Look one freehire posting up by its slug (including a closed one)

Commands

Search job listings

bun run .agents/skills/freehire-search/cli/src/cli.ts search [-q "<keywords>"] [facet flags]

Key flags:

  • --query <text> / -q <text> — keyword search (title, skill, role). Full-text; optional. Supports OR and title: (see "Query operators" below).
  • --jobage <days> — posted within N days (maps to posted_within_days).
  • --page <n> — 1-indexed page. Default 1.
  • --limit <n> / -n <n> — results per page (API limit). Default 25.
  • --format json|table|plain — default json.
  • --description-format markdown|text|html — how each result's full description is rendered. Default markdown, which keeps the posting's headings and requirement lists intact. json output only.

Query operators. -q understands two operators; the CLI passes the text through unchanged and the API parses it:

  • OR between alternatives returns jobs matching any of them, e.g. -q "golang OR rust". Uppercase only: a lowercase or is an ordinary search word. Plain space-separated words are not a union (-q "golang rust" returns fewer jobs than -q golang alone), so use OR for synonyms and alternative stacks instead of running one search per keyword. At most 5 alternatives; a 6th is rejected with an error. An OR inside double quotes is literal text.
  • A leading title: restricts that alternative to the job title, e.g. -q "title:staff engineer" skips postings that merely mention the words in their description. It applies per alternative, so repeat it on each one: -q "title:staff engineer OR title:principal engineer". It only counts at the start of an alternative; title: in the middle is searched as text. Quotes work inside it: -q 'title:"staff engineer"' matches the phrase.

Facet flags, --jobage, --page and --limit apply to the combined result: every alternative is filtered the same way, and a job matching several alternatives appears once.

Search results already carry the full description. This skill queries freehire's agent search endpoint, which replaces the index's truncated preview with each posting's complete text, so a search of 20 roles is 1 request rather than 1 + 20. Do not loop detail over search hits to read their descriptions — reach for detail only to look one posting up by slug (e.g. from the tracker, or a posting already closed and therefore absent from search). Full descriptions are verbose: keep --limit modest, and pre-filter on title/company before reading bodies - or pass --no-description for a cheap discovery pass that keeps every other field and drops the bodies entirely (fetch a shortlisted job's body with detail, or re-run the search without the flag).

Facet filters (values come from freehire's controlled vocabularies; comma-separate for OR within a facet):

  • --region <codes> - macro-region: global, eu, uk, north_america, latam, apac, mena, africa, cis. --region eu,uk. eu does not include the UK; add uk for Europe as a whole. For a single country use --country instead - us is a country code, not a region, and --region us matches nothing. --region, --country and --city form one OR-group, so --country us alone scopes to the US. Use none to match jobs whose region could not be resolved (see "Partial data" below).
  • --country <codes> — ISO-3166 alpha-2, e.g. --country DE,GB
  • --city <names> — city name(s), e.g. --city Berlin
  • --seniority <levels> — junior, middle, senior, staff, principal, lead, …
  • --category <cats> — backend, frontend, fullstack, devops, ml_ai, qa, …
  • --skill <names> — canonical skill(s), e.g. --skill go,kubernetes
  • --company <slug> — company slug (from a result's company_slug)
  • --remote <mode> — remote | hybrid | onsite (work_mode facet). A bare --remote means remote. Comma-separate for OR (remote,hybrid; on-site normalises to onsite). An unknown item exits 1 with BAD_ARG.
  • --facet <key=value> — any other facet param (repeatable), e.g. --facet salary_min=100000

Location is a facet, not free text. Unlike linkedin-search's --location, freehire filters geography through the structured --region/--country/--city facets. Discover the live values for a market at /api/v1/jobs/facets (append ?q=<role> to scope it) — never invent facet values.

Fetch full job detail

bun run .agents/skills/freehire-search/cli/src/cli.ts detail <slug|url> [--format json|plain]

slug is the id from a search result (e.g. golang-zensar-2bxu6dxm). You may also pass a full https://freehire.me/jobs/<slug> URL. A URL on any other host - including the employer apply link a search result's url field carries - is rejected with BAD_ID before any request. Returns the full (HTML-stripped) description, skills, region/country, and — when the posting is enriched — seniority, category, employment type, and salary. salary keeps its period when freehire records one (INR 300000–300000/year, INR 12000/month); compare pay only in one period.

Use it for a posting you already have a slug for — a tracked application, a shared link, or a closed posting search no longer lists. Re-fetching a hit that search just returned only re-reads a description you already have.

Usage examples

# Senior backend roles, table view
bun run .agents/skills/freehire-search/cli/src/cli.ts search -q "backend engineer" --seniority senior --limit 10 --format table

# Go or Rust roles, one search (OR must be uppercase)
bun run .agents/skills/freehire-search/cli/src/cli.ts search -q "golang OR rust" --remote remote --format table

# Staff or principal titles only, not postings that mention them in passing
bun run .agents/skills/freehire-search/cli/src/cli.ts search -q "title:staff engineer OR title:principal engineer" --format table

# Remote React roles in the EU
bun run .agents/skills/freehire-search/cli/src/cli.ts search -q "react" --remote remote --region eu --format table

# DevOps roles in Germany posted in the last 14 days
bun run .agents/skills/freehire-search/cli/src/cli.ts search --category devops --country DE --jobage 14 --format table

# ML/AI roles anywhere, fully remote
bun run .agents/skills/freehire-search/cli/src/cli.ts search -q "machine learning" --category ml_ai --remote remote --format table

# Descriptions as plain text instead of Markdown
bun run .agents/skills/freehire-search/cli/src/cli.ts search -q "platform engineer" --limit 5 --description-format text

# Full details for a specific job
bun run .agents/skills/freehire-search/cli/src/cli.ts detail golang-zensar-2bxu6dxm --format plain

Output formats

FormatBest for
jsonDefault — programmatic use; the only format carrying each hit's description
tableQuick human-readable scanning
plainReading a single job's full detail (detail command)

Search JSON is { "meta": { "count", "page", "total" }, "results": [...] }; each result carries at least id (the freehire slug), title, company, location, date, url, and description (missing values are null). table and plain omit the description — it would swamp a scannable list. All errors are written to stderr as { "error": "...", "code": "..." } and the process exits with code 1.

One diagnostic is not an error: a --region (or --facet regions=) value outside the documented vocabulary - us is a country code, not a region - prints { "warning": "...", "code": "REGION_VALUE_UNKNOWN" } on stderr after the results, and the process still exits 0 with stdout a valid JSON document.

Partial data

Facets are derived per-posting and can be incomplete — geography especially. A job may resolve its work_mode (e.g. remote) but leave its region or country undetermined when the source's location text is ambiguous (freehire's dictionaries never guess). So:

  • A missing region/country means "not resolved", not "not applicable" — filtering on --region eu silently drops jobs whose region wasn't resolved, even if they are in fact EU. Widen or drop the facet if you need those back.
  • There is a dedicated facet value for the unresolved bucket: --region none matches jobs with no resolved region — useful to sweep up remote roles that never pinned a geography. It ORs with real regions, e.g. --region eu,none.
  • result.regions / countries / cities may be empty arrays for the same reason; treat empty as unknown, not as "none of the above".

Notes

  • Data is from freehire.me's public API — no credentials required. Only per-user tracking (apply/save) needs a key, and this skill deliberately does not touch it: it is search + detail only.
  • id in search results is the freehire public_slug — pass it as-is to detail.
  • date is the posting date as YYYY-MM-DD (the date part of the API's posted_at timestamp, the shape every portal CLI emits); it may be null for undated postings.
  • Facet values are controlled vocabularies. Use /api/v1/jobs/facets to see the live values (with counts) for a query before filtering.
  • The API retries 429/5xx with exponential backoff; an unreachable API exits non-zero with a clear message (best-effort service, see the dependency note above).
  • search calls /api/v1/agent/jobs/search (public, like the rest); --no-description calls the lighter /api/v1/jobs/search, which serves no full bodies. A self-hosted instance older than that endpoint answers 404, and the CLI reports it as an error naming the endpoint — never as an empty result set.

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

对照招聘要求与个人经历,评估岗位匹配度,调研企业并定制CV和求职信。还可准备面试回答及提问,保存申请记录和招聘原文。

  • 评估岗位与个人经历的匹配度
  • 为不同雇主定制CV和求职信
  • 准备面试回答和向企业提出的问题
ai-job-search-dev/ai-job-search6.5万2026年10月21日 更新

jobbank-search

免费有简介

搜索丹麦面向大学毕业生和专业人才的岗位,按地区、行业、专业及工作方式筛选,查找毕业生培训、博士和博士后机会,并查看详情及申请截止日期。

  • 查找面向应届毕业生的培训岗位
  • 查找博士和博士后招聘
  • 查找完全远程的软件岗位
ai-job-search-dev/ai-job-search6.5万2026年10月21日 更新

jobdanmark-search

免费有简介

按职位、地区和用工类型筛选丹麦招聘信息,从Jobdanmark.dk的公开数据中查找合适岗位,查看工作内容、申请截止日期及各类别的招聘数量。

  • 查找哥本哈根的IT岗位
  • 查找Aarhus的学生岗位
  • 查看岗位内容和申请截止日期
ai-job-search-dev/ai-job-search6.5万2026年10月21日 更新

jobindex-search

免费有简介

在Jobindex.dk上按职位、技能、公司或城市搜索丹麦招聘信息,按发布时间筛选,并查看完整职位说明、申请截止日期、用工类型、工作时间和申请链接。

  • 查找过去七天发布的Python职位
  • 查找哥本哈根的数据工程师职位
  • 比较平面设计师招聘信息
ai-job-search-dev/ai-job-search6.5万2026年10月21日 更新

jobnet-search

免费有简介

在丹麦官方招聘网站Jobnet.dk按职位、地区、工时和雇佣期限查找岗位,查看完整招聘内容、申请截止日期、联系人及申请链接,也可按邮编搜索附近职位。

  • 查找全职且无固定期限的护士岗位
  • 查找通勤范围内的信息技术岗位
  • 查看即将截止申请的职位
ai-job-search-dev/ai-job-search6.5万2026年10月21日 更新

linkedin-search

免费有简介

按国家、城市和职位搜索LinkedIn公开招聘信息,按发布时间或办公方式筛选,并通过职位编号或网址获取完整职位说明、职级、用工类型等详情。

  • 查找目标国家或城市的职位
  • 寻找远程或混合办公职位
  • 查看刚发布的招聘信息
ai-job-search-dev/ai-job-search6.5万2026年10月21日 更新

查看 ai-job-search-dev 的全部技能

报告此技能的问题