Entrega técnica · v1

Contratei!, do código à operação —tudo em uma página.

Arquitetura, 63 endpoints REST, modelo de dados, motores psicométricos, fluxos operacionais, feature flags e deploy. Pronto para auditoria, repasse e onboarding técnico.

Endpoints REST
63
Tabelas Postgres
19
Motores psicométricos
3
Docs técnicos
18

Resumo executivo

O que é o Contratei!

Plataforma de recrutamento que une psicometria interna (DISC + Eneagrama + 16P), match com IA e pipeline operacional em uma única tela — para empresas que querem decidir contratação com dados.

Multi-tenant

Isolamento por company_id em todas as queries.

Pipeline ágil

Vaga → candidato → teste → match → contratação.

IA explicável

Match com contexto da empresa, vaga e líder.

Pronto pra LGPD

Consentimento, anonimização e direitos do titular.

Componentes

Arquitetura em blocos

Frontend distribuído em CDN; backend persistente na VPS com fila, banco, storage e provedores externos.

FrontendNEXT.JS 16 · VERCELBackend APIBUN · VPSPostgreSQLDRIZZLE · 19 TABELASRedis + BullMQFILA DE IAS3 / R2PDFS · CVS · LOGOSAnthropicCLAUDE · MATCH

Arraste lateralmente · Frontend em CDN · backend persistente · fila e provedores externos isolados

Escolhas técnicas

Stack & motivo

Cada decisão foi tomada para reduzir custo operacional sem comprometer tipagem nem performance.

Next.js 16

App Router, Server Components, deploy na Vercel.

Bun + TypeScript

Runtime rápido, tipado, simples de operar em VPS.

PostgreSQL + Drizzle

Schema relacional, migrations versionadas, tipagem ponta-a-ponta.

BullMQ + Redis

Fila persistente para match com IA e jobs assíncronos.

Better Auth

Sessão por cookie, email/senha e OAuth Google.

Swagger / OpenAPI

Contrato navegável publicado em produção.

Anthropic Claude

Match, sugestão de descrição e chat com candidato.

S3 + Resend

Storage compatível S3 (PDFs, CVs) + e-mail transacional.

Contrato

63 endpoints REST

Filtre por método, recurso ou busca livre. Clique no path para copiar. Detalhes completos no Swagger.

70 de 70 endpoints

Abrir Swagger
  • GETmeta
    Probe de liveness.
  • GETmeta
    Versão da API.
  • GETmeta
    Feature flags em runtime.
  • GETmeta
    Swagger UI.
  • GETmeta
    Spec OpenAPI.
  • GETauth
    Usuário, empresas, convites pendentes e workspace ativo.
  • POSTauth
    Cria empresa e vincula o usuário como admin.
  • POSTauth
    Define empresa ativa na sessão.
  • GETauth
    Dados da empresa ativa.
  • PATCHauth
    Atualiza empresa ativa.
  • GETauth
    Lista membros e convites (admin).
  • PATCHauth
    Altera papel ou revoga membro (admin).
  • GETauth
    Lista convites pendentes (admin).
  • POSTauth
    Convida membro por e-mail (admin).
  • DELETEauth
    Revoga convite pendente (admin).
  • POSTauth
    Aceita convite e ativa membership.
  • GETauth
    Lookup ViaCEP.
  • GETauth
    Lookup BrasilAPI CNPJ.
  • GETauth
    Árvore da empresa.
  • POSTauth
    Cria nó/colaborador.
  • PATCHauth
    Atualiza nó.
  • DELETEauth
    Remove nó.
  • GETauth
    Perfil psicométrico do colaborador.
  • PUTauth
    Salva perfil do colaborador.
  • GETauth
    Lista vagas da empresa.
  • GETauth
    Detalhe da vaga.
  • POSTauth
    Cria vaga.
  • PATCHauth
    Edita vaga.
  • DELETEauth
    Remove vaga.
  • POSTauth
    Publica vaga (página pública).
  • GETauth
    Candidatos da vaga.
  • GETauth
    Lista candidatos.
  • POSTauth
    Cria candidato.
  • PATCHauth
    Edita candidato.
  • DELETEauth
    Remove candidato.
  • GETauth
    Perfil psicométrico.
  • PUTauth
    Salva perfil.
  • POSTauth
    Anonimização LGPD.
  • POSTauth
    Promove candidato a colaborador.
  • POSTauth
    Cria aplicação manual.
  • GETauth
    Lista aplicações da vaga.
  • PATCHauth
    Move no pipeline.
  • POSTauth
    Gera link de teste.
  • GETauth
    Lista links emitidos.
  • POSTauth
    Reenvia e-mail.
  • POSTauth
    Enfileira match com IA.
  • GETauth
    Status do match.
  • GETauth
    Relatório de match.
  • GETauth
    PDF do relatório.
  • POSTauth
    Envia relatório por e-mail.
  • POSTauth
    Gera descrição da vaga.
  • POSTauth
    Cria thread de chat IA.
  • POSTauth
    Envia mensagem.
  • POSTauth
    Streaming SSE.
  • GETauth
    Lista mensagens.
  • POSTauth
    Chat genérico.
  • POSTauth
    Descrição standalone.
  • POSTauth
    Briefing estruturado.
  • POSTauth
    Presign S3 autenticado.
  • POSTauth
    Reporta erro do front.
  • GETpublic
    Página pública da vaga.
  • POSTpublic
    Presign do CV.
  • POSTpublic
    Candidatura pública.
  • GETpublic
    Carrega teste do candidato.
  • POSTpublic
    Salva progresso.
  • POSTpublic
    Finaliza teste.
  • GETpublic
    Questões dos motores.
  • GETpublic
    Dados do candidato (token).
  • PATCHpublic
    Edita dados (LGPD).
  • DELETEpublic
    Remove dados (LGPD).

