evandro 4671837c44
CI / audit (push) Successful in 10m16s
CI / verify (push) Successful in 11m43s
CI / deploy (push) Successful in 1m26s
CI / e2e (push) Successful in 16m8s
fix(deps): atualiza next para 16.4.3 (corrige GHSA-2464-fhr4-w9xw, GHSA-673q-mjm6-r5xr e GHSA-p3m5-59mp-jv5r)
2026-10-24 18:02:03 -03:00
2025-09-01 18:43:26 -03:00

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.

S
Description
Portfólio profissional: projetos, cases, serviços e currículo
Readme
127 MiB
0 Stars 1 Watchers 0 Forks
Languages
TypeScript 90%
CSS 4.4%
JavaScript 3.5%
Python 2.1%