Todos os projetos
Full stackEm curso

Job Match Pipeline

Recolhe diariamente ofertas de emprego de várias APIs, remove duplicados e ordena-as face ao meu CV, com embeddings e uma análise de adequação feita por um LLM.
Visão geral

As ofertas de emprego estão espalhadas por várias fontes, a mesma oferta aparece muitas vezes repetida e avaliar se cada uma se adequa leva tempo. Este pipeline recolhe as ofertas todos os dias, junta-as numa lista única e limpa, e ordena-as face ao meu CV, para que as melhores correspondências apareçam primeiro, com uma análise escrita de pontos fortes e lacunas.

Ofertas ordenadas, com filtros e estado da candidatura
Ofertas ordenadas, com filtros e estado da candidatura
Detalhe da oferta: análise de adequação por LLM, acompanhamento da candidatura e pontuação detalhada
Detalhe da oferta: análise de adequação por LLM, acompanhamento da candidatura e pontuação detalhada
Estatísticas: competências mais pedidas, distribuição salarial e ofertas ao longo do tempo
Estatísticas: competências mais pedidas, distribuição salarial e ofertas ao longo do tempo
Perfil: upload de CV com reconhecimento de competências e preferências de correspondência
Perfil: upload de CV com reconhecimento de competências e preferências de correspondência

Como funciona

  1. 1Recolha

    Uma tarefa agendada recolhe diariamente novas ofertas de várias APIs de emprego.

  2. 2Normalizar e deduplicar

    Cada fonte é convertida num único modelo de dados e os duplicados entre fontes são removidos.

  3. 3Filtrar e pontuar

    Filtros obrigatórios eliminam o que não encaixa e subpontuações ponderadas ordenam o resto.

  4. 4Correspondência semântica

    Embeddings de texto (Voyage AI) medem a semelhança entre o CV e a oferta, como uma das subpontuações.

  5. 5Análise por LLM

    Um LLM, via OpenRouter, escreve uma análise de adequação e lacunas para as melhores correspondências.

  6. 6Dashboard

    Um dashboard em Nuxt 4 mostra as ofertas ordenadas, com filtros, acompanhamento de candidaturas, upload de CV e gráficos de estatísticas.

Dashboard
  • Tabela de ofertas ordenadas, com filtros por fonte, localização, modalidade de trabalho, estado da candidatura e senioridade
  • Painel de detalhe com a análise de adequação, o estado, a data e as notas da candidatura, e a pontuação detalhada por categoria
  • Estatísticas das competências pedidas nas ofertas (as minhas vs. outras), distribuição salarial por fonte com conversão de moeda às taxas do BCE, e ofertas ao longo do tempo
  • Upload de CV que reconhece competências e guarda apenas o texto extraído, além de preferências como competências obrigatórias, salário mínimo e localizações aceites
Dados e infraestrutura
  • PostgreSQL no Neon (Postgres serverless), acedido através do Prisma ORM
  • Tarefa agendada do pipeline a correr no Railway
  • Dashboard alojado na Vercel
Testes e CI
  • Testes unitários com Vitest para os parsers, a pontuação e a deduplicação
  • Testes end-to-end no browser com Playwright para o dashboard
  • Ambos correm em CI com GitHub Actions
Stack
TypeScriptNode.jsNuxt 4PostgreSQLPrismaNeonVoyage AIOpenRouterVitestPlaywrightGitHub ActionsRailwayVercel

© 2026 Daniel Paulino • Feito com Nuxt • Atualizado em outubro de 2026