Hello

Bonjour

Hola

Ciao

你好

こんにちは

Привет

Guten Tag

Olá

Job Tracker

Menu

Job Tracker

Projeto pessoal

2026
Visão geral

Um quadro kanban para candidaturas a vagas. Cada vaga passa por etapas fixas de contratação, com uma linha do tempo e um registro automático no histórico a cada mudança de etapa.

Função e stack

Desenvolvedor full stack

Next.js 14, PostgreSQL, Tailwind CSS, Jest, SWR

A ferramenta pessoal

O Job Tracker é um projeto pessoal open source de 2026 que construí para organizar a minha própria busca de emprego. Ele representa cada vaga como um card que passa por cinco etapas fixas: Interessado, Candidatado, Em processo, Oferta e Encerrado.

Cada card guarda a empresa, o cargo e os detalhes da candidatura, e a página de detalhe combina um formulário editável com um histórico cronológico de eventos. É possível adicionar eventos como entrevistas, e cada mudança de etapa gera automaticamente o próprio registro no histórico.

Detalhe da vaga com a trilha de etapas e a linha do tempo
O que eu construí

Construí o quadro, o fluxo de detalhe da vaga, os eventos manuais e automáticos da linha do tempo e um tema claro e escuro que fica salvo. Também implementei autenticação por e-mail e senha com sessões em cookie guardadas no banco, bcrypt e pepper, além do login com Google por OAuth como segunda opção.

A aplicação usa Next.js 14 com o Pages Router e next-connect, Tailwind CSS na interface e SWR para buscar dados no cliente. Ela é escrita em JavaScript e publicada continuamente na Vercel.

Quadro kanban no tema claro
Domínio e fluxo de dados

O código segue uma estrutura MVC compacta: os models contêm as regras de negócio e o SQL escrito à mão, os controllers ficam em rotas de API versionadas, e as páginas e os componentes renderizam as views. O PostgreSQL é acessado pelo pg sem ORM, com o node-pg-migrate versionando as mudanças de schema e um objeto de erro padrão compartilhado entre os endpoints.

A transição de etapa e o seu registro na linha do tempo são modelados juntos, para que o quadro não mude sem gerar histórico. Isso mantém o estado atual do card e a sua trilha de eventos consistentes, em vez de duplicar a lógica de transição em várias telas.

Tela de login no celular
Detalhe da vaga no celular
Testando a stack real

Desenvolvi a API com TDD, escrevendo os casos de sucesso e de erro antes de cada endpoint. Os testes de integração com Jest chamam um servidor Next.js e uma instância de PostgreSQL reais, levantados pelo Docker, em vez de substituir o banco por mocks.

O pipeline dos pull requests também roda ESLint, Prettier e Secretlint e depois gera deploys de prévia na Vercel. Assim, a autenticação, os erros de banco e o formato exato das respostas da API puderam ser testados com os mesmos componentes usados pela aplicação.

Diálogo de nova vaga
Cada mudança de etapa passa a fazer parte do histórico da aplicação.