Interview Prep
reactive-resume/reactive-resume
Prepares the user for a specific interview from their real experience.
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.
$ npx skills add MadsLorentzen/ai-job-search --skill freehire-search -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install MadsLorentzen/ai-job-search freehire-search --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "freehire-search" agent skill from https://github.com/MadsLorentzen/ai-job-search/tree/master/.agents/skills/freehire-search into .claude/skills/freehire-search/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "freehire-search", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/MadsLorentzen/ai-job-search/tree/master/.agents/skills/freehire-searchType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add MadsLorentzen/ai-job-search --skill freehire-search -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install MadsLorentzen/ai-job-search freehire-search --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/MadsLorentzen/ai-job-search.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/freehire-search .agents/skills/freehire-search && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "freehire-search" agent skill from https://github.com/MadsLorentzen/ai-job-search/tree/master/.agents/skills/freehire-search into .agents/skills/freehire-search/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "freehire-search", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add MadsLorentzen/ai-job-search --skill freehire-search -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install MadsLorentzen/ai-job-search freehire-search --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/MadsLorentzen/ai-job-search.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/freehire-search .cursor/skills/freehire-search && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "freehire-search" agent skill from https://github.com/MadsLorentzen/ai-job-search/tree/master/.agents/skills/freehire-search into .cursor/skills/freehire-search/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "freehire-search", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/MadsLorentzen/ai-job-search.git --path .agents/skills/freehire-search--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add MadsLorentzen/ai-job-search --skill freehire-search -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install MadsLorentzen/ai-job-search freehire-search --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/MadsLorentzen/ai-job-search.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/freehire-search .gemini/skills/freehire-search && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "freehire-search" agent skill from https://github.com/MadsLorentzen/ai-job-search/tree/master/.agents/skills/freehire-search into .gemini/skills/freehire-search/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "freehire-search", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install MadsLorentzen/ai-job-search freehire-searchInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add MadsLorentzen/ai-job-search --skill freehire-search -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/MadsLorentzen/ai-job-search.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/freehire-search .github/skills/freehire-search && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "freehire-search" agent skill from https://github.com/MadsLorentzen/ai-job-search/tree/master/.agents/skills/freehire-search into .github/skills/freehire-search/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "freehire-search", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add MadsLorentzen/ai-job-search --skill freehire-search -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install MadsLorentzen/ai-job-search freehire-search --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/MadsLorentzen/ai-job-search.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/freehire-search .opencode/skills/freehire-search && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "freehire-search" agent skill from https://github.com/MadsLorentzen/ai-job-search/tree/master/.agents/skills/freehire-search into .opencode/skills/freehire-search/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "freehire-search", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
freehire-searchSearches live software, data and engineering job listings through the freehire.me public API, or fetches one posting, with filters for country, region and skills.
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.
Read from SKILL.md and the folder at commit a011214. It shows what the files ask for, not the result of running them.
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.
Ships script files (TypeScript), which the agent can run.
Shell commands in SKILL.md call:
bunmakeFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
freehire.meAlso links to:
github.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
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.
The full file from MadsLorentzen/ai-job-search at commit a011214, republished under its MIT licence (© MadsLorentzen). 1,168 words, ~2,687 tokens.
.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.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.--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=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. 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
# 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.
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 (posted_at); 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). 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
SKILL.md and 14 other files in .agents/skills/freehire-search of MadsLorentzen/ai-job-search.
Open the folder on GitHubat commit a011214
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| freehire Tech Job Search this skillMadsLorentzen/ai-job-search | 45k | — | ~2.7k | Automated safety check: Pass | MIT | |
| Interview Prepreactive-resume/reactive-resume | 44k | — | ~10k | Automated safety check: Pass | MIT | |
| Offer Negotiationreactive-resume/reactive-resume | 44k | — | ~10k | Automated safety check: Pass | MIT | |
| Backend and Agent Project Selectorlishuangqiang/backend-agent-resume-scout | 350 | — | ~1.4k | Automated safety check: Pass | Apache-2.0 | |
| Applyextrasmall0/dear-hiring-manager | 111 | — | ~2.6k | Automated safety check: Pass | MIT | |
| Job Huntrebecha1227-a11y/CareerForge | 323 | — | ~2k | Automated safety check: Warn | None |
reactive-resume/reactive-resume
Prepares the user for a specific interview from their real experience.
reactive-resume/reactive-resume
Evaluates and negotiates job offers. An agent skill from reactive-resume/reactive-resume.
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.
extrasmall0/dear-hiring-manager
Assisted job-application filler. An agent skill from extrasmall0/dear-hiring-manager.
rebecha1227-a11y/CareerForge
AI 岗位猎手。基于用户简历,自动在各大招聘平台搜索匹配岗位,输出带匹配度评估的岗位列表. An agent skill from rebecha1227-a11y/CareerForge.
thesun4sky/jobstack
채용정보 탐색 스킬. An agent skill from thesun4sky/jobstack.
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.
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.
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.
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.
Categories
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.
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.
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.
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.
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.
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 *).
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.
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.
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.
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.
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.
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.