Olá, eu sou

Enzo Terra

Desenvolvedor Fullstack · Frontend · IA

Construo sistemas e soluções que resolvem problemas reais, do backend à interface, com cuidado no design e uma camada de inteligência quando ela faz diferença.

role para explorar

01 · sobre

Prazer, Enzo.

Foto de Enzo Terra
Campo Grande · MS

Sou desenvolvedor em Campo Grande/MS, graduado em Sistemas da Informação. Minha base é o frontend: é onde tenho mais experiência, unindo desenvolvimento a design, UI/UX e identidade visual. Em cima disso construí um perfil fullstack, que hoje vai do backend à infra.

Atuo na UFMS, onde passei do suporte técnico para a equipe de inovação da DIDIA (Diretoria de Inovação e Inteligência Artificial) e, de lá, me tornei gerente substituto da GERIA, a gerência de inteligência artificial dentro da DIDIA. No caminho, construí sistemas inteiros (alguns sozinho) que estão em produção sendo usados todos os dias.

Em paralelo, desenvolvo projetos próprios e presto serviços para empresas: sites, sistemas sob medida e soluções com IA. Já coloquei no ar sites para clientes reais, e gosto de entregar coisas que funcionam de verdade, com testes, segurança e um cuidado honesto com quem vai usar.

19+

sistemas completos já entregues

3+

anos construindo software profissionalmente

Automação

foco atual em automações, integrações e sistemas inteligentes

02 · experiência

A trajetória até aqui

De manutenção de hardware à gerência de uma equipe de IA. Cada fase me ajudou a construir o que sei hoje.

※ Os sistemas listados são apenas uma amostra do que desenvolvi; escolhi os que considero mais relevantes.

  1. jul 2022 a fev 2023

    Técnico de manutenção

    Terceirizada da Positivo Tecnologia

    Onde tudo começou: manutenção de equipamentos. Aprendi na prática hardware e suporte, consertando computadores, notebooks e celulares, fazendo atendimentos presenciais em órgãos públicos e empresas privadas que utilizavam tecnologia da Positivo.

  2. fev 2023 a meados de 2024

    Suporte técnico (concursado)

    UFMS · Universidade Federal de Mato Grosso do Sul

    Um ano e meio no suporte, mas além de só atender chamados, comecei a automatizar o que travava o nosso dia a dia e a desenvolver o que poderia nos ajudar. Por mais que a Agetic (agência de tecnologia da UFMS, onde eu trabalhava) tinha uma equipe própria de desenvolvimento, o foco em estudantes não permitia que desenvolvessem sistemas para outras áreas. Aqui comecei a ter a oportunidade de construir sistemas e fluxos funcionais para a universidade.

    WhatsApp ↔ GLPI

    Integração entre o atendimento por WhatsApp e o GLPI, unificando os canais de suporte em um fluxo só.

    IntegraçãoGLPIWhatsApp

    Rádio UFMS

    Sistema implantado para a rádio da universidade, com melhoria de uso pela equipe responsável e a liberdade de transmitir um evento de qualquer lugar por meio de canais seguros.

    Fullstack

    Forms inteligentes

    Formulários inteligentes que resolviam chamados de suporte no GLPI automaticamente, sem precisar de um humano no fluxo.

    AutomaçãoGLPI
  3. meados de 2024 a 2025

    Desenvolvedor · equipe de inovação

    DIDIA · Diretoria de Inovação e Inteligência Artificial (UFMS)

    A partir da disposição de construir sistemas que pudessem resolver problemas reais (e aqui agradeço muito quem me ajudou a ter essa oportunidade), participei da formação de uma nova equipe: a equipe de inovação, onde o objetivo era criar soluções inovadoras para a universidade e para a sociedade. Aqui desenvolvi sistemas inteiros, às vezes sozinho, do design ao deploy. Nessa equipe, a experiência aumentou muito: desenvolvemos scripts, softwares, plugins, IA, usando ferramentas modernas e às vezes até criando novas, permitindo criar sistemas completos que não existiam em outros lugares (realmente inovação). Só nesse período foram 12 sistemas em 1 ano! Junto vieram logos, identidades visuais e frontends para diversos outros projetos. Abaixo, alguns dos que considero mais relevantes.

    ★ projeto destaque
    Logo GLPI.IA

    GLPI.IA

    Plugin com camadas de IA para o GLPI: classificação automática de chamados, balanceamento de carga entre técnicos, sugestões inteligentes de resposta, chatbot com base de conhecimento e análise de sentimento. Desenvolvido por mim, com ajuda de sugestões de colegas mais experientes em IA.

    Gerou artigos para a comunidade de TI e virou tema de palestra (inclusive apresentada por mim) em um evento de tecnologia entre instituições.

    IANLPGLPIAnálise de sentimento
    Logo Visão UFMS

    Visão UFMS

    Central de segurança inteligente: guardas virtuais, alertas inteligentes, mosaicos de câmeras e visão computacional.

    Visão computacionalIATempo real
    Logo Acesso UFMS

    Acesso UFMS

    Gestão de fechaduras eletrônicas em toda a universidade: permissões de acesso, logs, chaves NFC e mais.

    IoTNFCControle de acesso
    Logo Loja UFMS

    Loja UFMS

    E-commerce institucional da UFMS.

    E-commerceFullstack
    Logo Recepção UFMS

    Recepção UFMS

    Sistema em formato de jogo para a recepção de calouros, com premiações, rankings e fluxo seguido por mapa.

    Gamificação

    Jogos para eventos

    Jogos de formatos variados para eventos da universidade, incluindo desenvolvimento em Unity.

    UnityJogos
  4. 2025 · atual

    Gerente substituto

    GERIA · Gerência de Inteligência Artificial (dentro da DIDIA · UFMS)

    Hoje atuo como gerente substituto da GERIA, a gerência de inteligência artificial dentro da DIDIA, onde criamos soluções e sistemas inovadores para a universidade. Uno o que aprendi construindo com a responsabilidade de ajudar a guiar um time.

