Etapa 1 inteira (logica com 100% de cobertura, cena 3D, toque, sons, bancada de desempenho, e2e) e a base da etapa 2 (mapa novo no Tiled, texturas, imagens dos itens, sons conferidos, golpe recortado e medido). Pagina /jogo fora do menu e do sitemap ate a medicao no celular.
| 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.
O que é
O código do site evandro.dev.br, o portfólio de Evandro Fonseca Junior, engenheiro da computação em Garuva-SC. 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. O site mostra projetos entregues, serviços, currículo e um botão de WhatsApp para começar a conversa.
- Apresenta três ofertas: criação de sites, sistemas web sob medida e revisão de apps feitos com IA (
/ia). - Publica nove 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. - 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 nove ids).
| Case | O que é | Estado | Demo |
|---|---|---|---|
julia-beauty |
Julia Beauty: site de estúdio de extensão de cílios em Camboriú, com simulador de efeito e SEO local | Em produção | juliabeauty.com.br |
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 |
Por que usar
O repositório é a referência de como o site funciona, não um template. As decisões que valem conferir:
- Sem backend. O formulário de contato abre o
wa.mecom o briefing já preenchido, e o rodapé mantém o contato direto por e-mail; não há API route ativa nem banco. - 3D só onde o aparelho aguenta. O hero e o notebook de projetos em Three.js aparecem só onde o dispositivo comporta; em telas pequenas, com ponteiro
coarseou movimento reduzido, o site entrega a versão em HTML estático. - Analytics com consentimento. O Google Analytics só carrega depois de aceite explícito, e o consentimento pode ser revogado depois (detalhes em
/privacidade). - Demos externas não derrubam o render. O estado de cada demo vem de um snapshot versionado; em produção, o render não consulta as demos.
Quando não usar: se você procura um template de portfólio. O projeto é pessoal ("private": true no package.json) e não tem licença publicada.
Como funciona
- O conteúdo vem de
public/portfolio-data.json(lido porlib/portfolio-data.server.ts) e delib/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. Em desenvolvimento, um snapshot ausente ou com mais de 15 minutos é atualizado em memória.
pnpm check:projectsatualiza o arquivo por rename atômico. Contrato completo emdocs/project-health.md. - Um único workflow,
.gitea/workflows/ci.yml, roda empush,pull_requesteworkflow_dispatch, com permissãocontents: read:
| 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 e estrutura
| 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 nove 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 |
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)
Início rápido
Requisitos: Node.js 22.x (engines), pnpm 9.15.9 (packageManager) e, só para pnpm test:e2e, o Chromium do 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.
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.
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
Testes de ponta a ponta: pnpm build && pnpm start -p 3001 e, em outro terminal, BASE_URL=http://localhost:3001 pnpm test:e2e.
Outros scripts: pnpm format (Biome), pnpm test:watch (Jest em modo watch) e pnpm check:projects (atualiza data/project-health.json).
Configuração
Não há .env.example, e nenhuma variável é necessária para rodar localmente. O código lê:
| Variável | Descrição |
|---|---|
NEXT_PUBLIC_GOOGLE_ADS_CONVERSION_LABEL |
Rótulo de conversão do Google Ads; sem ele, nenhum evento de conversão é enviado |
BASE_URL |
Endereço do site testado por pnpm test:e2e (padrão http://localhost:3001) |
PW_CHROMIUM |
Caminho de um Chromium local para o Playwright, para não baixar o navegador |
Estado do projeto
Em produção em evandro.dev.br. 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).
Limites e próximos passos:
- 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,twins-labrespondeu 404 esc-plus, 502. Rodepnpm check:projectspara renová-lo. Em 2026-10-24,nutriscan.evandro.dev.brcontinuava sem responder com o app. - Ações externas de SEO/GEO pendentes. Search Console, Bing, Cloudflare e CrUX estão só no runbook.
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, descrito e não executado), docs/seo-geo-validation.md (validação de SEO e GEO) e CREDITS.md.
O CI roda em push e pull_request; antes de abrir um PR, rode pnpm lint && pnpm typecheck && pnpm test -- --runInBand && pnpm build.
Licença
Sem licença publicada: todos os direitos reservados.
Feito por Evandro Fonseca Junior · git.evandro.dev.br



