Best for
- Search for tech job openings by keyword, in a given region/country or remotely —
- Filter by seniority, category, skills, or recency (posted within N days)
- Look one freehire posting up by its slug (including a closed one)
MadsLorentzen/ai-job-search/.agents/skills/freehire-search/SKILL.md
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, engineer
Decision brief
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 ch…
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/MadsLorentzen/ai-job-search --skill ".agents/skills/freehire-search"Inspect the Agent Skill "freehire-search" from https://github.com/MadsLorentzen/ai-job-search/blob/a8a10011126f443e0041bb4924a1106c2f7f7536/.agents/skills/freehire-search/SKILL.md at commit a8a10011126f443e0041bb4924a1106c2f7f7536. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
Review the “Usage examples” section in the pinned source before continuing.
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 rol…
This skill depends on a third-party hosted service, freehire.me. Reads are public and unauthenticated — the same zero-signup bar as linkedin-search.
Search for tech job openings by keyword, in a given region/country or remotely —
Key flags: - --query / -q — keyword search (title, skill, role). Full-text; optional. - --jobage — posted within N days (maps to postedwithindays). - --page — 1-indexed page. Default 1. - --limit / -n — results per page (API limit). Default 25. - --format json|table|plain — defa…
Permission review
The documentation includes network, browsing, or remote request actions.
FREEHIRE_API_URL=http://localhost:8080 bun run .agents/skills/freehire-search/cli/src/cli.ts search -q "go"The documentation asks the agent to run terminal commands or scripts.
FREEHIRE_API_URL=http://localhost:8080 bun run .agents/skills/freehire-search/cli/src/cli.ts search -q "go"The documentation asks the agent to run terminal commands or scripts.
bun run .agents/skills/freehire-search/cli/src/cli.ts search [-q "<keywords>"] [facet flags]The documentation includes network, browsing, or remote request actions.
agent search endpoint, which replaces the index's truncated preview with eachEvidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 83/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 29,574 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
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.
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.
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.Alternatives
coreyhaines31/marketingskills
When the user wants to plan, design, or implement an A/B test or experiment, or build a growth experimentation program. Also use when the user mentions "A/B test," "split test," "experiment," "test this change," "variant copy," "multivariate test," "hypothesis," "should I test this," "which version is better," "test two versions," "statistical significance," "how long should I run this test," "growth experiments," "experiment velocity," "experiment backlog," "ICE score," "experimentation program
alirezarezvani/claude-skills
App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist
dotnet/skills
Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP). Use when user asks to "migrate to MTP", "switch from VSTest", "enable Microsoft.Testing.Platform", "use MTP runner", set OutputType=Exe only for test projects in Directory.Build.props, or mentions EnableMSTestRunner, EnableNUnitRunner, or UseMicrosoftTestingPlatformRunner. USE FOR: MTP behavioral differences vs VSTest (exit code 8, zero tests discovered, --ignore-exit-code, TESTINGPLATFORM_EXITCODE_IGNORE); centralizing
JasonColapietro/suede-creator-skills
Suede-owned experimentation discipline for hypotheses, sample sizing, test duration, significance, and repeatable experiment programs. Use when comparing variants, deciding whether a result is reliable, or building an experiment backlog and cadence. NOT FOR: analytics instrumentation (use suede-analytics), post-click conversion diagnosis (use suede-site-alchemy), or writing the variant copy itself (use suede-copy).