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:
- Inventa fatos. Anos de experiência, datas de saída, salários, formação.
- Reporta um sucesso que não aconteceu. O formulário foi preenchido, mas o sistema do empregador nunca aceitou.
- 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.