# AI Job Search Dependencies: Complete Setup Guide for MadsLorentzen/ai-job-search

> Discover essential AI job search dependencies. Set up MadsLorentzen/ai-job-search with Python 3.10+, Bun, LaTeX, and key Python packages. Get started today!

- Repository: [Mads Lorentzen/ai-job-search](https://github.com/MadsLorentzen/ai-job-search)
- Tags: how-to-guide
- Published: 2026-07-25

---

**The ai-job-search project requires Python 3.10+, Bun for JavaScript tooling, a LaTeX distribution with lualatex/xelatex, and optional poppler-utils for PDF text extraction, alongside minimal Python packages including openpyxl and PyYAML.**

The MadsLorentzen/ai-job-search repository orchestrates a multi-runtime workflow that combines Python scripts, TypeScript CLI tools, and LaTeX document generation to automate job searching with AI assistance. Understanding the ai-job-search dependencies is essential for running the end-to-end pipeline from salary benchmarking to PDF generation. The project deliberately maintains a minimal install surface, relying primarily on standard library functionality augmented by specific tools for Excel processing, YAML parsing, and document compilation.

## Core Python Runtime and Libraries

The foundation of the project rests on **Python 3.10+**, utilizing primarily the standard library to minimize third-party dependencies. Only two external Python packages are required for specific utility functions located in the `tools/` directory.

### openpyxl for Excel Processing

The [`tools/convert_salary_excel.py`](https://github.com/MadsLorentzen/ai-job-search/blob/main/tools/convert_salary_excel.py) script depends on **openpyxl** to read salary spreadsheets and export JSON structures for the benchmarking tool. This conversion enables the [`salary_lookup.py`](https://github.com/MadsLorentzen/ai-job-search/blob/main/salary_lookup.py) workflow to process compensation data without manual data entry.

```python

# Convert an Excel workbook containing salary tables into JSON format

# Source: tools/convert_salary_excel.py

from tools.convert_salary_excel import convert_excel_to_json

json_data = convert_excel_to_json("data/salaries.xlsx")
print(json_data)  # Outputs JSON string for salary_lookup consumption

```

Install via: `pip install openpyxl`

### PyYAML for Configuration Linting

The [`tools/lint_skills.py`](https://github.com/MadsLorentzen/ai-job-search/blob/main/tools/lint_skills.py) utility requires **PyYAML** to parse and validate Claude Code skill definitions stored in `.claude/skills/` and command specifications. This ensures the AI agent configurations remain syntactically valid before execution.

```bash

# Validate all .claude/ skills, commands, and settings

python -m tools.lint_skills

```

Install via: `pip install pyyaml`

## JavaScript Runtime with Bun

The portal-search CLI tools located in `.agents/skills/*` (including `jobindex-search` and `linkedin-search`) are written in TypeScript and executed using **Bun**. These tools handle job portal scraping and search automation independently of the Python core.

```bash

# Example installation for the Jobindex portal tool

# Navigate to any .agents/skills/*/cli directory

cd .agents/skills/jobindex-search/cli
bun install  # Pulls TypeScript dependencies and builds the executable

```

Unlike Node.js-based projects, these tools specifically target Bun as their runtime environment. The installation process compiles TypeScript sources into executable binaries without requiring global npm packages.

## LaTeX Toolchain for Document Generation

PDF generation for CVs and cover letters requires a complete **LaTeX distribution** (TeX Live, MacTeX, TinyTeX, or MiKTeX) with `lualatex` and `xelatex` engines. The `cv/main_example.tex` template uses the moderncv class, while `cover_letters/cover.cls` provides a custom document class for application letters.

```bash

# Compile the CV template (executed from cv/ directory)

lualatex main_example.tex  # Produces main_example.pdf

```

The LaTeX workflow is not merely decorative; it produces PDF output that is subsequently inspected and ATS-checked as part of the application pipeline. Both `lualatex` and `xelatex` support are required to handle different document classes within the repository.

## Optional but Recommended Dependencies

Two additional tools enhance functionality without blocking core workflows.

### poppler-utils for PDF Verification

The optional **poppler-utils** package provides `pdftotext` for extracting text layers from generated PDFs. This enables the `/apply` command to verify ATS readability by inspecting the PDF text content. According to the README prerequisites, the workflow degrades gracefully if this dependency is missing, though automated text verification becomes unavailable.

### Claude Code CLI

While not a library dependency installable via package managers, **Claude Code** serves as the required external service that evaluates job postings, drafts CVs and cover letters, and manages interview preparation workflows. This AI agent integrates with the local tooling but operates as a separate CLI application.

## Summary

- **Python 3.10+** with **openpyxl** and **PyYAML** handles Excel conversion, skill linting, and core scripting in [`tools/convert_salary_excel.py`](https://github.com/MadsLorentzen/ai-job-search/blob/main/tools/convert_salary_excel.py) and [`tools/lint_skills.py`](https://github.com/MadsLorentzen/ai-job-search/blob/main/tools/lint_skills.py).
- **Bun** executes the TypeScript-based portal search tools located in `.agents/skills/*/cli` directories.
- **LaTeX distributions** (TeX Live/MacTeX/TinyTeX/MiKTeX) with `lualatex` and `xelatex` compile `cv/main_example.tex` and `cover_letters/cover.cls` into PDF application materials.
- **poppler-utils** optionally enables PDF text extraction for ATS verification via `pdftotext`.
- **Claude Code** operates as the central AI agent coordinating the entire workflow.

## Frequently Asked Questions

### Do I need Node.js if I already have Bun installed?

No. The ai-job-search project specifically targets **Bun** as its JavaScript runtime for the `.agents/skills/*` CLI tools. While Bun maintains compatibility with Node.js APIs, the installation and execution workflows assume `bun install` and `bun run` commands rather than npm or node.

### Can I use Python 3.9 instead of Python 3.10?

The README specifies **Python 3.10+** as a prerequisite. While some scripts may function on 3.9, the project relies on language features and standard library modules introduced in 3.10 for the Claude Code integration and type hinting used throughout `tools/*.py`.

### Why does the project limit third-party Python packages?

The repository intentionally restricts Python dependencies to **openpyxl** and **PyYAML** to minimize the install surface and reduce supply chain attack vectors. Most functionality leverages the Python standard library, with heavier processing (such as web scraping) offloaded to the Bun-based TypeScript tools rather than Python libraries like Selenium or Playwright.

### Is poppler-utils required for generating job applications?

No. **poppler-utils** is optional. It enables the `/apply` command to extract and verify PDF text layers for ATS compatibility using `pdftotext`. Without it, the workflow continues but skips the automated text extraction verification step, requiring manual inspection of generated PDFs instead.