03 · projetos

Coisas que construí por conta própria

Projetos pessoais e de clientes, do zero ao deploy, cada um com um problema real por trás.

Logo Claude Project Builder

Claude Project Builder

★ destaque

Um time de agentes de IA que constrói software da ideia ao código

Plugin open source para o Claude Code que conduz um projeto da ideia ao código executável através de agentes específicos: analista de ideias, desenvolvedor de inovação, escritor de plano, designer, devs de backend/banco/frontend/IA, infra e segurança. Dimensiona o porte do projeto, usa apenas os agentes necessários, pensa em segurança desde o início e é retomável entre sessões: orquestração de múltiplos agentes e engenharia de prompt na prática.

Claude CodeAgentes de IAPrompt engineering

Construtor de Projetos — uma lâmpada, da ideia ao código

Construtor de Projetos

Um plugin do Claude Code que conduz um software da ideia ao código executável,
através de um time de papéis seniores — sem cerimônia a mais nem segurança a menos.

analista de ideias · desenvolvedor de ideias · escritor de plano · designer · dev backend · dev banco · dev frontend · dev IA · analista de infra · analista de segurança


Você descreve uma ideia. O plugin conversa para entendê-la de verdade, escreve um plano de implementação dimensionado ao porte do projeto e então constrói o sistema — com testes, segurança em todas as camadas e um caminho claro de “como rodar”. Tudo em português, registrado em arquivos no seu repositório, e retomável em outra sessão.

Pensado tanto para uso real quanto como peça de portfólio: demonstra orquestração de múltiplos agentes, engenharia de prompt e práticas modernas de engenharia de software.

⚡ Início rápido

1. Instale (no Claude Code, dentro de qualquer projeto):

/plugin marketplace add enzoterra/claude-project-builder
/plugin install project-builder@claude-project-builder

2. Construa — no projeto onde quer o sistema, descreva a ideia:

/construir-projeto um app para a fila de espera do meu consultório

Pronto. O orquestrador assume a partir daí e conduz as fases, parando para sua aprovação ao fim de cada uma. Você não precisa saber de stack, infra ou arquitetura — ele pergunta o que precisar e recomenda quando você não souber.

Só quer planejar? Use um papel isolado: /analista-de-ideias (brainstorming) ou /escritor-de-plano (documentação técnica). Retomar mais tarde? É só rodar /construir-projeto de novo no mesmo projeto — ele lê o progresso e continua de onde parou.

✨ O que o torna diferente

  • 🧭 Entende a ideia antes de codar. A descoberta não é um formulário: o analista reformula o que entendeu para confirmar, investiga o porquê por trás do pedido (a necessidade real, não só a solução imaginada), lida com respostas vagas ou contraditórias e calibra a linguagem ao seu nível técnico. E um desenvolvedor de ideias dedicado pesquisa o que projetos parecidos fazem e propõe inovações — para o produto e para cada fluxo — com impacto e esforço medidos, pra você decidir.
  • 🧩 Serve a qualquer tipo de projeto. Além do porte, ele detecta a forma do sistema — app fullstack, API sem interface, CLI, biblioteca, projeto de dados/IA/ML (ex.: só Python) — e liga/desliga papéis: sem interface não há design nem frontend; sem persistência não há banco.
  • 🤖 Engenheiro de IA quando faz sentido. Se IA é parte significativa do produto ou dos fluxos, um dev de IA assume a camada de inteligência — escolha de modelo, prompts, RAG/agentes, evals, guardrails, custo e a segurança específica de IA (prompt injection, vazamento de dados). Uma chamada trivial a um modelo continua com o backend — sem peso extra.
  • 🎨 Design antes do código. Quando há interface, um designer desenha o sistema de design (tipografia, cores/tokens, ícones, botões, cards, border-radius, estados) e um mockup de referência — e o frontend implementa fiel a isso. O design desenha; o frontend desenvolve.
  • 📐 Proporcionalidade (right-sizing). Nem todo projeto é corporativo. Ele detecta o porte (enxuto / padrão / robusto) e dimensiona tudo: um protótipo pessoal não carrega Docker, CI nem nove documentos — só o que faz sentido. Sempre com um mínimo inegociável (sem segredos no código, entrada validada, funciona, tem “como rodar”).
  • 🛡️ Segurança e testes por design. Em projetos de produção, segurança e testabilidade são projetadas desde o início (modelo de ameaças, OWASP, authn/authz anti-IDOR, pirâmide de testes, gates de CI) — não viram uma sprint jogada no fim. E um analista de segurança dedicado audita o código de backend e frontend contra as ameaças atuais, conduzindo a correção até zerar falhas altas/críticas.
  • 🔄 Retomável entre sessões. O progresso é um checkpoint vivo: status por sprint e passos concluídos, escritos a cada etapa. Feche o terminal hoje, continue amanhã noutra máquina — nada se perde.
  • 🆕 Stacks modernas e seguras. Antes de fixar qualquer versão de linguagem/framework/lib, ele pesquisa a versão estável atual — nunca confia na memória.
  • ▶️ Pronto para rodar. Quando há Docker/produção, entrega docker compose up + seed de demonstração (com usuários de exemplo) + README de como rodar localmente.

🤝 Você é o cliente

O plugin funciona como uma empresa de software atendendo você: cada papel é um profissional sênior, e você é o cliente que aprova as decisões que importam.

  1. Você conta a ideia. O analista de ideias conversa, entende a necessidade real e, com o desenvolvedor de ideias, traz alternativas e inovações (medidas por impacto × esforço). → Você decide o que entra.
  2. O time monta o plano. O escritor de plano conversa com os devs que vão executar para achar a melhor solução, e tira suas dúvidas quando precisa. → Você aprova o plano.
  3. O time executa. Os especialistas constroem por sprints. Eles não te interrompem a cada passo — só pedem aprovação nos marcos que importam (a direção visual antes de codar a tela, o primeiro fluxo funcionando) e quando surge uma decisão de verdade.
  4. Você valida a entrega. No fim (UAT), você percorre cada fluxo e confirma que atende ao que pediu. Ajustes voltam para o time. → Só é “pronto” quando você aprova.

