Files

12 KiB

SEV Moda Íntima NutriScan
Site da SEV Moda Íntima NutriScan
SC Plus Aquicultura AS Serviços
Site da SC Plus Aquicultura Site da 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.me com 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 coarse ou 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

  1. O conteúdo vem de public/portfolio-data.json (lido por lib/portfolio-data.server.ts) e de lib/site-content.ts; a homepage escolhe os projetos pelo campo featured.
  2. 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.
  3. 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:projects atualiza o arquivo por rename atômico. Contrato completo em docs/project-health.md.
  4. Um único workflow, .gitea/workflows/ci.yml, roda em push, pull_request e workflow_dispatch, com permissão contents: 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: a 16.2.11 mantinha três advisories transitivos de severidade alta, e a 16.3.0 foi a menor versão estável da mesma major que deixou as auditorias sem vulnerabilidades high. Não faça downgrade sem repetir pnpm 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; nutriscan falhou na consulta, twins-lab respondeu 404 e sc-plus, 502. Rode pnpm check:projects para renová-lo. Em 2026-10-24, nutriscan.evandro.dev.br continuava 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.