채용 공고와 경력의 적합도를 평가하고 기업을 조사해 지원처에 맞는 CV와 커버레터를 작성합니다. 면접 답변과 질문을 준비하고 지원 기록과 공고 원문도 저장합니다.
- 채용 공고와 경력의 적합도 평가
- 지원처별 CV와 커버레터 작성
- 면접 답변과 기업에 물을 질문 준비
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.
실행 점수 미검증
설치 방법 보기freehire.me에 모인 여러 국가의 소프트웨어, 데이터, 엔지니어링 공고를 검색합니다. 국가, 도시, 원격 근무 여부, 경력 수준, 직종 범주, 기술, 게시 시기로 범위를 좁힙니다. JSON 검색 결과에 모집 내용 전문이 포함되어 공고마다 상세 내용을 다시 가져오지 않고 조건을 확인합니다. OR로 여러 후보를 함께 검색하거나 title:로 공고 제목만 검색합니다.
해외 기술직이나 원격 공고를 찾거나 여러 기술 스택을 후보로 일자리를 비교할 때 유용합니다. 공유받은 공고와 검색에서 사라진 모집 종료 공고도 식별자나 freehire URL로 상세 내용을 확인합니다.
실행에는 bun이 필요하며 인증이나 API 키는 필요하지 않습니다. 기술직 중심의 필터이므로 비기술직을 폭넓게 찾는 용도에는 적합하지 않습니다. 외부 서비스에는 공식적인 가동 보장이 없습니다. 지역 정보가 확인되지 않은 공고는 지역 필터를 적용하면 결과에서 제외될 수 있습니다.
이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.
AI가 SKILL.md의 내용에서 주의가 필요한 작업과 도입 전제를 확인했습니다. 점수는 실제로 실행한 결과(실행 검증)만으로 매깁니다.
점수에는 넣지 않았습니다. 2026년 10월 24일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
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.
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.
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.
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.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=100000Location is a facet, not free text. Unlike
linkedin-search's--location, freehire filters geography through the structured--region/--country/--cityfacets. Discover the live values for a market at/api/v1/jobs/facets(append?q=<role>to scope it) — never invent facet values.
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.
# 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
| Format | Best for |
|---|---|
json | Default — programmatic use; the only format carrying each hit's description |
table | Quick human-readable scanning |
plain | Reading 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.
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:
--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.--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".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./api/v1/jobs/facets to see the
live values (with counts) for a query before filtering.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.아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
채용 공고와 경력의 적합도를 평가하고 기업을 조사해 지원처에 맞는 CV와 커버레터를 작성합니다. 면접 답변과 질문을 준비하고 지원 기록과 공고 원문도 저장합니다.
덴마크의 대졸자와 전문 인력 대상 채용을 지역, 업종, 전공, 근무 형태로 검색합니다. 신입 연수, 박사 과정, 박사후연구원 모집의 상세 내용과 지원 마감일을 확인합니다.
Jobdanmark.dk의 공개 데이터에서 덴마크 채용 공고를 직종, 지역, 고용 형태로 검색합니다. 업무 내용과 지원 마감일을 확인하고 직종별 공고 수를 비교합니다.
Jobindex.dk에서 직종, 기술, 기업명, 도시명으로 덴마크 채용 공고를 검색합니다. 게시 시기로 범위를 좁히고 모집 내용, 지원 기한과 지원 링크를 확인합니다.
덴마크 공식 채용 사이트 Jobnet.dk에서 직종, 지역, 근무 시간으로 일자리를 찾습니다. 모집 내용과 지원 마감일, 연락처, 지원 링크까지 확인합니다.
LinkedIn 공개 채용 공고를 국가, 도시, 직종으로 검색하고 게시 시기나 근무 방식으로 좁힙니다. 공고 ID나 URL로 모집 요강 전문과 고용 형태도 확인합니다.