Os pontos de aprovação são proporcionais: num protótipo enxuto o time confirma só o essencial; num produto de produção há mais checkpoints. Você é incomodado onde sua opinião muda o resultado — não mais.

🧠 Como funciona

O orquestrador construir-projeto conduz quatro fases, delegando a cada especialista:

  💡 Descoberta  →  📝 Planejamento  →  🏗️ Implementação (por sprints)                              →  ✅ Validação
   (entender)        (documentar)         (infra → banco → backend → IA → design → frontend → segurança)   (UAT: validar com o cliente)

A trilha de implementação se adapta à forma do projeto: papéis sem camada correspondente (design e frontend num projeto sem UI, banco num projeto sem persistência, IA quando não há inteligência no produto) simplesmente não entram.

O estado não vive na conversa — vive em arquivos docs/projeto/ do seu repositório. É isso que permite aos subagentes (que começam sem contexto) e a sessões futuras retomarem o trabalho:

ArquivoO que guarda
00-descoberta.mdA ideia entendida: necessidade real, perfil, usuários, restrições
01-plano.md09-operacao-e-deploy.mdPlano completo (conforme o porte e a forma): requisitos, arquitetura, banco, sprints, user stories, testes, segurança, operação
10-design.md (+ design/mockup.html)Sistema de design, quando há interface: tipografia, cores/tokens, ícones, componentes, estados
PADROES.mdOs padrões transversais adaptados ao projeto
PROGRESSO.mdCheckpoint vivo: status de cada sprint e passos concluídos

👥 Os papéis

PapelTipoO que faz
analista-de-ideiasskillBrainstorming interativo: necessidade real, porte, tipo/forma do projeto, usuários, dados, segurança, infra, design, inovações. Confirma o entendimento e recomenda quando você não sabe.
desenvolvedor-de-ideiassubagentePesquisa o que projetos parecidos fazem e propõe ideias inovadoras — para o produto e para cada fluxo — com impacto e complexidade medidos. Trabalha junto da analista; você decide o que entra.
escritor-de-planoskillPlano dimensionado ao porte e à forma: objetivos, requisitos (F/NF), arquitetura e stack (versões pesquisadas), banco, sprints, user stories, testes, segurança e operação. Consulta os especialistas para avaliar viabilidade e alternativas antes de fixar.
designersubagenteSistema de design (só se houver interface): tipografia, cores/tokens, ícones, botões, cards, border-radius, estados — e um mockup de referência. O design desenha; o frontend desenvolve.
dev-backendsubagenteAPI, regras de negócio, authn/authz e segurança rota a rota, testes.
dev-banco-de-dadossubagenteSchema, migrações, índices e seed de demonstração.
dev-frontendsubagenteUI moderna, limpa e responsiva, acessível, fiel ao sistema de design, com validação de entradas, integração com a API e testes.
dev-iasubagenteCamada de inteligência quando há IA central: seleção de modelo, prompts versionados, RAG/agentes, evals, guardrails, custo/latência e segurança de IA (prompt injection, vazamento, OWASP LLM). Também lidera pipeline de ML quando o projeto desenvolve modelo.
analista-de-infrasubagenteEsqueleto, Docker/compose, config por env, CI e o caminho “como rodar”.
analista-de-segurancasubagenteAuditoria adversária de backend e frontend contra todas as vulnerabilidades da stack (pesquisando ameaças atuais), conduzindo a correção até zerar falhas altas/críticas.
construir-projetoskill (orquestrador)Conduz todas as fases, dimensiona ao porte e delega aos especialistas.

Todos atuam como seniores na linguagem e framework que você pedir.

📐 Perfis de projeto

O porte é decidido com você na descoberta e respeitado por todos os papéis:

PerfilPara quêO que entrega
EnxutoScript, protótipo, ferramenta pessoal, trabalho de faculdade, MVP de validaçãoRoda local direto, plano leve (1 doc), sem cerimônia. Foco em funcionar rápido.
PadrãoProduto real com usuários, vai a produçãoDocker + seed demo, CI, testes, segurança sólida, plano dividido.
RobustoSistema empresarial ou de missão críticaTudo: observabilidade, SLO, DR, DevSecOps, compliance, multi-ambiente.

🗂️ Estrutura do plugin

.claude-plugin/
  plugin.json          # manifesto do plugin
  marketplace.json     # catálogo (permite adicionar este repo como marketplace)
skills/
  construir-projeto/   # orquestrador + referencia/padroes.md (padrões transversais)
  analista-de-ideias/  # descoberta interativa
  escritor-de-plano/   # planejamento + templates/
agents/
  desenvolvedor-de-ideias.md   designer.md
  dev-backend.md   dev-banco-de-dados.md   dev-frontend.md   dev-ia.md
  analista-de-infra.md   analista-de-seguranca.md

📦 Instalação (detalhes)

Via marketplace (recomendado) — funciona em qualquer projeto após adicionado:

/plugin marketplace add enzoterra/claude-project-builder
/plugin install project-builder@claude-project-builder

