Automated employer and vacancy monitoring

Job Match Finder

A self-hosted system that finds employers, monitors their careers sources and scores vacancies against my systems administration profile — so suitable IT roles in Switzerland and Liechtenstein are less easy to miss.

← Back to projects

The problem

Finding suitable IT roles across Switzerland meant repeatedly searching job boards, recruiter listings and individual employer websites. The same vacancy often appeared several times; many results were irrelevant to a systems administration, Microsoft 365 and infrastructure background; and agencies frequently hid the real employer.

Job boards can also remove adverts without making it clear whether the vacancy actually closed. Manually checking hundreds or thousands of employers is unrealistic — and many good employers advertise only on their own careers pages, so they never appear on aggregators at all.

Build or buy

Off-the-shelf job alerts still centre on job-board searches. I needed something different: monitor employers directly, keep them on a watchlist even when they have no open roles today, and score vacancies against my own skills and preferences.

So I used AI-assisted development to build a self-hosted Job Match Finder that starts from employer discovery rather than from a single job board.

The workflow

Job Match Finder recommended jobs list with Match and Interest scores; employer names anonymised
Recommended jobs ranked by Match and Interest — employer names anonymised for this site
Telegram notification from Job Match Finder showing a highly recommended vacancy with Match and Interest scores; employer and link anonymised
Telegram alert when a highly recommended vacancy appears
  1. Company registry Employers discovered systematically
  2. Official website Found and identity-checked
  3. Careers page Recruiting platform detected
  4. Continuous monitoring Even when there are no vacancies today
  5. Vacancy Normalised and deduplicated
  6. Profile matching Match · Interest · Confidence

The long-term design is not “search a job board again”. It is company registry → employer → official website → careers page → recruiting system → continuous monitoring → vacancy → profile matching. Employers stay monitored so new roles can be found later.

Where AI fitted

I defined the matching logic, the employer-discovery workflow, the validation rules and the safety requirements: verify company identity before trusting a website, validate new sources before treating them as authoritative, and keep provenance for each vacancy.

Cursor was used to implement, test and iteratively improve the application against real vacancy and employer data. AI helped build the tool — the match scores and ranking decisions follow rules I set.

Technical details

  • Discovers jobs from Job-Room and direct employer careers sources, and discovers employers systematically from Swiss commercial-register data (LINDAS).
  • Finds company websites with deterministic discovery plus search, verifies company identity, locates careers pages and detects the recruiting platform in use — with reusable integrations for common Swiss and international platforms as well as structured job markup and generic HTML careers pages.
  • Monitors employer careers pages repeatedly so new vacancies can appear later even when an employer currently has none; normalises and deduplicates adverts from multiple sources.
  • Scores each vacancy for Match (skills fit), Interest (role attractiveness) and Confidence (evidence quality), then ranks into Highly Recommended / Maybe Recommended / Not Recommended.
  • Keeps employer and source provenance plus vacancy lifecycle information, and stores application-time snapshots for later use. Currently monitors dozens of employers and processes thousands of vacancies, with coverage expanding across Eastern Switzerland and Liechtenstein support being added.
  • Runs self-hosted. No public login, credentials or internal paths are exposed on this site.

Technology

  • Python
  • FastAPI
  • SQLAlchemy
  • SQLite
  • Jinja2
  • Brave Search API
  • LINDAS