See the full portfolio

Job search engine with AI agents

An agent system that collects job openings from several sites, scores them against a profile with explicit criteria and keeps a record of every application.

Year
2026
Status
In use
Stack
Claude Code, Skills, Subagents, Python, TypeScript, GitHub Pages
Job search engine with AI agents

The problem

A job search is, operationally, a data problem: hundreds of openings spread across several sites, a minority that fit the profile, and a CV that has to be adapted for each application.

With a full-time job, going through listing sites every night wasn't viable. I treated it as what it is, a data funnel, and automated the repetitive part.

Foundation of the system

The foundation is ai-job-search, an open framework by Mads Lorentzen built for the Danish market. I took it and adapted it to Chile:

  • Translated the instructions, criteria and templates into Spanish.
  • Switched CVs from LaTeX to Word, which is what recruiters here ask for.
  • Wrote my own scrapers for Empleos Públicos, Chile's public-sector job board (through a JSON endpoint the site uses internally), and for research centers and think tanks.
  • Added a rule I care about: every application stores the exact job ad and what I declared, so no agent ever invents experience.

From job ad to PDF

  1. /scrape
    SearchSaved searches in five groups: data and BI, public sector, applied and academic research.
  2. seen
    Skip repeatsAnything already seen goes into seen_jobs.json and is skipped next time.
  3. 0–100
    ScoreFirst a quick fit rating (high, medium, low), then a detailed score.
  4. /apply
    ApplyOne agent drafts a tailored CV and cover letter; another reviews them. LibreOffice converts them to PDF and the CV can’t exceed two pages.
  5. csv
    TrackOne record per opening, a tracking sheet and interview prep notes.
  6. push
    PublishA script merges everything into JSON and updates my viewer on GitHub Pages.

How is an opening scored?

Technical skills30%
Career direction30%
Experience25%
Work-style fit15%

Above 75 is a "strong fit". Having a number forces me to drop openings that excite me but aren’t right for me.

The pieces

Claude CodeOrchestrates everything from the terminal with custom commands.
SkillsReusable instructions: how to search, how to score, how to write. job-scraper
SubagentsOne drafts and one reviews, each with its own context.
ScriptsPython for scrapers and PDFs; TypeScript on Bun for LinkedIn.
MemorySeen openings, a tracking sheet and one record per application.
ViewerHand-made HTML with four views: openings, analysis, history and tracking.

Ten weeks in numbers

From July 6 to September 15, 2026.

468openings reviewed
311different companies
29search runs
34tailored CVs

How many actually fit

High fit76
Medium fit179
Low fit213

Fewer than one in six openings is a good fit. Without the filter, I would have spent most of my time on applications going nowhere.

What I learned

  • AI writes fast, but it has to be tied to facts. That's why every application stores the job ad and what I declared, and a second agent checks the CV against my real profile.
  • An explicit score organizes decisions. When fewer than one in six openings fits, the filter is what saves the most time.
  • Adapting beats inventing. Taking a good open framework and fitting it to my context was faster and better than starting from zero.
  • Automating the repetitive part frees time for what matters, like preparing properly for each interview.

If you arrived from one of those applications, this page shows how I work: explicit criteria, a record of every decision and verification before sending.