(ou aponte para a URL: /plugin marketplace add https://github.com/enzoterra/claude-project-builder)

Importante: Se os comandos desse plugin não aparecerem no Claude Code Desktop App após a instalação, pode ser necessário encerrar o Claude (inclusive pelo ícone da bandeja do sistema, no Windows) e iniciar novamente.

Clonando localmente — útil para inspecionar ou ajustar antes:

git clone https://github.com/enzoterra/claude-project-builder
/plugin marketplace add ./caminho/para/claude-project-builder
/plugin install project-builder@claude-project-builder

Requisitos

  • Claude Code atualizado (suporte a plugins e skills).
  • Um repositório git no projeto-alvo (o plugin oferece git init se não houver).

👤 Autor

Enzo Andrade Terra · enzoterra18@gmail.com

Licença

MIT

Logo MemoryGarden

MemoryGarden

Memoriais digitais para homenagear quem partiu

Plataforma onde famílias criam memoriais com biografia, fotos, linha do tempo e outras informações importantes. Amigos homenageiam comprando coroas de flores digitais, e 90% do valor vai para uma instituição de caridade escolhida pela família. Funerárias exibem os memoriais em TVs e tablets, mostrando quem homenageou sem expor valores. Tudo desenhado com delicadeza, transmitindo esperança e calma em um momento difícil.

Next.jsNestJSPostgreSQLTypeScript
código privado
Logo Achei Meu Pet

Achei Meu Pet

Rede comunitária para reunir pets perdidos com seus donos

Plataforma geoespacial que centraliza o que hoje se perde em dezenas de grupos de WhatsApp: feed regional por raio real (PostGIS), match automático entre perdidos e encontrados, contato intermediado contra golpes, cartaz com QR Code e privacidade por arquitetura (EXIF removido, endereços nunca expostos). ~95 testes de backend, E2E com Playwright e teste de carga com k6.

DjangoPostGISReact 19CeleryDocker
código privado
Logo Achei Meu Pet

Achei Meu Pet

Plataforma web comunitária para reunir animais perdidos com seus donos, usando a própria vizinhança como rede de busca — pensada para o Mato Grosso do Sul e desenhada mobile-first, para quem cadastra na rua, com uma mão e pressa.

Projeto full-stack completo (backend geoespacial, SPA, infra, CI e testes), construído do zero em sprints. A visão, o modelo de dados e o detalhamento de cada sprint estão em PLANO_ACHEI_MEU_PET.md.


O problema e o objetivo

Quando um animal some, o tempo é tudo — e a informação está fragmentada em dezenas de grupos de WhatsApp. O Achei Meu Pet centraliza isso num feed regional e tenta fechar o ciclo perdido → encontrado com o mínimo de fricção.

A métrica-norte (North Star) do produto é o tempo médio até o primeiro contato qualificado: quanto tempo, depois de um pet ser publicado, até alguém abrir uma conversa sobre ele. O sistema instrumenta essa métrica de ponta a ponta.

Princípios de produto (inegociáveis)

  1. Ver antes de cadastrar — o visitante anônimo vê o feed na hora, sem login.
  2. Login só onde há razão técnica — exigido para publicar (filtro regional, throttling, responsabilização), nunca como pedágio.
  3. Privacidade por padrão — o endereço do usuário nunca é exposto; localização de pets é sempre aproximada.
  4. Clareza acima de completude — cada tela tem um trabalho só.

Principais funcionalidades

  • Feed público regional — qualquer pessoa vê animais encontrados perto de si, sem login, filtrando por raio real (km) e por tipo (perdidos / encontrados / todos).
  • Publicação de perdidos e encontrados — 1–6 fotos, espécie, porte, cores, sexo, data, situação e localização aproximada, com upload resiliente.
  • Match automático geoespacial — publicar um perdido dispara, em background, a comparação com os encontrados compatíveis na região e notifica o dono.
  • “Reconheci este animal” → contato intermediado — abre uma conversa sem expor telefone/e-mail de nenhuma das partes.
  • Cartaz com QR Code — gera um cartaz (PDF/PNG) do pet perdido para impressão e compartilhamento, com QR apontando para a página pública (sem contato pessoal).
  • Compartilhamento para WhatsApp com card rico (Open Graph).
  • Alertas regionais — o usuário define um raio e é avisado de novos animais na sua área (com opt-out).
  • Ciclo de vida do post — status (ativo/resolvido/expirado), expiração automática em 30 dias com avisos em D-3/D-1 e renovação em 1 clique.
  • Perfil completo + LGPD — meus posts, notificações, preferências, exportação e exclusão de dados.

Destaques de engenharia

O que torna o projeto interessante além da lista de telas:

🔒 Privacidade por design (não como recurso, como arquitetura)

  • A coordenada real de um pet e o endereço do usuário ficam em campos que a API pública nunca serializa — só o rótulo aproximado (bairro) sai.
  • EXIF removido de toda foto no upload (a imagem é re-encodada), então o GPS embutido na câmera nunca vaza.
  • Contato sempre intermediado — mensageria interna, mitigando o golpe clássico do “achei seu pet”. E-mail/telefone são redigidos automaticamente nas mensagens.
  • Testes de segurança dedicados garantem essas invariantes (IDOR, vazamento de PII, upload malicioso) e rodam no CI a cada push.

🗺️ Geoespacial de verdade (PostGIS, não cálculo no app)

  • Filtro por raio com ST_DWithin sobre coluna geography indexada (GIST) — comparação em metros, sem trazer a tabela inteira para a aplicação.
  • Heurística de matching com score (espécie + porte + janela de datas + sobreposição de cores + distância), persistida e idempotente (não re-notifica o mesmo par), rodando assíncrona no Celery.

🎨 Identidade com intenção

  • O contador “X dias procurando”, em âmbar, é o elemento de assinatura: ele transforma um dado frio (data do sumiço) em tensão que move a comunidade.
  • Decisão de cor justificada: urgência em âmbar/terracota, nunca vermelho (vermelho amplifica pânico); verde reservado só para resolução.

🛡️ Decisões de stack defensáveis

  • Auth por sessão (cookie httpOnly + SameSite + CSRF) em vez de JWT no localStorage — imune a roubo de token por XSS.
  • Sem SSR/Next.js: o único caso que exigiria SSR (cards Open Graph do WhatsApp) é resolvido por um endpoint dedicado que server-renderiza só as meta tags.
  • Cloudflare R2 para imagens (sem egress fee), via interface S3-compatível.

📈 Observabilidade e operação

  • Métrica North Star instrumentada (persistida por pet + endpoint agregado + log).
  • Healthcheck (banco + Redis), logs estruturados em JSON opcionais, integração com Sentry, backup do Postgres com runbook de restauração testado.

✅ Qualidade levada a sério

  • ~95 testes de backend (regras de negócio, autorização, segurança) + testes de frontend (componentes, acessibilidade com axe).
  • E2E (Playwright) dos fluxos críticos e teste de carga (k6) do feed e da publicação, com thresholds de latência/erro.
  • CI (GitHub Actions) com lint, format, testes e build obrigatórios.

Stack e arquitetura

CamadaTecnologia
BackendDjango 5 + DRF + GeoDjango/PostGIS (Python 3.12)
BancoPostgreSQL 16 + PostGIS
FrontendReact 19 + Vite + TypeScript, Tailwind v4, shadcn/ui
AssíncronoCelery + Redis (matching, e-mails, expiração)
StorageCloudflare R2 (S3-compatível)
EdgeCaddy (TLS automático, reverse proxy, headers de segurança/CSP)
InfraDocker Compose (single-host)
CI / ErrosGitHub Actions · Sentry
                 Internet

                 ┌──┴──┐
                 │Caddy│  TLS automático, reverse proxy, CSP
                 └──┬──┘
        ┌───────────┼───────────────┐
   app (SPA estático)        api (Django/gunicorn)

                  ┌────────────────┼─────────────────┐
            PostgreSQL+PostGIS   Redis        Celery worker + beat

                          Cloudflare R2 (imagens)

Modelo de dados (resumo)

User (com localizacao/endereco privados) · Pet + PetFoto (UUID, coordenada real indexada vs. rótulo exibível) · Match (auditável) · Conversa + Mensagem (contato intermediado) · Notificacao · PrimeiroContato (North Star). Detalhes no plano.


Estrutura do repositório

backend/    Django + DRF (API, settings base/dev/prod, Celery, ~95 testes)
frontend/   React 19 + Vite SPA (Tailwind v4, tokens de design, Playwright e2e)
infra/      Caddy (edge), backup/restore do Postgres, testes de carga k6
.github/    GitHub Actions (CI + E2E manual)

Rodando localmente

Pré-requisitos

Docker + Docker Compose, ou Python 3.12 + Node 24 para rodar fora de container.

Demonstração rápida (recomendado)

Sobe a stack completa em modo de desenvolvimento (HTTP puro, hot-reload, sem TLS) já populada com dados de exemplo — nenhum .env necessário:

docker compose -f docker-compose.local.yml up --build

Na subida, o comando manage.py seed_demo cria usuários, posts de perdidos e encontrados (com fotos geradas), matches, notificações e uma conversa intermediada. Login sugerido para explorar tudo:

e-mailsenha
ana@demo.acheimeu.petdemoAcheiPet1

O seed é idempotente: rode docker compose -f docker-compose.local.yml exec api python manage.py seed_demo quando quiser recriar os dados. E-mails (ex.: verificação, match) saem no console do container api.

Produção (Docker + Caddy/TLS)

cp backend/.env.example backend/.env   # ajuste SECRET_KEY etc.
cp .env.example .env
docker compose --env-file backend/.env up --build

Backend sem Docker

cd backend
python -m venv .venv && . .venv/Scripts/activate   # Windows
pip install -r requirements-dev.txt
cp .env.example .env
python manage.py migrate
python manage.py runserver        # http://localhost:8000/api/health

GeoDjango exige as libs GDAL/GEOS/PROJ instaladas no sistema.

Frontend sem Docker

cd frontend
npm install
npm run dev        # http://localhost:5173 (proxy /api -> :8000)

Testes e qualidade

# Backend
cd backend && pytest && ruff check . && black --check .

# Frontend (unit + componentes + acessibilidade)
cd frontend && npm test && npm run lint && npm run build

.github/workflows/ci.yml roda em cada push/PR (lint, testes, build). Os testes E2E rodam sob demanda em .github/workflows/e2e.yml. Nenhum merge sem CI verde.


Observabilidade e LGPD

  • Healthcheck: GET /api/health (banco + cache/Redis).
  • North Star (tempo até o primeiro contato qualificado): GET /api/metrics/north-star (staff) + log estruturado. Logs em JSON via LOG_FORMAT=json.
  • Exportação de dados: GET /api/auth/me/exportar. Exclusão: DELETE /api/auth/me.
  • Política de privacidade na rota /privacidade, linkada do cadastro.

Roadmap (pós-MVP)

Camada de IA, sempre como assistente e nunca como autoridade em casos sensíveis: moderação de imagens/texto com revisão humana, similaridade visual por embeddings, coleira QR preventiva, parceiros verificados (clínicas/ONGs) e mapa interativo com pontos ofuscados por jitter. Detalhes na §10 do plano.


Backup, restore e segredos

Scripts em infra/backup/; o procedimento de restauração — que deve ser testado, não só configurado — está em RESTORE_RUNBOOK.md. Nunca commitar .env; veja *.env.example para a lista de variáveis.

Logo Buraco Zero

Buraco Zero

Plataforma cívica para mapear e gerir o conserto de buracos

Do relato anônimo do cidadão (em menos de 15 segundos, estilo Waze) à confirmação do conserto pela prefeitura, com painel público de transparência. Deduplicação geoespacial com PostGIS, máquina de status com histórico imutável, conserto em lote com staging transacional e 141 testes automatizados.

DjangoPostGISReactMapLibre
código privado
Logo Buraco Zero

Buraco Zero

Plataforma colaborativa para mapear e gerir o conserto de buracos em vias públicas — do relato anônimo do cidadão à confirmação do conserto pela prefeitura, com transparência pública. Caso de uso: Campo Grande/MS.

Stack: Django 5 · DRF · GeoDjango/PostGIS · React 18 · Vite · MapLibre · Docker Qualidade: 141 testes automatizados (96 backend / 45 frontend) · revisão de segurança §9/OWASP · CI-ready Status: MVP completo (Sprints 0–7) · pronto para deploy


🖼️ Interface

Identidade visual “asfalto” — grafite escuro + âmbar de marca (Tailwind v4 + shadcn/ui). O app do cidadão é mobile-first: mapa em tela cheia, pins por forma + cor segundo o status, e relato de baixo atrito — posicionar o pino e confirmar.

App do cidadão — mapa com clusters por status    Cidadão posicionando o pino do buraco

Cidadão — mapa com clusters por status · arraste o pino até o buraco e confirme.

Painel da prefeitura (desktop), com a visão certa por papel:

Painel de gestão da prefeitura
Gestão — mapa, filtros e lista priorizada por urgência.
Conserto com staging
Conserto com staging — polígono, rua ou clusters → revisão.

Login da prefeitura
Login da prefeitura — acesso restrito por papel (JWT).

Capturas da stack de demonstração (compose.local.yml) com dados de exemplo em Campo Grande/MS.


🎯 O problema

Buracos em vias públicas são reportados de forma dispersa (redes sociais, telefone, ouvidoria), sem geolocalização agregada. A prefeitura não tem um canal único para visualizar, priorizar e acompanhar consertos. O Buraco Zero centraliza esse ciclo de vida em uma plataforma só, com três públicos:

PúblicoO que faz
👤 Cidadão (anônimo)Registra um buraco em < 15s, sem cadastro (UX referência: alerta do Waze). Foto opcional.
📊 Analista (prefeitura)Prioriza por urgência, filtra, avança status, exporta dados.
🛠️ Funcionário de campoMarca consertos (polígono/rua/clusters), revisa e confirma em lote.
🌐 PopulaçãoPainel público de transparência (consertos, tempo médio, por bairro).

🚀 Demo local em um comando

Pré-requisito: Docker + Docker Compose. Na raiz do repositório:

docker compose -f compose.local.yml up --build

Sobe a stack inteira (PostGIS + Django + PWA atrás do nginx), migra o banco e popula dados de demonstração automaticamente. Depois abra:

👉 http://localhost:8080

RotaO que ver
/App do cidadão: mapa com clusters coloridos por status, botão “Relatar buraco”.
/painelTransparência: métricas e recorte por bairro.
/adminPainel da prefeitura (login abaixo).

Credenciais de demonstração (papéis distintos mudam a experiência):

PapelLoginSenha
Adminadmin@cg.ms.gov.brdemo12345gestão + conserto + arquivar
Analistaanalista@cg.ms.gov.brdemo12345mapa, lista, filtros, status, exportar
Campocampo@cg.ms.gov.brdemo12345conserto com staging (3 métodos)

Encerrar: docker compose -f compose.local.yml down -v.

Diferente do backend/docker-compose.yml (só backend, para desenvolvimento), o compose.local.yml entrega o sistema completo em uma URL, como em produção, mas sem TLS e com dados de exemplo.


✨ Funcionalidades

  • Registro de baixa fricção — o relato é persistido no instante da confirmação; a foto é um enriquecimento assíncrono que nunca bloqueia o fluxo crítico.
  • Deduplicação geoespacial — relatos do mesmo buraco (dentro de um raio) viram um único cluster, a unidade de gestão da prefeitura. Query PostGIS com índice espacial, não cálculo em Python.
  • Clustering visual — Supercluster agrupa pins por zoom, mantendo o mapa legível.
  • Máquina de status com transições validadas no servidor e histórico imutável (base das métricas de SLA).
  • Conserto com staging — o funcionário acumula consertos como rascunho, revisa (clusters em verde) e confirma; só então fecham, em uma transação atômica e idempotente. Três métodos: desenho de polígono, rua e seleção de clusters.
  • Transparência pública — total de consertos, tempo médio de resolução, consertos nos últimos 30 dias e recorte por bairro.
  • Exportação CSV/GeoJSON e arquivamento em lote de relatos expirados.
  • PWA instalável, com cache do último estado do mapa para visualização offline.

🧠 Destaques de engenharia

O que este projeto demonstra além de CRUD:

  • Geoespacial de verdade: GeoDjango + PostGIS com distance_lte/intersects sobre campos geography, índice GIST, e testes rodando contra PostGIS real (não SQLite — queries espaciais não têm equivalente e dariam falso verde).
  • Modelagem orientada ao domínio: o cluster (não o relato) é a entidade central; StatusHistory é append-only; MaintenanceZone nasce como rascunho.
  • Integridade transacional: o commit de consertos é tudo-ou-nada e idempotente (cluster já fechado entre o rascunho e o commit é ignorado sem erro) — coberto por teste que simula falha no meio e verifica o rollback.
  • Segurança desde o primeiro commit: rate limiting no endpoint anônimo, hash salgado de IP (LGPD), strip de EXIF nas fotos, JWT por papel com lockout no login, headers seguros e uma revisão §9/OWASP. Cada feature tem teste de permissão (401/403) e de caminho de abuso.
  • Testes como contrato: 141 testes cobrindo dedup, transições, staging, auth, filtros e os caminhos de risco — não cobertura cega.
  • Acessibilidade: status indicado por forma + cor (não só cor), alvos de toque de 44px, contraste WCAG AA, prefers-reduced-motion.

Um bug real encontrado e corrigido durante o desenvolvimento: o ?format= do endpoint de exportação colidia com a negociação de conteúdo do DRF, devolvendo 404 antes da view rodar — resolvido com URL_FORMAT_OVERRIDE=None. Documentado no código.


🏗️ Arquitetura

                    ┌─────────────────────────── nginx ───────────────────────────┐
   Cidadão ─────────│  /            → PWA (React/Vite, estático)                    │
   Prefeitura ──────│  /api, /admin → proxy → gunicorn + Django/DRF                 │
                    │  /static,/media → volumes                                    │
                    └───────────────────────────────┬──────────────────────────────┘

                                       ┌─────────────▼─────────────┐
                                       │   Django + GeoDjango       │
                                       │   (dedup, staging, auth,   │
                                       │    stats, jobs de cron)    │
                                       └─────────────┬─────────────┘

                                       ┌─────────────▼─────────────┐
                                       │   PostgreSQL 16 + PostGIS  │
                                       └───────────────────────────┘

Decisões registradas em DOCUMENTACAO_SISTEMA.md (a fonte de verdade do produto): por que cluster é a entidade central, dedup em duas camadas, staging no servidor, expiração como flag visual, e mais.


🧩 Stack e estrutura

CamadaTecnologias
BackendDjango 5, DRF, GeoDjango, simplejwt, django-ratelimit, Pillow
BancoPostgreSQL 16 + PostGIS 3.4
FrontendReact 18, Vite, TypeScript, Tailwind v4, shadcn/ui, MapLibre GL, Supercluster, TanStack Query
InfraDocker Compose, nginx, gunicorn, Let’s Encrypt, Sentry (opcional)
Testespytest + pytest-django (PostGIS real), Vitest + Testing Library, Locust
tapa-buraco/
├── backend/         Django + DRF + GeoDjango (API, painel, staging, jobs)
├── frontend/        PWA React (cidadão, analista, campo, painel público)
├── deploy/          produção: nginx+TLS, gunicorn, backups, Let's Encrypt
├── loadtest/        teste de carga (Locust) da superfície pública
├── compose.local.yml          demo da stack completa (este README)
├── DEPLOY.md                  guia de deploy e operação
├── SECURITY_REVIEW.md         revisão §9 + OWASP Top 10
└── DOCUMENTACAO_SISTEMA.md    especificação do produto (fonte de verdade)

🛠️ Desenvolvimento

# Backend (roda via Docker por causa do GeoDjango/GDAL)
cd backend && cp .env.example .env && docker compose up -d --build
docker compose run --rm web pytest            # 96 testes (PostGIS real)

# Frontend
cd frontend && npm install && npm run dev      # http://localhost:5173
npm test                                       # 45 testes

Detalhes em backend/README.md e frontend/README.md.


🚢 Produção

Deploy num VPS único via Docker Compose (nginx + TLS + gunicorn + PostGIS + backups + Sentry) — passo a passo em DEPLOY.md. Segurança em SECURITY_REVIEW.md. Teste de carga em loadtest/.


🗺️ Roadmap (entregue por sprints)

SprintEntregaStatus
0–1Fundação + API pública de relatos (dedup geoespacial, EXIF strip)
2Frontend do cidadão (mapa + relato) PWA
3Auth JWT + API admin (filtros, paginação, transições)
4Painel do analista (mapa + lista + filtros + detalhe + status)
5Conserto com staging (polígono/rua/clusters → revisão → commit)
6Exportação, painel público e expiração (jobs via cron)
7Endurecimento e deploy (TLS, backups, Sentry, carga, docs)
5.5Importação CSV de consertos (opcional; depende de OSM + pg_trgm)

Projeto desenvolvido como estudo de uma plataforma cívica real, priorizando domínio geoespacial, integridade transacional, segurança e testes. Construído por sprints, cada uma entregando algo verificável e testado.

Logo Portal de Agência

Portal de Agência

SaaS white-label para agências de marketing digital

Sistema desenvolvido sob contrato: painel administrativo para a agência e portal exclusivo para clientes. Sincronização automática com Google Agenda, relatórios mensais de performance com ROI calculado, cobranças com QR Code PIX, biblioteca de mídia via Google Drive e permissões granulares. Em produção, em uso real por uma agência.

Laravel 11PHP 8.2PostgreSQLGoogle APIs
código privado

Portal de Clientes - Agência de Marketing

Plataforma SaaS white-label para agências de marketing digital gerenciarem clientes, entregas, finanças e resultados, em um único lugar.


📌 Sobre o projeto

O Portal de Clientes é um sistema web desenvolvido em Laravel 11 para centralizar a gestão de clientes de uma agência de marketing digital. Ele oferece dois ambientes distintos: um painel administrativo para a equipe da agência e um portal exclusivo para os clientes.

A plataforma conecta-se à conta Google da agência para sincronizar automaticamente eventos de reuniões e entregas, permite o envio de relatórios mensais de performance com dados reais de campanhas e redes sociais, e oferece uma área financeira completa com geração de cobranças, QR Code PIX e controle de inadimplência.


✨ Funcionalidades

🔐 Acesso e Permissões

  • Sistema de autenticação com múltiplos perfis: super_admin, admin e client
  • Controle de permissões granular via Spatie Laravel Permission
  • Suporte a múltiplos usuários por empresa-cliente, cada um com acesso controlado à sua conta
  • Proteção anti-IDOR com UUIDs em todas as rotas de recursos sensíveis
  • Soft delete em usuários, clientes e registros financeiros

🗓️ Integração com Google Agenda

  • OAuth 2.0 com a conta Google da agência
  • Sincronização automática a cada 5 minutos via Laravel Scheduler + Cron Job
  • Eventos baixados e armazenados localmente para exibição no portal do cliente
  • Filtro inteligente de eventos por nome da empresa (case-insensitive)
  • Cada cliente vê apenas os eventos relevantes à sua conta

📊 Relatórios de Performance

  • Relatórios mensais com dados de tráfego pago, Instagram e metas
  • Campos disponíveis: investimento, faturamento, CPC, conversas, alcance, publicações, novos seguidores, views, visitas ao perfil
  • Cálculo automático de ROI (coluna gerada no banco)
  • Controle de versões do relatório com histórico de alterações
  • Fluxo de publicação em etapas: rascunho → publicado → arquivado
  • Exportação em PDF via DomPDF
  • Navegação por mês de referência diretamente no portal

💰 Gestão Financeira

  • Cadastro de notas fiscais (Invoice) e cobranças individuais (Payment)
  • Pagamentos com suporte a QR Code PIX gerado dinamicamente
  • Status de pagamento: pending, under_review, paid, overdue
  • Botão “Já paguei” no portal do cliente para notificar a agência sem precisar contato
  • Marcação automática de pagamentos vencidos diariamente (via Scheduler)
  • Painel administrativo com visão consolidada de inadimplência

📁 Biblioteca de Mídia (Google Drive)

  • Links de entregáveis organizados por cliente, mês e ano
  • Suporte a tipos de conteúdo: video, image, document, link
  • Controle de visibilidade pública/privada por item
  • Integrado ao portal do cliente para visualização de entregas

⚙️ Painel Administrativo

  • CRUD completo de clientes com dados: razão social, CNPJ, e-mail, telefone, endereço, vigência de contrato e mensalidade
  • Gerenciamento de usuários e permissões por cliente
  • Dashboard com visão geral de clientes ativos, pagamentos e relatórios
  • Configurações globais do sistema (aparência, textos, comportamentos)
  • Logs de auditoria de ações críticas

💻 Telas do Sistema (algumas para exemplo)

Dashboard do Cliente
Dashboard do Cliente
Calendário de Eventos
Calendário de Eventos
Lista de Pagamentos
Gestão de Pagamentos
Configurações do Admin
Configurações (Painel Admin)

🏗️ Arquitetura

O projeto segue uma arquitetura organizada em domains, separando as responsabilidades por contexto de negócio:

app/
├── Console/
│   └── Commands/
│       └── SyncCalendarCommand.php   # Comando artisan: calendar:sync
├── Domain/
│   ├── Calendar/     # Integração com Google Agenda
│   ├── Client/       # Gestão de clientes
│   ├── Financial/    # Pagamentos e faturas
│   ├── Media/        # Links de entregáveis
│   ├── Report/       # Relatórios de performance
│   └── Setting/      # Configurações do sistema
├── Http/
│   ├── Controllers/
│   │   ├── Admin/    # Controllers do painel da agência
│   │   └── Client/   # Controllers do portal do cliente
│   └── Middleware/
└── Models/           # User, GoogleOAuthToken, AuditLog

🛠️ Stack Tecnológica

CamadaTecnologia
BackendLaravel 11, PHP 8.2
Banco de dadosPostgreSQL
FrontendBlade + Tailwind CSS
PermissõesSpatie Laravel Permission
Google APIsgoogle/apiclient (Calendar + Drive)
PDFbarryvdh/laravel-dompdf
QR Code PIXchillerlan/php-qrcode
Ícones (UI)Heroicons, Solar Icons, Remix Icons
Logs de atividadeSpatie Laravel Activitylog
DeployHostinger (shared hosting)

🚀 Instalação local

Pré-requisitos

  • PHP 8.2+
  • Composer
  • PostgreSQL
  • Node.js + NPM

Passos

# Clone o repositório
git clone https://github.com/enzoterra/portal-agencia.git
cd portal-agencia

# Instale as dependências PHP
composer install

# Instale as dependências JS
npm install

# Configure o ambiente
cp .env.example .env
php artisan key:generate

# Rode as migrations
php artisan migrate --seed

# Inicie o servidor de desenvolvimento
composer run dev

Variáveis de ambiente necessárias

Configure as seguintes entradas no .env:

# Banco de dados
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=portal_agencia
DB_USERNAME=seu_usuario
DB_PASSWORD=sua_senha

# Google OAuth
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_REDIRECT_URI=
GOOGLE_CALENDAR_ID=

⏰ Tarefas Agendadas

O sistema depende de um Cron Job configurado no servidor para funcionar corretamente. Adicione a seguinte linha ao cron do servidor:

* * * * * /usr/bin/php /caminho/para/artisan schedule:run >> /dev/null 2>&1

O Laravel gerencia internamente os intervalos de cada tarefa:

TarefaFrequênciaDescrição
calendar:syncA cada 5 minutosSincroniza eventos do Google Agenda
Marcar vencidosDiário às 00:05Atualiza status de pagamentos vencidos

📄 Licença

Este projeto foi desenvolvido para uso interno e fins de portfólio.

Logo Easymind

Easymind

Infraestrutura própria para atendentes de IA

A VPS onde rodam meus serviços de atendentes de IA para clientes: provisionamento, Docker, proxy reverso, TLS, monitoramento e deploys. É a base que mantém os projetos e serviços no ar, onde gosto de cuidar do ciclo completo, do código à operação e a facilidade para o cliente.

LinuxDockerNginxCI/CD
código privado

04 · habilidades

Com o que eu trabalho

A stack muda conforme o problema; essas são as ferramentas em que costumo trabalhar.

Frontend & Design

maior experiência

Onde tenho mais domínio: interfaces modernas, responsivas e acessíveis, unindo código e design. Cuido de UI/UX e identidade visual, não só da implementação.

Next.js React TypeScript Tailwind CSS Three.js UI/UX Identidade visual Design responsivo Figma

IA & Automação

foco atual

Para onde venho direcionando minha carreira: sistemas com camadas de inteligência que resolvem de verdade.

LLMs & Agentes Visão computacional NLP & Análise de sentimento RAG & Bases de conhecimento n8n & Workflows Chatbots & Atendentes IA

Backend

APIs e arquiteturas escaláveis, com segurança e testes desde o início.

NestJS Python Django Laravel PHP .NET Java GraphQL

Infra & Dados

Do código à operação: containers, CI/CD e bancos bem modelados.

Docker Nginx CI/CD PostgreSQL PostGIS MongoDB MySQL Redis

Além da web

Quando o problema pede outra ferramenta.

Unity Flutter Android Design de logos & identidade

05 · serviços

Também desenvolvo sob demanda

Além dos projetos próprios, presto serviços para empresas e pessoas que precisam tirar uma ideia do papel.

Sites & presença digital

Criação de sites do zero e atualização de design de sites existentes: rápidos, bonitos e com SEO de verdade.

Sistemas sob medida

Sistemas completos para o seu negócio, resolvendo problemas e otimizando fluxos, aumentando a produtividade da sua equipe.

IA & automação

Atendentes de IA, integrações entre sistemas e automação de processos que economizam horas do seu time.

06 · contato

Vamos construir algo?

Estou sempre aberto a boas conversas, seja sobre uma vaga, um projeto ou uma ideia que ainda nem tem nome.

enzoterra18@gmail.com