Evandro Fonseca Junior
Engenheiro da Computação em Garuva-SC: sites, sistemas web e revisão de apps feitos com IA, com contato direto pelo WhatsApp.
Site · Cases · Currículo · Quickstart · Arquitetura · LinkedIn · Issues
📌 O problema
Pequenos negócios costumam vender e atender por mensagem: o cliente pergunta o preço um a um, o estoque vive em planilha e qualquer mudança no site depende de um desenvolvedor. Este repositório é o site evandro.dev.br, a vitrine de quem resolve isso: projetos entregues, serviços, currículo e um botão de WhatsApp para começar a conversa.
✨ O que faz
- Apresenta três ofertas: criação de sites, sistemas web sob medida e revisão de apps feitos com IA (
/ia). - Publica oito cases com stack, entregas e decisões técnicas, cada um em
/cases/<id>. - Detalha seis serviços em
/servicos/*, com escopo e etapas visíveis e a parte técnica em<details>. - Serve o currículo em HTML e o PDF em
/Profile.pdf. - Abre o
wa.mecom o briefing já preenchido a partir do formulário de contato; não há backend de formulário. - Mostra o hero e o notebook de projetos em 3D (Three.js) só onde o dispositivo comporta; nos demais, entrega HTML estático.
- Carrega Google Analytics somente depois de aceite explícito, e permite revogar o consentimento depois.
- Gera
sitemap.xml,robots.txt, manifest, imagens Open Graph e dados estruturados JSON-LD.
Cases publicados
Fonte: public/portfolio-data.json e lib/site-content.ts (os mesmos oito ids).
| Case | O que é | Estado | Demo |
|---|---|---|---|
sev-modaintima |
SEV Moda Íntima: catálogo digital e loja virtual, pedido pelo WhatsApp e painel de estoque | Em produção | sevmodaintima.com.br |
lavacao-047 |
Lavação 047: site e painel para lavação automotiva em Garuva-SC, o dono edita preços, textos e fotos | Em produção | landing-page-lavacao047.vercel.app |
nutriscan |
NutriScan: consulta de produtos por nome e código de barras | Em produção | nutriscan.evandro.dev.br |
twins-lab |
Twins Lab: painel ao vivo de um reator simulado | Protótipo | sem demo |
reddit-explorer |
Reddit Posts Explorer: posts de um fórum de IA, filtrados por período | Concluído | sem demo |
sc-plus |
SC Plus Aquicultura: site institucional com áreas, projetos e contato | Concluído | scplus.evandro.dev.br |
gcc-installer |
MinGW GCC Installer: instalador do compilador GCC para Windows | Concluído | sem demo |
as-servicos |
AS Serviços: site institucional com cena 3D | Concluído | sem demo |
🖼️ Demonstração
| SEV Moda Íntima | NutriScan |
|---|---|
![]() |
![]() |
| SC Plus Aquicultura | AS Serviços |
![]() |
![]() |
Capturas feitas com Chrome headless a partir de deploys de produção do próprio autor. Origem e créditos (inclusive do ícone do WhatsApp) em CREDITS.md.
🚀 Quickstart
| Ferramenta | Versão mínima |
|---|---|
| Node.js | 22.x (engines) |
| pnpm | 9.15.9 (packageManager) |
| Chromium | só para pnpm test:e2e (Playwright) |
corepack [email protected] install --frozen-lockfile
corepack [email protected] dev # Next.js com Turbopack
corepack [email protected] build # build de produção
corepack [email protected] start # serve um build já gerado
A instalação é sempre com --frozen-lockfile, igual ao CI e ao Nixpacks.
Não há .env.example e nenhuma variável é necessária para rodar localmente. As que o código lê:
| Variável | Obrigatória | Descrição |
|---|---|---|
NEXT_PUBLIC_GOOGLE_ADS_CONVERSION_LABEL |
Não | Rótulo de conversão do Google Ads; sem ele, nenhum evento de conversão é enviado |
BASE_URL |
Não | Endereço do site testado por pnpm test:e2e (padrão http://localhost:3001) |
PW_CHROMIUM |
Não | Caminho de um Chromium local para o Playwright, para não baixar o navegador |
Important
O Next.js (
16.3.8) é fixado de propósito: a16.2.11mantinha três advisories transitivos de severidade alta, e a16.3.0foi a menor versão estável da mesma major que deixou as auditorias sem vulnerabilidades high. Não faça downgrade sem repetirpnpm audit.
🧱 Arquitetura
flowchart LR
A["public/portfolio-data.json"] --> B["lib/portfolio-data.server.ts"]
S["lib/site-content.ts"] --> E["app/ App Router"]
C["data/project-health.json"] --> B
D["scripts/check-projects.mjs"] -->|rename atômico| C
B --> E
E --> F["Vercel"]
- O conteúdo vem de
public/portfolio-data.jsonelib/site-content.ts; a homepage escolhe os projetos pelo campofeatured. data/project-health.jsoné um snapshot versionado das demos. Ele só controla o CTA de cada card (disponível, indisponível, desconhecido ou sem demo) e nunca remove um card.- Em produção, o render só lê o snapshot e não consulta demos externas. Em desenvolvimento, um snapshot ausente ou com mais de 15 minutos é atualizado em memória.
pnpm check:projectsatualiza o snapshot por rename atômico. Contrato completo emdocs/project-health.md.- Não há API route ativa.
CI/CD
Um único workflow, .gitea/workflows/ci.yml, roda em push, pull_request e workflow_dispatch, com permissão contents: read. O repositório usa Gitea; por isso não há badge de GitHub Actions.
| Job | O que roda | Bloqueia o deploy |
|---|---|---|
verify |
Node 22, pnpm install --frozen-lockfile, lint, typecheck, test -- --runInBand, build |
Sim |
audit |
pnpm audit --prod e pnpm audit --dev, ambos com --audit-level=high |
Não |
e2e |
Playwright (Chromium) contra o build de produção na porta 3001; publica test-results/ |
Não |
deploy |
Vercel CLI 61.1.0; só após verify; branch padrão vai para produção, as demais para preview; pull request não publica |
n/a |
O deploy usa o secret VERCEL_TOKEN; o projeto na Vercel é o nome do repositório, ou a variável VERCEL_PROJECT. nixpacks.toml (nodejs_22, pnpm-9_x) e vercel.json (framework: nextjs) descrevem o build.
Rotas
| Rota | Conteúdo |
|---|---|
/ |
Hero, notebook de projetos, perfil, competências, experiência, projetos, modalidades de trabalho e contato |
/cases, /cases/<id> |
Índice e página de cada um dos oito cases |
/servicos |
Índice dos seis serviços |
/servicos/criacao-de-sites |
Criação de sites |
/servicos/engenharia-de-software |
Sistemas web e aplicativos mobile sob medida |
/servicos/consultoria-nextjs |
Consultoria Next.js |
/servicos/tauri-rust |
Aplicativos desktop para Windows e Linux |
/servicos/integracao-hardware-software-iot |
Integração de hardware, software e IoT |
/servicos/arquitetura-de-software |
Diagnóstico de arquitetura |
/ia |
Revisão de sistema e de app feito com IA |
/curriculo |
Currículo em HTML, com download de /Profile.pdf |
/privacidade |
Privacidade e consentimento de analytics |
🗂️ Estrutura
app/ rotas (App Router) e componentes
lib/ conteúdo (site-content.ts), SEO, JSON-LD, WhatsApp, project health
public/ portfolio-data.json, Profile.pdf, logos, capturas e mídias dos cases
data/ project-health.json, snapshot versionado das demos
scripts/ check-projects.mjs e utilitários de SEO e vídeo
e2e/ testes Playwright (9 specs)
docs/ SEO/GEO, project health e planos
.gitea/workflows/ ci.yml (verify, audit, e2e, deploy)
nixpacks.toml build e start via Nixpacks
CREDITS.md créditos de capturas e ícone
Stack: Next.js 16.3.8, React 19.1.0, TypeScript 5.9.2, Tailwind CSS 4, Three.js, Lenis e Lucide React. Qualidade: Biome, Jest 30 com Testing Library (150 arquivos de teste), Playwright e axe-core. Todas as dependências diretas estão fixadas em versões exatas, exceto lenis (^1.3.26).
🧪 Scripts
| Comando | O que faz |
|---|---|
pnpm dev |
Next.js em desenvolvimento com Turbopack |
pnpm build |
Build de produção com Turbopack |
pnpm start |
Serve um build já gerado |
pnpm lint |
Executa biome check |
pnpm typecheck |
Executa next typegen e tsc --noEmit |
pnpm format |
Formata o repositório com Biome |
pnpm test |
Executa a suíte Jest |
pnpm test:watch |
Executa Jest em modo watch |
pnpm test:e2e |
Executa o Playwright contra um servidor já no ar (BASE_URL) |
pnpm check:projects |
Consulta as demos e substitui atomicamente data/project-health.json |
Validação completa, na mesma ordem do CI:
corepack [email protected] install --frozen-lockfile
corepack [email protected] lint
corepack [email protected] typecheck
corepack [email protected] test -- --runInBand
corepack [email protected] build
corepack [email protected] audit --prod --audit-level=high
corepack [email protected] audit --dev --audit-level=high
Para os testes de ponta a ponta: pnpm build && pnpm start -p 3001, e em outro terminal BASE_URL=http://localhost:3001 pnpm test:e2e.
📚 Documentação
docs/project-health.md: estados do CTA das demos e atualização do snapshot.docs/seo-geo-operations.md: runbook de SEO e GEO (Search Console, Bing, Cloudflare, CrUX), descrito e não executado.docs/seo-geo-validation.md: validação de SEO e GEO.CREDITS.md: créditos das capturas de tela e do ícone do WhatsApp.
🛣️ Limitações e próximos passos
- Sem backend. O formulário de contato não grava nada: abre
wa.mecom o briefing preenchido, e o rodapé mantém o contato direto por e-mail. - Demos externas podem aparecer como indisponíveis. O CTA reflete o último snapshot versionado, não uma consulta em tempo real. No snapshot de 2026-07-11, só a SEV respondeu 200;
nutriscanfalhou na consulta esc-plusrespondeu 502. Rodepnpm check:projectspara renová-lo. - Sem 3D em telas pequenas, com ponteiro
coarseou movimento reduzido. O hero e o notebook entregam a versão HTML. - Ações externas de SEO/GEO pendentes. Search Console, Bing, Cloudflare e CrUX estão só no runbook.
🤝 Contribuindo
Projeto pessoal ("private": true no package.json). O CI roda em push e pull_request; antes de abrir um PR, o que ele exige deve passar localmente:
pnpm lint && pnpm typecheck && pnpm test -- --runInBand && pnpm build
📄 Licença
Sem licença definida — todos os direitos reservados.



