Agent skill

freehire Tech Job Search

by MadsLorentzen in MadsLorentzen/ai-job-search

Searches live software, data and engineering job listings through the freehire.me public API, or fetches one posting, with filters for country, region and skills.

MITAuto-check passedBusiness, Finance & HR

Install freehire Tech Job Search

skills CLI
$ npx skills add MadsLorentzen/ai-job-search --skill freehire-search -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install MadsLorentzen/ai-job-search freehire-search --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/MadsLorentzen/ai-job-search.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/freehire-search .claude/skills/freehire-search && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
freehire-search
GitHub stars
45k
Token cost
~2.7k tokens
SKILL.md length
1,168 words
Files
15
Skills in repo
5
Repo updated
First seen
Licence
MIT

At a glance

Searches live software, data and engineering job listings through the freehire.me public API, or fetches one posting, with filters for country, region and skills.

  • Looking for remote developer or DevOps roles
  • SKILL.md covers ⚠️ Scope: tech-focused, ℹ️ Hosted-service dependency…, When to use this skill and Commands, plus 4 more sections
  • Runs TypeScript scripts from its folder; calls bun and make; reaches freehire.me
  • Checking data or machine-learning job openings in a given country

What it does

The freehire.me job aggregator normalizes postings from roughly 50 applicant tracking platforms into one schema, and this skill queries it. A small command line tool in the skill folder, run with Bun, offers search and detail commands, and the market is chosen per query with flags such as --region and --country. No account or API key is needed, and results are structured, with skills, seniority and region facets.

Scope is deliberately tech-first: freehire's filtering dictionaries for skills, categories and seniority are strongest for software, data and engineering roles, so the skill should not be relied on for general non-technical job coverage. The service is a personal project run on a best-effort basis with no SLA, and the tool exits with a clear error when the API cannot be reached.

The base URL can be changed through the FREEHIRE_API_URL environment variable, which lets you point the tool at a self-hosted copy of the open-source backend running locally. Keeping a full, fresh mirror of all postings is described as resource-heavy.

When your agent uses it

  • Looking for remote developer or DevOps roles
  • Checking data or machine-learning job openings in a given country
  • Looking up the details of one freehire job posting

Example prompts

  • “Find senior backend engineer jobs in Germany that list Go as a skill.”
  • “Show remote DevOps engineer openings from freehire.”
  • “Pull the full details for the second job in those results.”

Requirements

  • Bun runtime
  • Network access to freehire.me
  • Pre-approved tools (allowed-tools): Bash(bun run .agents/skills/freehire-search/cli/src/cli.ts *)

What it can do on your machine

Read from SKILL.md and the folder at commit a011214. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Bash(bun run .agents/skills/freehire-search/cli/src/cli.ts *)

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships script files (TypeScript), which the agent can run.

    Shell commands in SKILL.md call:

    • bun
    • make

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • freehire.me

    Also links to:

    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

freehire Tech Job Search loads about 2.7k tokens when it runs. Until then it costs about 165 tokens; SKILL.md has 1,168 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~165
When it runs · the whole SKILL.md, loaded when a task matches
~2.7k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from MadsLorentzen/ai-job-search at commit a011214, republished under its MIT licence (© MadsLorentzen). 1,168 words, ~2,687 tokens.

Download SKILL.mdSave it as .claude/skills/freehire-search/SKILL.md (or your agent's skills folder). This skill also uses 14 other files; get the full folder from GitHub.
name
freehire-search
description
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.
allowed-tools
Bash(bun run .agents/skills/freehire-search/cli/src/cli.ts *)
version
1.0.0
context
fork
enabled
true

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:

bash
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
bash
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.
  • --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.

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, e.g. global, eu, us, apac, latam, cis. --region eu,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)
  • --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.

Show full SKILL.md (450 more words)Show less
Fetch full job detail
bash
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. 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

bash
# 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

# 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.

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 (posted_at); 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). 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.

© MadsLorentzen, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 14 other files in .agents/skills/freehire-search of MadsLorentzen/ai-job-search.

  • SKILL.md
  • cli/README.md
  • cli/package.json
  • cli/src/cli.ts
  • cli/src/commands/detail.ts
  • cli/src/commands/search.ts
  • cli/src/helpers.ts
  • cli/tests/cli-flag-validation.test.ts
  • cli/tests/commands.test.ts
  • cli/tests/helpers.ts
  • cli/tests/parsing.test.ts
  • cli/tests/request-timeout.test.ts
  • cli/tests/retry-backoff.test.ts
  • cli/tsconfig.json
  • url-reference.md

Open the folder on GitHubat commit a011214

Compare with similar skills

freehire Tech Job Search next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

freehire Tech Job Search compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
freehire Tech Job Search this skillMadsLorentzen/ai-job-search45k—~2.7kAutomated safety check: PassMIT
Interview Prepreactive-resume/reactive-resume44k—~10kAutomated safety check: PassMIT
Offer Negotiationreactive-resume/reactive-resume44k—~10kAutomated safety check: PassMIT
Backend and Agent Project Selectorlishuangqiang/backend-agent-resume-scout350—~1.4kAutomated safety check: PassApache-2.0
Applyextrasmall0/dear-hiring-manager111—~2.6kAutomated safety check: PassMIT
Job Huntrebecha1227-a11y/CareerForge323—~2kAutomated safety check: WarnNone

