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   
|
|
| **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`](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) |
```bash
corepack pnpm@9.15.9 install --frozen-lockfile
corepack pnpm@9.15.9 dev # Next.js com Turbopack
corepack pnpm@9.15.9 build # build de produção
corepack pnpm@9.15.9 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
```mermaid
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`](docs/project-health.md).
- Não há API route ativa.
### CI/CD
Um único workflow, [`.gitea/workflows/ci.yml`](.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`](nixpacks.toml) (`nodejs_22`, `pnpm-9_x`) e [`vercel.json`](vercel.json) (`framework: nextjs`) descrevem o build.