How to Configure AI Job Search for a Specific Country's Job Market
AI Job Search uses a country-agnostic core where you enable existing portal skills or generate new ones via the /add-portal command to target specific job markets.
The MadsLorentzen/ai-job-search repository provides a modular framework for automating job searches across different countries. Its architecture separates market-specific data collection (portal skills) from the core automation logic, allowing you to configure AI Job Search for a specific country's job market without modifying the underlying codebase.
Understanding the Country-Agnostic Architecture
AI Job Search organizes job portal integrations as skills under the .agents/skills/ directory. Each skill is a self-contained directory that includes a SKILL.md file with YAML front-matter controlling its behavior.
The framework ships with two tiers of portal coverage:
- Country-agnostic portals:
linkedin-searchandfreehire-searchare enabled by default in their respectiveSKILL.mdfiles and work across international markets. - Demo portals: Four Danish-specific portals (
jobindex-search,jobbank-search,jobdanmark-search,jobnet-search) are included but disabled by default, serving as templates for market-specific implementations.
Every portal skill adheres to a uniform contract including CLI interfaces, output formats, and an enabled: boolean flag in the YAML front-matter of its SKILL.md file.
Method 1: Enable Existing Country-Agnostic Portals
For broad international coverage, enable the default global portals. These require no code changes and work immediately for most markets.
Verify the LinkedIn portal is active by checking its front-matter:
# Check the enabled status in the skill configuration
cat .agents/skills/linkedin-search/SKILL.md
Ensure the file contains:
---
enabled: true
---
The freehire-search portal follows the same pattern in .agents/skills/freehire-search/SKILL.md. According to the repository's README.md, both portals ship with enabled: true by default, making them immediately available when you run the scraper.
Method 2: Add a New Market-Specific Portal
When targeting a country not covered by the default portals (for example, Germany, France, or Japan), generate a new portal skill using the built-in scaffolding command.
Generate the Portal Skill
Invoke the portal generator which creates a country-agnostic skill template:
ai-job-search /add-portal
The generator, as documented in .claude/commands/add-portal.md, prompts for:
- Market: The target country or region (e.g., "Germany")
- Language: The primary language of the job board (e.g., "German")
- Site URL: The base URL of the job portal
This creates a new directory under .agents/skills/ (for example, example-de-search/) containing a CLI stub and a SKILL.md file with market-specific trigger phrases and help text.
Configure the SKILL.md Front-Matter
After generation, enable the new portal by modifying its configuration file:
# Enable the newly created German portal
sed -i 's/enabled: false/enabled: true/' .agents/skills/example-de-search/SKILL.md
Alternatively, open .agents/skills/example-de-search/SKILL.md in your editor and manually set enabled: true in the YAML front-matter. This toggle controls whether the /scrape command includes this portal in its execution cycle.
Verify Auto-Discovery
The job scraper automatically discovers all portal skills with enabled: true. As specified in .claude/skills/job-scraper/SKILL.md at line 63, the scraper honors the enabled toggle and skips any portals marked enabled: false during execution.
Complete Configuration Workflow
Follow these steps to configure AI Job Search for your target market:
-
Run initial setup: Execute
ai-job-search /setuporai-job-search setup. This interactive command prompts for your Location (city and country). If you specify Denmark, the setup script automatically enables the four Danish demo portals; otherwise, it leaves them disabled. -
Select your approach:
- For global coverage: Verify
linkedin-searchandfreehire-searchare enabled in theirSKILL.mdfiles. - For local markets: Run
/add-portaland complete the generator prompts.
- For global coverage: Verify
-
Enable new portals: Set
enabled: truein the front-matter of any newly generatedSKILL.mdfiles. -
Execute the scraper: Run the scraper with your target location:
ai-job-search /scrape --location "Berlin, DE"
The scraper invokes all enabled portals and returns unified job listings regardless of their original markets.
Key Configuration Files and Their Roles
.agents/skills/*/SKILL.md: Contains the YAML front-matter with the enabled: flag that controls portal activation. Each portal skill has its own file in this pattern.
.claude/commands/setup.md: Defines the interactive setup flow at line 336, which handles location detection and auto-enables Danish portals when the specified market is Denmark.
.claude/commands/add-portal.md: Documents the portal generation workflow at line 5, confirming the generator is country-agnostic and creates market-agnostic templates.
.claude/skills/job-scraper/SKILL.md: Defines how the scraper discovers and executes portal skills, specifically referencing the enabled: toggle at line 63.
README.md: Provides high-level documentation of the country-agnostic design and lists the default portal availability.
Summary
- AI Job Search separates core logic from market-specific data collection through modular portal skills in
.agents/skills/. - Enable existing global portals by verifying
enabled: truein theirSKILL.mdfiles (LinkedIn and freehire are enabled by default). - Add new country-specific markets using the
/add-portalcommand, which generates a skill template based on your specified country and language. - Control portal execution via the
enabled:boolean in each skill's front-matter; only enabled portals participate in the/scrapecommand. - The setup command auto-detects Danish markets and enables local portals automatically, leaving them disabled for other countries.
Frequently Asked Questions
How do I enable the Danish job portals included in the repository?
Run ai-job-search /setup and specify a location in Denmark (such as "Copenhagen, DK"). The setup command, as implemented in .claude/commands/setup.md, automatically sets enabled: true for the four Danish demo portals (jobindex-search, jobbank-search, jobdanmark-search, and jobnet-search) when it detects a Danish market. For manual enabling, edit each portal's .agents/skills/[portal-name]/SKILL.md file and change enabled: false to enabled: true.
Can I run multiple country portals simultaneously during a single job search?
Yes. The /scrape command discovers and executes all portal skills with enabled: true regardless of their target markets. You can enable LinkedIn (global), a German-specific portal, and a French-specific portal simultaneously; the scraper aggregates results from all enabled sources into a unified output. Disable specific portals by setting enabled: false in their respective SKILL.md files if you want to narrow results to a single market.
What happens if I set enabled: false in a portal's SKILL.md?
The portal skill remains installed in .agents/skills/ but the job scraper skips it entirely during execution. As documented in .claude/skills/job-scraper/SKILL.md, the scraper checks the enabled: toggle before invoking any portal CLI. This allows you to keep portal code available for future use without incurring runtime execution costs or cluttering your search results with unwanted markets.
Do I need to restart the application after enabling a new portal?
No. AI Job Search reads the enabled: status from each SKILL.md file at runtime when executing the /scrape command. Changes to the front-matter take effect immediately on the next scraper invocation. However, if you add a completely new portal using /add-portal, ensure the skill directory is fully written to disk before running the scraper.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →