01Busca Vagas
As vagas de tecnologia de Goiânia e as remotas, num lugar só.
Um robô lê nove plataformas, junta a mesma vaga anunciada em lugares diferentes e deixa tudo pesquisável, com filtro e link para o anúncio original.
Sem IA, por decisão: regra clara, resultado explicável e nenhum custo de modelo.
- Next.js
- Fastify
- PostgreSQL
- GSAP
- Vitest


O problema
Quem procura vaga de tecnologia em Goiânia abre cinco sites por dia e encontra a mesma vaga repetida em três deles. As remotas ficam espalhadas em outros tantos.
O que eu construí
- Coleta automática em nove plataformas, com agenda e ritmo próprios para cada fonte.
- A mesma vaga anunciada em lugares diferentes vira uma só.
- Busca em português que entende acento, com filtro por categoria, salário, modalidade, contrato, nível e cidade.
- Recorte de Goiânia e dos 21 municípios da região metropolitana, mais as vagas remotas do Brasil inteiro.
- Conta de usuário com vagas salvas, currículo em seis modelos com nota de leitura por sistemas de recrutamento e painel de administração.
As telas
Prints do sistema de verdade. Clique numa tela para ver em tamanho real.

Busca: filtros por lugar e área, e cada vaga com a fonte, a data e o link para o anúncio.

Vaga: os detalhes num lugar só, com aviso quando o anúncio está no ar há tempo demais.

Mercado: vagas no ar, empresas, vagas novas da semana e salário mediano, refeitos a cada 10 minutos.

Onde estão as vagas e as tecnologias mais pedidas, contadas no título e na descrição.

Quanto se paga por área: a faixa do meio e a mediana, só onde há salário suficiente.

Calculadora CLT ou PJ: o que sobra de verdade em cada formato, com as tabelas do ano.
Como funciona
Coleta
Um processador lê as fontes na agenda de cada uma e grava o que encontrou numa fila dentro do próprio PostgreSQL.
Limpeza
Cada vaga passa por regras de classificação editáveis no painel e é comparada com as que já existem, para não repetir.
Busca
A API em Fastify responde com busca de texto em português, filtros e paginação.
Site
O site em Next.js mostra tudo, e o botão leva direto ao anúncio original.
Decisões que importaram
Sem IA
Por quê: Classificar vaga é regra, não opinião. Regra escrita é previsível, testável e não custa nada por vaga.
O que coletar é dado, não código
Por quê: Fonte, termo, cidade e ramo ficam em tabelas. Levar o site para outra cidade ou outra área é cadastrar, não programar.
Fila dentro do PostgreSQL
Por quê: Um banco a menos para cuidar. O mesmo padrão já estava provado em outro sistema que eu fiz.
Site e API na mesma origem
Por quê: Sem CORS e com o cookie de sessão protegido. O nginx separa o caminho da API do resto.
O que deu errado
Todo sistema de verdade quebra de algum jeito. Estes foram os tropeços que mais ensinaram, e o que mudou por causa deles.
A coleta rodava, e as vagas novas pararam de chegar
O que aconteceu
Em setembro, a entrada de vagas novas caiu para quase nada sem nenhum erro. Todas as coletas terminavam bem: as buscas cadastradas só reliam sempre o mesmo conjunto.
O que mudou
Passei a vigiar o que entra, e não só se rodou. Hoje há alerta quando as vagas novas do dia caem abaixo de um quarto da média da semana, e cada busca mostra quanto aproveita do que lê.
A página que não existia respondia que existia
O que aconteceu
Uma vaga removida mostrava a tela de não encontrada, mas o servidor respondia 200. Para o Google isso é conteúdo, e num site de vagas, onde anúncio expira toda hora, a busca se enche de página morta.
O que mudou
A tela de carregamento que causava isso ficou só onde serve. E depois de mexer em rota, eu confiro o código de resposta, não só a tela.
Um campo novo derrubou os currículos antigos
O que aconteceu
Acrescentei certificações ao currículo e passei a exigir o campo. Todo currículo gerado antes disso começou a dar erro 500, e o teste passava porque só criava currículo novo.
O que mudou
Campo novo em dado já guardado se completa na leitura. E há um teste que grava o formato antigo à mão e exige que ele abra.
Onde está hoje
No ar desde setembro de 2026, atualizando sozinho.