All projects

AI & data

Job Hunter Morocco · job aggregator

One search queries the main job boards, then deduplicates, ranks by relevance, stores and exports the listings into a ready-to-use Excel workbook.

  • Works locally · no online demo
  • Individual project
job boards covered
6+
criteria in the relevance score
5
REST endpoints
5
search instead of one per board
1

01Starting point

Context & mission

The problem

Job hunting in Morocco means running the same search on LinkedIn, Bayt, Rekrute, Emploi.ma, Indeed, Glassdoor and more, then weeding out duplicates by hand, with no idea which listings deserve to be read first.

The mission

Build a tool that starts from the candidate’s skills and shows the best matches first, with a history and a directly usable export.

My role

Designed and built on my own: collection, processing, scoring, database, API, interface and export.

02Execution

What I did

  1. Multi-source collection

    Google Jobs through SerpApi, plus targeted searches on Bayt, Rekrute and Emploi.ma.

  2. Normalisation and deduplication

    Results from different searches overlap: they are normalised and deduplicated before any ranking.

  3. Explainable relevance score

    Five criteria: keywords in the title, keywords in the description, source quality, salary information and freshness. A heuristic ranking, presented as such.

  4. PostgreSQL history

    Listings and searches stored in PostgreSQL: full history and statistics on demand.

  5. Polished Excel export

    A workbook with listings and summary sheets, colour-coded relevance and clickable apply links.

  6. REST API and interface

    Flask API (/api/search, /api/export/excel, /api/history, /api/stats, /health) and a lightweight single-page interface with a relevance badge on every job card. Credentials kept out of the code through environment variables.

03Design

Architecture

Each responsibility is separate: the interface calls the Flask API, which runs the search through SerpApi, normalises and deduplicates results, computes the score, then stores to PostgreSQL and produces the Excel export.

The search pipeline
  1. InterfaceCandidate skills
  2. Flask API/api/search
  3. SerpApiGoogle Jobs · targeted boards
  4. DeduplicationNormalisation
  5. Scoring5 criteria
Supported by
  • PostgreSQLHistory · stats
  • Excel exportListings · summary

04Impact

Results

  • A single search replaces the same query repeated on every board.
  • Deduplicated, ranked listings, with a score whose every criterion is known.
  • A searchable history and an Excel export ready to share.

05Wrap-up

Takeaways

What this project proves

That I can turn a repetitive chore into a complete product: data collection, explainable ranking rules, persistence, an API and a ready-to-use export.

Learnings and next steps

The project runs locally. Searches can already be scheduled with an external tool such as cron; an online demo would be the next step.

06Technology

Full stack

  • Python
  • Flask
  • PostgreSQL
  • SerpApi
  • pandas
  • openpyxl
  • REST
  • HTML
  • CSS
  • JavaScript