Postgres

19 tabelas, 6 domínios

Tudo isolado por company_id. Migrations versionadas pelo Drizzle Kit. SQL consolidado em docs/sql/backend-install.sql.

Auth (Better Auth)

4
  • user
  • session
  • account
  • verification

Tenant

2
  • companies
  • users

Hiring

5
  • organogram_nodes
  • jobs
  • candidates
  • applications
  • application_events

Testes & Resultados

2
  • test_links
  • personality_results

IA & Match

5
  • match_reports
  • ai_prompt_templates
  • ai_runs
  • ai_threads
  • ai_messages

Auditoria

1
  • audit_logs

Operação

3 fluxos críticos

Como o sistema é usado de ponta-a-ponta — do signup até a contratação.

1

Onboarding da empresa

  1. 1Signup via Better Auth (email/senha ou Google).
  2. 2Criação automática da company + tenant.
  3. 3Lookup CNPJ (BrasilAPI) preenche dados.
  4. 4Admin monta organograma e marca a liderança.
2

Vaga → Candidatura → Teste

  1. 1Recrutador cria vaga (IA sugere descrição opcional).
  2. 2Publica → página /vagas/[id] vira pública.
  3. 3Candidato envia CV (presign S3) + dados.
  4. 4Sistema gera test-link com token e dispara e-mail.
  5. 5Candidato responde DISC + Eneagrama + 16P.
3

Match com IA

  1. 1Recrutador aciona match na vaga.
  2. 2BullMQ enfileira job no Redis.
  3. 3Worker monta contexto (vaga, líder, candidato) e chama Claude.
  4. 4Relatório salvo em match_reports; PDF gerado e e-mail enviado.

Psicometria

3 motores, linguagem de RH

Cada motor transforma respostas em indicadores objetivos. Sem termos clínicos — foco em uso profissional.

O que mede

Como a pessoa decide, comunica e reage a mudanças.

Fonte: dzyla/disc-personality-assessment

Abrir fonte

Como responde

119itens

Escala Likert 1–5

  • Dominância
  • Influência
  • Estabilidade
  • Conformidade

O que entrega

Dimensão dominante + secundária, scores 0–100, leitura prática para RH.

Pronto para RH

Os testes são apoio de RH e autoconhecimento. Ajudam a preparar entrevistas e comparar perfis profissionais — não substituem avaliação clínica, psicológica ou terapêutica.

Runtime

Feature flags

Expostas em GET /api/v1/features. Endpoints retornam 503 quando a flag está desligada.

  • Endpoints /api/v1/ai/* e geração de descrição.

  • Enfileiramento BullMQ de match e relatórios PDF.

  • Threads + streaming SSE com Claude.

  • Presign S3 (CV, logo, PDFs).

  • Candidatura pública e página da vaga.

Documentos

18 docs no /docs

Cada arquivo é uma fonte da verdade sobre um aspecto do produto. Os mais importantes ficam destacados.

Operação

Deploy & SQL

Comandos prontos para subir o ambiente do zero. Variáveis em docs/env-vars.md.

Instalar o banco
psql "$DATABASE_URL" -f docs/sql/backend-install.sql
Rodar testes do backend
cd backend
bun test
Subir backend local
cd backend
bun install
bun run dev
Subir frontend local
cd frontend
bun install
bun run dev

Compliance

Segurança & LGPD

Sessão por cookie, tenant isolation, consentimento explícito, anonimização e logs de auditoria.

Better Auth

Cookies httpOnly, SameSite configurável, OAuth Google.

Tenant scope

Toda query autenticada filtrada por company_id.

Anonimização

POST /candidates/:id/privacy zera PII e mantém scores.

Audit logs

Ações sensíveis gravadas em audit_logs com ator.