evandro 558c3d5b48
CI / deploy (push) Successful in 1m15s
CI / audit (push) Failing after 5m36s
CI / verify (push) Successful in 11m44s
CI / e2e (push) Successful in 16m10s
test(e2e): limite do Tab sobe para 37 com o quinto cliente na faixa do hero
2026-10-24 05:07:36 -03:00
2025-09-01 18:43:26 -03:00

Logo do Evandro.dev.br

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

Stack Status Licença


📌 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.me com 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
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.

🚀 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: 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.

🧱 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.json e lib/site-content.ts; a homepage escolhe os projetos pelo campo featured.
  • 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:projects atualiza o snapshot por rename atômico. Contrato completo em docs/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

🛣️ Limitações e próximos passos

  • Sem backend. O formulário de contato não grava nada: abre wa.me com 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; nutriscan falhou na consulta e sc-plus respondeu 502. Rode pnpm check:projects para renová-lo.
  • Sem 3D em telas pequenas, com ponteiro coarse ou 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.

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%