docs: document freehire-search in README and SETUP (#103)

The freehire-search CLI is typechecked in CI but was missing from install
instructions, the file tree, and the country-agnostic portal overview.

Co-authored-by: fooSynaptic <19420328+fooSynaptic@users.noreply.github.com>
This commit is contained in:
fooSynaptic
2026-07-09 21:13:31 +02:00
committed by GitHub
co-authored by fooSynaptic
parent 779a33aa20
commit 6a1240648f
2 changed files with 16 additions and 14 deletions
+12 -10
View File
@@ -47,7 +47,7 @@ The framework encodes career guidance best practices, including structured evalu
- [Claude Code](https://claude.com/claude-code) (CLI) - [Claude Code](https://claude.com/claude-code) (CLI)
- Python 3.10+ - Python 3.10+
- [Bun](https://bun.sh) (for Danish job search CLI tools) - [Bun](https://bun.sh) (for job search CLI tools)
- LaTeX distribution with `lualatex` and `xelatex`: [TeX Live](https://tug.org/texlive/), [MacTeX](https://tug.org/mactex/), [TinyTeX](https://yihui.org/tinytex/), or [MiKTeX](https://miktex.org/). The CV compiles with `lualatex` (pdflatex often fails on modern MiKTeX installs with `fontawesome5` font-expansion errors); the cover letter compiles with `xelatex` because `cover.cls` requires `fontspec`. If using a minimal TeX install such as TinyTeX or BasicTeX, install the extra packages listed in [SETUP.md](SETUP.md#minimal-tex-install-tinytexbasictex). - LaTeX distribution with `lualatex` and `xelatex`: [TeX Live](https://tug.org/texlive/), [MacTeX](https://tug.org/mactex/), [TinyTeX](https://yihui.org/tinytex/), or [MiKTeX](https://miktex.org/). The CV compiles with `lualatex` (pdflatex often fails on modern MiKTeX installs with `fontawesome5` font-expansion errors); the cover letter compiles with `xelatex` because `cover.cls` requires `fontspec`. If using a minimal TeX install such as TinyTeX or BasicTeX, install the extra packages listed in [SETUP.md](SETUP.md#minimal-tex-install-tinytexbasictex).
- Optional: `pdftotext` from [poppler](https://poppler.freedesktop.org/) (macOS: `brew install poppler`, Debian/Ubuntu: `apt install poppler-utils`, Windows: `choco install poppler`) — used by `/apply`'s ATS parseability check on the compiled CV. If missing, the check degrades gracefully to a visual keyword review. - Optional: `pdftotext` from [poppler](https://poppler.freedesktop.org/) (macOS: `brew install poppler`, Debian/Ubuntu: `apt install poppler-utils`, Windows: `choco install poppler`) — used by `/apply`'s ATS parseability check on the compiled CV. If missing, the check degrades gracefully to a visual keyword review.
@@ -65,7 +65,7 @@ cd ai-job-search
PowerShell: PowerShell:
```powershell ```powershell
$tools = @("jobbank-search", "jobdanmark-search", "jobindex-search", "jobnet-search", "linkedin-search") $tools = @("jobbank-search", "jobdanmark-search", "jobindex-search", "jobnet-search", "linkedin-search", "freehire-search")
foreach ($tool in $tools) { foreach ($tool in $tools) {
Set-Location ".agents/skills/$tool/cli" Set-Location ".agents/skills/$tool/cli"
bun install bun install
@@ -76,14 +76,12 @@ foreach ($tool in $tools) {
Bash / zsh / Git Bash: Bash / zsh / Git Bash:
```bash ```bash
cd .agents/skills/jobbank-search/cli && bun install && cd ../../../.. for tool in jobbank-search jobdanmark-search jobindex-search jobnet-search linkedin-search freehire-search; do
cd .agents/skills/jobdanmark-search/cli && bun install && cd ../../../.. cd .agents/skills/$tool/cli && bun install && cd ../../../..
cd .agents/skills/jobindex-search/cli && bun install && cd ../../../.. done
cd .agents/skills/jobnet-search/cli && bun install && cd ../../../..
cd .agents/skills/linkedin-search/cli && bun install && cd ../../../..
``` ```
For `linkedin-search` the install is optional: it has zero runtime dependencies and runs with plain `bun`; `bun install` only pulls TypeScript dev types. For `linkedin-search` and `freehire-search` the install is optional: both have zero runtime dependencies and run with plain `bun`; `bun install` only pulls TypeScript dev types.
### 3. Set up your profile ### 3. Set up your profile
@@ -165,7 +163,8 @@ ai-job-search/
│ ├── jobdanmark-search/ # Jobdanmark.dk (Denmark) │ ├── jobdanmark-search/ # Jobdanmark.dk (Denmark)
│ ├── jobindex-search/ # Jobindex.dk (Denmark) │ ├── jobindex-search/ # Jobindex.dk (Denmark)
│ ├── jobnet-search/ # Jobnet.dk (Denmark, government portal) │ ├── jobnet-search/ # Jobnet.dk (Denmark, government portal)
── linkedin-search/ # LinkedIn public job listings (country-agnostic) ── linkedin-search/ # LinkedIn public job listings (country-agnostic)
│ └── freehire-search/ # freehire.dev tech job aggregator (multi-market, REST API)
├── cv/ ├── cv/
│ └── main_example.tex # moderncv LaTeX template │ └── main_example.tex # moderncv LaTeX template
├── cover_letters/ ├── cover_letters/
@@ -273,7 +272,10 @@ Give it your local job board's URL. The command investigates the portal (search-
Maintaining a fork adapted to your market or language? Add it to the [Community forks & adaptations](https://github.com/MadsLorentzen/ai-job-search/discussions/78) thread so others can find it. Maintaining a fork adapted to your market or language? Add it to the [Community forks & adaptations](https://github.com/MadsLorentzen/ai-job-search/discussions/78) thread so others can find it.
For a **country-agnostic** starting point, the repo also includes **`linkedin-search`** — a job-search skill built on LinkedIn's public, unauthenticated `jobs-guest` endpoints. It is field-agnostic, has **zero runtime dependencies** (runs with just `bun`), and takes the search location as an explicit flag, so it works for any market out of the box (`-l "Berlin, Germany"`, `-l "Mumbai, Maharashtra, India"`, `-l "Remote"`, …). It is intended for **personal use only** — automated access is against LinkedIn's Terms of Service, so keep volume low. See `.agents/skills/linkedin-search/SKILL.md`. For **country-agnostic** starting points outside Denmark, the repo ships two portal skills alongside the Danish demos:
- **`linkedin-search`** — built on LinkedIn's public, unauthenticated `jobs-guest` endpoints. Field-agnostic, **zero runtime dependencies** (runs with just `bun`), and takes the search location as an explicit flag, so it works for any market out of the box (`-l "Berlin, Germany"`, `-l "Mumbai, Maharashtra, India"`, `-l "Remote"`, …). Intended for **personal use only** — automated access is against LinkedIn's Terms of Service, so keep volume low. See `.agents/skills/linkedin-search/SKILL.md`.
- **`freehire-search`** — queries the [freehire.dev](https://freehire.dev) aggregator's public REST API (JSON, no API key). Tech-focused (software, data, engineering, DevOps, remote), multi-market via facet flags (`--region`, `--country`, `--remote`), and **zero runtime dependencies**. Unlike the HTML-scraping Danish portals, results come back structured (skills, seniority, category). The backend is MIT-licensed and [self-hostable](https://github.com/strelov1/freehire) — point `FREEHIRE_API_URL` at your own instance if you prefer. See `.agents/skills/freehire-search/SKILL.md`.
### Salary benchmarking ### Salary benchmarking
+4 -4
View File
@@ -26,7 +26,7 @@ On Windows, `py --version` is often the most reliable check. If your system expo
### Bun (for job search tools) ### Bun (for job search tools)
The job portal CLIs (four Danish portals plus the country-agnostic LinkedIn tool) are written in TypeScript and run with Bun. The job portal CLIs (four Danish portals plus the country-agnostic `linkedin-search` and `freehire-search` tools) are written in TypeScript and run with Bun.
- macOS/Linux: - macOS/Linux:
@@ -122,7 +122,7 @@ Run these from the repository root.
- PowerShell: - PowerShell:
```powershell ```powershell
$tools = @("jobbank-search", "jobdanmark-search", "jobindex-search", "jobnet-search", "linkedin-search") $tools = @("jobbank-search", "jobdanmark-search", "jobindex-search", "jobnet-search", "linkedin-search", "freehire-search")
foreach ($tool in $tools) { foreach ($tool in $tools) {
Set-Location ".agents/skills/$tool/cli" Set-Location ".agents/skills/$tool/cli"
bun install bun install
@@ -132,12 +132,12 @@ foreach ($tool in $tools) {
- Bash / zsh / Git Bash: - Bash / zsh / Git Bash:
```bash ```bash
for tool in jobbank-search jobdanmark-search jobindex-search jobnet-search linkedin-search; do for tool in jobbank-search jobdanmark-search jobindex-search jobnet-search linkedin-search freehire-search; do
cd .agents/skills/$tool/cli && bun install && cd ../../../.. cd .agents/skills/$tool/cli && bun install && cd ../../../..
done done
``` ```
For `linkedin-search` the install is optional: it has zero runtime dependencies and runs with plain `bun`; `bun install` only pulls TypeScript dev types. For `linkedin-search` and `freehire-search` the install is optional: both have zero runtime dependencies and run with plain `bun`; `bun install` only pulls TypeScript dev types.
If you're outside Denmark, you can generate an equivalent search skill for your local job board with `/add-portal` — it scaffolds the same CLI structure for any public portal and test-runs a live query before registering. See the "Job search tools" section in the README. If you're outside Denmark, you can generate an equivalent search skill for your local job board with `/add-portal` — it scaffolds the same CLI structure for any public portal and test-runs a live query before registering. See the "Job search tools" section in the README.