JobHunter AI Agent

JobHunter AI Agent

From Prompt to Product

From Prompt to Product

From Prompt to Product

The Problem:

Job boards are noisy. You scroll through hundreds of roles, most irrelevant, outdated, or clearly not a fit. The signal-to-noise ratio is low, and the time cost is high.

As a UX/UI designer, I didn’t just want more jobs. I wanted the right jobs, roles aligned with my experience level, in the right locations, from companies I actually cared about.

There was no tool doing that filtering properly. So I built one.

The Idea:

An AI-powered agent that runs on a schedule, scans multiple job sources, filters for relevance, and delivers only qualified product design roles directly to me.

No scrolling. No refreshing job boards. No manual filtering.

The concept was simple: Automate discovery, but more importantly, prioritize quality over volume.

The Process:

  1. Defining the System Before Writing Code

Before touching implementation, I defined what this agent needed to do well. It had to be push-based, not pull-based:

  • Pull jobs from reliable sources

  • Filter specifically for product/UX design roles

  • Prioritize early-to-mid career opportunities (1–5 years of experience)

  • Run automatically without manual input

  • Deliver results in a simple, digestible format


I also defined what this was not:

  • Not a job board

  • Not a dashboard

  1. Choosing the Right Data Sources

The biggest decision was not technical, it was strategic. Most job boards are aggregators, which means:

  • Duplicate listings

  • Outdated roles

  • Low relevance


Instead of relying on generic platforms, I prioritized:

  • Remotive API for remote roles

  • Company career pages (targeted startups in Vancouver, Canada, and the US)

  • ATS systems like Greenhouse/Lever (future expansion)


This shift was critical. It turned the agent from a job scraper into a high-signal opportunity filter.

  1. Designing the Filtering Logic

Title Matching: Instead of broad keyword matching, to ensure relevance without over-filtering, I defined a focused set:

  • product designer

  • ux designer

  • ui designer

  • interaction designer

  • experience designer

  • product design lead


Experience Filtering (Core Logic): Most job descriptions include experience requirements, but in inconsistent formats. I built a parsing system to extract patterns like:

  • “3+ years”

  • “1–2 years”

  • “minimum 4 years”

Title Matching: Instead of broad keyword matching, to ensure relevance without over-filtering, I defined a focused set:

  • product designer

  • ux designer

  • ui designer

  • interaction designer

  • experience designer

  • product design lead


Experience Filtering (Core Logic): Most job descriptions include experience requirements, but in inconsistent formats. I built a parsing system to extract patterns like:

  • “3+ years”

  • “1–2 years”

  • “minimum 4 years”

  1. Building the Agent

The system is built in Python with a simple, reliable architecture:

  • Fetch jobs via API

  • Filter by title + experience

  • Format results

  • Send via email


Key Components:


Data Fetching

  • Pulls job listings from Remotive

  • Designed to expand into multiple sources


Filtering Engine

  • Title-based filtering

  • Regex-based experience parsing

  • Overlap logic for realistic interpretation


Email Delivery

  • Clean, readable summary

  • Limited to top results to avoid overload

The system is built in Python with a simple, reliable architecture:

  • Fetch jobs via API

  • Filter by title + experience

  • Format results

  • Send via email


Key Components:


Data Fetching

  • Pulls job listings from Remotive

  • Designed to expand into multiple sources


Filtering Engine

  • Title-based filtering

  • Regex-based experience parsing

  • Overlap logic for realistic interpretation


Email Delivery

  • Clean, readable summary

  • Limited to top results to avoid overload

  1. Automation and Scheduling

The agent runs using GitHub Actions. Key decisions:

  • Runs at 7am and 1pm PT

  • Uses a state file to prevent duplicate sends

  • Includes safeguards to avoid unnecessary runs

  1. Iteration and Debugging

Several issues surfaced during development:


Duplicate Emails: The agent was sending multiple emails per time slot.

Fixed using a state tracking system (last_sent_slot)


Time-Based Execution Conflicts: Manual runs were being blocked by scheduled logic.

Adjusted conditions to separate testing vs production runs


Performance Bottlenecks: Adding multiple company career sites significantly increased runtime.

Introduced request limits and timeouts to keep execution predictable

Several issues surfaced during development:


Duplicate Emails: The agent was sending multiple emails per time slot.

Fixed using a state tracking system (last_sent_slot)


Time-Based Execution Conflicts: Manual runs were being blocked by scheduled logic.

Adjusted conditions to separate testing vs production runs


Performance Bottlenecks: Adding multiple company career sites significantly increased runtime.

Introduced request limits and timeouts to keep execution predictable

The Result:

A fully automated job discovery system that:

  • Runs twice daily without manual input

  • Filters roles based on title and experience

  • Prioritizes relevant product design opportunities

  • Reduces time spent searching while increasing quality of results


Instead of checking job boards, the right roles come to me.