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