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

Admin screen listing the active LLM engine, a model dropdown and per-feature generation limits
Admin · the multi-provider LLM engine behind every feature
  1. Postings + CV
  2. Assess
  3. Explain
  4. Review

The problem

JobsResearch brings job postings from Finnish boards 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. Language requirements can be flagged separately, with an opt-in filter for incompatible postings. 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 — 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 persistent job data. 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.

What the evidence establishes

The portfolio snapshot records approximately 3,600 scraped and LLM-scored postings. 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.

Sources & project context

Based on the project workflow and portfolio materials. The repository is private; a walkthrough is available on request.