root@construct:~/projects/kaizen-forge$
<-- voltar para /projects

Kaizen Forge

Site da minha prática de IA e engenharia de software

Next.js 15React 19TypeScriptVercel

>Contexto

A Kaizen Forge é a minha software house e consultoria: um time de devs que constrói software para clientes. O site, em kaizenforge.tech, apresenta três frentes: consultoria de IA, engenharia de software e coaching de carreira. Também explica como trabalhamos: escopo, prazo e preço fechados, num método de seis etapas.

O público principal é quem compra no Brasil, então o português fica na raiz do domínio. Os outros seis idiomas atendem quem chega de fora: inglês, espanhol, japonês, alemão, russo e chinês.

Desenhei e mantenho o site. O primeiro commit é de 3 de julho de 2026: o site nasceu bilíngue e ganhou os outros cinco idiomas no mesmo dia. Está em produção na Vercel, e o último commit no repositório é de 18 de setembro de 2026.

>Arquitetura (HLD)

O site roda na Vercel. Os dois domínios, registrados na GoDaddy, usam os nameservers da Vercel, e o vercel.json redireciona www.kaizenforge.tech, kaizenforge.com.br e www.kaizenforge.com.br para kaizenforge.tech com 308. Numa visita, o middleware do next-intl roda no runtime Edge, lê o prefixo de idioma da URL (a raiz é pt-BR) e reescreve a rota para o segmento [locale]. A página sai pré-renderizada do cache da Vercel.

Não há banco, rota de API nem estado no servidor. O conteúdo está nos 7 catálogos JSON e nas páginas geradas no build, e o único estado é a escolha de consentimento, guardada num cookie no navegador. Não há fila, cron nem webhook. A camada de tracking aceita seis provedores por variável de ambiente, mas o bundle de produção conferido em 22/10/2026 não tem nenhum configurado. O formulário de contato também está desligado: o contato é por links de WhatsApp e e-mail.

O deploy de produção sai de uma sessão local pelo Vercel CLI. No GitHub, o Actions roda o CI em todo pull request e em push para main e develop: lint com fronteiras de import, typecheck, testes, build, Storybook, E2E com Playwright, Lighthouse e orçamento de bundle. O workflow de deploy pelo Actions existe, mas só com disparo manual, e o Dependabot cuida das atualizações de dependências.

Passe o mouse ou foque uma peça: ela acende com as ligações.
NavegadorMáquina localGitHubVercelContato1 Visitante3 Deploy de produção2 Banner + track()5 CI4 Repositório7 DNS9 Middleware de idioma11 Páginas estáticas6 Dependabot8 Domínios + redirects10 Deployment13 WhatsApp e e-mail12 Catálogos de idioma
13 peças12 ligações5 áreas

Componentes

  • Domínios e DNS :: kaizenforge.tech e kaizenforge.com.br usam a DNS da Vercel, e as regras do vercel.json levam www e .com.br para kaizenforge.tech com 308.
  • Middleware de idioma :: O next-intl roda no runtime Edge antes de cada página, fora de api, _next e arquivos estáticos, serve a raiz como pt-BR e resolve /en, /es, /ja, /de, /ru e /zh para o idioma de cada prefixo.
  • Páginas estáticas :: Next.js 15 com React 19 gera as páginas dos 7 idiomas no build (generateStaticParams), e a Vercel as serve do cache.
  • Catálogos de idioma :: Um JSON por idioma, com as mesmas 240 chaves nos 7, que o next-intl carrega ao renderizar cada página.
  • Consentimento e track() :: No navegador, um store sobre EventTarget guarda a escolha num cookie e bloqueia a função track() até o aceite no banner.
  • Deploy :: A produção é publicada pelo Vercel CLI a partir de uma sessão local; o workflow de deploy no GitHub Actions fica só para disparo manual.
  • CI no GitHub Actions :: Oito jobs em todo pull request: lint com fronteiras de import, typecheck, testes, build, Storybook, E2E, Lighthouse e orçamento de bundle.

>Trade-offs

A raiz serve sempre pt-BR, sem detectar o idioma do navegador.

Alternativa descartada: Redirecionar pelo Accept-Language do navegador.

Por quê: O público principal é comprador brasileiro, e URLs estáveis são melhores para SEO.

Slugs em português só no pt-BR. Os outros seis idiomas usam os slugs em inglês, como /ai-consulting.

Alternativa descartada: Traduzir o slug de cada página em cada idioma.

Por quê: Não muda nada para SEO e evita manter seis conjuntos de slugs.

Store de consentimento escrito à mão sobre a API EventTarget.

Alternativa descartada: Usar Zustand.

Por quê: A camada de tracking carrega em todas as páginas. Trazer uma biblioteca para um store tão pequeno pesaria no bundle, e a API nativa funciona fora do React também.

Consentimento explícito por padrão: enquanto a pessoa não escolhe, nada é medido.

Alternativa descartada: Tratar o estado pendente como permissão.

Por quê: É o padrão compatível com LGPD e GDPR. O custo apareceu na revisão antes do lançamento: sem banner, o tracking ficava desligado para todo mundo, e o banner entrou nos 7 idiomas.

>Destaques

  • >7 idiomas no ar: a home respondeu 200 em pt-BR, en, es, ja, de, ru e zh em 22/10/2026.
  • >240 chaves de mensagem por idioma, o mesmo conjunto nos 7 catálogos.
  • >83 testes unitários passando (Vitest, 6 arquivos), medidos em 22/10/2026.
  • >Lighthouse no CI com nota mínima de 1,0 em acessibilidade e SEO e 0,9 em performance.
  • >Orçamento de 130 KB (gzip) de JavaScript no primeiro carregamento da home, checado no CI.

>Curiosidades

  • *O título da home é cortado por uma katana: uma lâmina de luz atravessa o texto, as duas metades se afastam e fica uma brasa na linha do corte. É só CSS, sem biblioteca de animação.
  • *Um dos ajustes antes do lançamento foi o formato de número em russo: 5 000+, com espaço.
Kaizen Forge | The Broad Way | Kinho.dev