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
Multi-source collection
Google Jobs through SerpApi, plus targeted searches on Bayt, Rekrute and Emploi.ma.
Normalisation and deduplication
Results from different searches overlap: they are normalised and deduplicated before any ranking.
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.
PostgreSQL history
Listings and searches stored in PostgreSQL: full history and statistics on demand.
Polished Excel export
A workbook with listings and summary sheets, colour-coded relevance and clickable apply links.
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.
- InterfaceCandidate skills
- Flask API/api/search
- SerpApiGoogle Jobs · targeted boards
- DeduplicationNormalisation
- Scoring5 criteria
- 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 provesThat I can turn a repetitive chore into a complete product: data collection, explainable ranking rules, persistence, an API and a ready-to-use export.
06Technology
Full stack
- Python
- Flask
- PostgreSQL
- SerpApi
- pandas
- openpyxl
- REST
- HTML
- CSS
- JavaScript