•
4 min de leitura
LangHire: candidaturas que nunca inventam fatos
Fork de um app desktop open source (Tauri + Python) de outro autor. O app original e o CI são dele; esta página cobre só as minhas mudanças.
Python · FastAPI · Playwright · Extensão do Chrome · LLM local (Ollama) · SQLite · Pytest

O LangHire é um app desktop open source que preenche candidaturas a vagas. Fiz um fork para a minha própria busca de emprego e mudei o que eu não aceitaria em uma ferramenta que escreve para empregadores em meu nome. Foram 64 commits entre o fim de outubro e o início de novembro de 2026.

Os modos de falha

Um preenchedor de formulários guiado por um modelo de linguagem falha de três jeitos que importam:

  1. Inventa fatos. Anos de experiência, datas de saída, salários, formação.
  2. Reporta um sucesso que não aconteceu. O formulário foi preenchido, mas o sistema do empregador nunca aceitou.
  3. Trava. Um CAPTCHA ou um desafio de login para uma execução sem supervisão.

O que construí

Respostas verificáveis vêm só de fatos confirmados. Toda pergunta com resposta verificável (datas, formação, documentos, números) é respondida a partir de um fato que eu mesmo confirmei, com a sua origem. Números e biografias inventados pelo modelo são rejeitados. Se falta um fato, a candidatura para e pergunta; ela não chuta. Datas de saída nunca são inventadas, e o campo é pulado quando o cargo está marcado como atual.

Elegibilidade a partir de evidência, não de impressão. Modelo de trabalho e elegibilidade por localização só são decididos a partir de um trecho da vaga. Quando o modelo aponta um trecho, o código primeiro confere se ele aparece mesmo no texto da vaga. Histórico da empresa e letras miúdas do tipo “híbrido ou remoto” não contam como evidência.

Uma candidatura só conta como enviada depois de verificada. O envio só é registrado depois que o sistema do empregador ou um e-mail de confirmação o confirma. Uma tentativa incerta nunca é repetida às cegas. As respostas na caixa de e-mail são classificadas para eu ver quais candidaturas passam da primeira fase.

Uma pessoa onde a plataforma exige. Em plataformas com CAPTCHA, o app preenche o formulário no meu próprio Chrome, por meio de uma pequena extensão, e deixa o CAPTCHA e o clique final em Enviar comigo. As esperas por uma pessoa têm limite de tempo, para que um desafio não trave o resto da fila.

Coleta somente leitura de fontes públicas. As vagas vêm das APIs públicas documentadas de sistemas de recrutamento como Greenhouse, Lever, Ashby, Workable, Recruitee e Cornerstone. Os quadros que eu excluo ficam fora da descoberta, das sugestões e da fila.

Um modelo local para perguntas abertas. Perguntas dissertativas são respondidas por um modelo rodando localmente via Ollama, dentro de um contexto limitado.

Um bug que fiquei feliz de pegar

Certa vez a suíte de testes rodou com a variável do diretório de dados do launcher ainda exportada. Ela sobrescreveu meu perfil e meus fatos reais com dados de teste. Nenhuma candidatura foi enviada, porque a fila estava vazia, e restaurei tudo dos backups. A correção faz o setup dos testes remover essa variável antes de qualquer teste rodar. Provei isso com um diretório-isca que a suíte nunca pode tocar.

O que isso me ensinou

A maior parte da engenharia aqui é recusar-se a agir: não responder sem um fato, não contar um envio sem prova, não repetir sem saber o que aconteceu. É a mesma disciplina que aplico em integrações de produção.