Similar skills

  • Interview Prep

    reactive-resume/reactive-resume

    Prepares the user for a specific interview from their real experience.

    44k GitHub stars~10k tokensUpdated yesterday
    Business, Finance & HRAuto-check passed
  • Offer Negotiation

    reactive-resume/reactive-resume

    Evaluates and negotiates job offers. An agent skill from reactive-resume/reactive-resume.

    44k GitHub stars~10k tokensUpdated yesterday
    Business, Finance & HRAuto-check passed
  • Backend and Agent Project Selector

    lishuangqiang/backend-agent-resume-scout

    Finds backend or AI agent projects on GitHub that are worth putting on a resume, checks them against local source and writes a Markdown resume package.

    350 GitHub stars~1.4k tokensUpdated 3 mo ago
    Business, Finance & HRAuto-check passed
  • Apply

    extrasmall0/dear-hiring-manager

    Assisted job-application filler. An agent skill from extrasmall0/dear-hiring-manager.

    111 GitHub stars~2.6k tokensUpdated 2 mo ago
    Business, Finance & HRAuto-check passed
  • Job Hunt

    rebecha1227-a11y/CareerForge

    AI 岗位猎手。基于用户简历,自动在各大招聘平台搜索匹配岗位,输出带匹配度评估的岗位列表. An agent skill from rebecha1227-a11y/CareerForge.

    323 GitHub stars~2k tokensUpdated 3 mo ago
    Business, Finance & HRAuto-check: warnings
  • Job Search

    thesun4sky/jobstack

    채용정보 탐색 스킬. An agent skill from thesun4sky/jobstack.

    156 GitHub stars~3.1k tokensUpdated 1 mo ago
    Business, Finance & HRAuto-check: notes

More from MadsLorentzen/ai-job-search

  • LinkedIn Job Search

    MadsLorentzen/ai-job-search

    Searches LinkedIn's public job listings for any location or remote work and fetches the full description of a posting, with no login or API key.

    45k GitHub stars~1.2k tokensUpdated 2 days ago
    Auto-check passed
  • Job Skill Gap Upskill Planner

    MadsLorentzen/ai-job-search

    Compares the jobs you track with your candidate profile to find skill gaps, then builds a gap heatmap and a prioritized learning plan with study resources.

    45k GitHub stars~3.8k tokensUpdated 2 days ago
    Auto-check passed
  • Job Posting Scraper

    MadsLorentzen/ai-job-search

    Finds new job postings that match your profile through installed portal-search CLIs, dedupes against past runs and your application tracker, and rates each one's fit.

    45k GitHub stars~5.7k tokensUpdated 2 days ago
    Auto-check passed
  • Job Application Assistant

    MadsLorentzen/ai-job-search

    Evaluates job postings against your profile, then tailors a LaTeX CV and cover letter and prepares interview answers for the roles you pursue.

    45k GitHub stars~1.2k tokensUpdated 2 days ago
    Auto-check: notes

Questions about freehire Tech Job Search

What does freehire Tech Job Search do?

Searches live software, data and engineering job listings through the freehire.me public API, or fetches one posting, with filters for country, region and skills. me job aggregator normalizes postings from roughly 50 applicant tracking platforms into one schema, and this skill queries it. A small command line tool in the skill folder, run with Bun, offers search and detail commands, and the market is chosen per query with flags such as --region and --country.

When should I use freehire Tech Job Search?

freehire Tech Job Search fits situations like: looking for remote developer or DevOps roles; checking data or machine-learning job openings in a given country; looking up the details of one freehire job posting.

How do I install freehire Tech Job Search in Claude Code?

Run `npx skills add MadsLorentzen/ai-job-search --skill freehire-search -a claude-code`. Or copy the skill folder (.agents/skills/freehire-search in MadsLorentzen/ai-job-search) into .claude/skills/freehire-search in your project. Claude Code loads it when a task matches its description.

How do I install freehire Tech Job Search in Codex?

Run `npx skills add MadsLorentzen/ai-job-search --skill freehire-search -a codex`. Or copy the skill folder (.agents/skills/freehire-search in MadsLorentzen/ai-job-search) into .agents/skills/freehire-search in your project. Codex loads it when a task matches its description.

Can I use freehire Tech Job Search in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add MadsLorentzen/ai-job-search --skill freehire-search -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/freehire-search, .gemini/skills/freehire-search, .github/skills/freehire-search and .opencode/skills/freehire-search in your project.

What does freehire Tech Job Search need to run?

Going by SKILL.md and its folder, freehire Tech Job Search needs TypeScript for the scripts in its folder and the command-line tools its instructions call (bun and make). Our summary lists: Bun runtime; Network access to freehire.me. Its frontmatter pre-approves these tools: Bash(bun run .agents/skills/freehire-search/cli/src/cli.ts *).

Does freehire Tech Job Search access the network?

SKILL.md names 2 domains. In commands or code: freehire.me; the agent is likely to contact it when it follows the instructions. As links in the text: github.com. This is read from the text; nothing was executed.

Is freehire Tech Job Search safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does freehire Tech Job Search use?

freehire Tech Job Search is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does freehire Tech Job Search use?

About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to freehire Tech Job Search?

Skills that share tags, products or a category with freehire Tech Job Search: Interview Prep (reactive-resume/reactive-resume, 44k stars), Offer Negotiation (reactive-resume/reactive-resume, 44k stars), Backend and Agent Project Selector (lishuangqiang/backend-agent-resume-scout, 350 stars) and Apply (extrasmall0/dear-hiring-manager, 111 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains freehire Tech Job Search?

MadsLorentzen (a GitHub user) maintains it in MadsLorentzen/ai-job-search, which has 45,410 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 8, 2026.

Source: MadsLorentzen/ai-job-search on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.