JobsResearch / Engineering notes
A match score needs an explanation
From scattered job postings to an inspectable decision, with the applicant in control.
Active project · private repository
- Postings + CV
- Assess
- Explain
- Review
The problem
JobsResearch brings job postings from five sources — four job boards in Finland and Sweden's national employment API — into one workflow and assesses them against a CV. The useful output is a decision aid: what fits, what is missing, and which opportunity deserves a closer look.
Show the reason alongside the score
Each match has a score and a written explanation. An LLM judges fit, and deterministic eligibility rules cap the score on seniority, a required degree or fluent Finnish, so persuasive posting text cannot override hard requirements. A score helps sort a list; the explanation and explicit constraints help the applicant decide what to do.
Different tasks need different context
Matching uses the CV and posting. Cover-letter drafting uses that job’s description and the applicant’s CV, with an optional critique-and-revision pass. Company research is requested per job. Semantic search is available when a local Ollama embedding model is configured.
Keep the next action with the applicant
The application tracks saved jobs, applications and outcomes. These features connect model output to a usable workflow. The portfolio does not claim a measured improvement in interview conversion; that would require outcome data and a defined comparison.
My contribution & stack
Sole author — 8-agent AI team manager, AI Systems Architect & Full-stack
- Python
- Flask
- SQLAlchemy
- PostgreSQL
- AI Agents
- Vector Embeddings
- React
- TypeScript
- Ollama
- Gemini / OpenAI / OpenRouter
- Docker
- Jenkins
- SonarQube
The system boundary
The React interface sits above a Flask backend and a PostgreSQL database. The platform supports multiple user accounts and is deployed with Docker. Model routing supports local Ollama and hosted providers. A task such as matching, company research or drafting gets the context it needs; semantic retrieval has its own embedding-model dependency. The admin preview shows model selection and per-feature generation limits.
How it was built
I built JobsResearch with a team of 8 AI agents in builder, reviewer, verifier and coordinator roles, working under a written loop engineering process. From August to October 2026 that came to about 4,700 commits and 1,500 merged pull requests (counted on 9 October 2026). Every code change passes automated tests and a Jenkins + SonarQube quality gate. The counts describe throughput; the tests and the gate are what hold each change to a standard.
What the evidence establishes
Since July 2026 the platform has collected 100,000+ postings from five sources, and 8,000+ have been analysed against a CV. This demonstrates processing scope, not match accuracy. A useful walkthrough should inspect a posting, its score and explanation, and the available follow-up actions together. The repository is private, so a guided walkthrough is the route to deeper implementation review.
Presentation to Metropolia's President and CEO (Oct 2026)
Selected by the School of ICT and Industrial Management as the only student to present in the leadership session. Presented JobsResearch, a job-market platform I built with a team of 8 AI agents, to President and CEO Marko Hakovirta, school leadership and teachers.
Sources & project context
Based on the project workflow and portfolio materials. The repository is private; a walkthrough is available on request.