root@construct:~/projects/bmwdokinho$
<-- voltar para /projects
Captura da garagem do bmwdokinho.com: ilustração do BMW azul na plataforma giratória, com o painel de upgrades ao lado

bmwdokinho.com

Site do meu BMW 320i G20 M Sport, o azulzinho

HTMLCSSJavaScriptPythonYouTube IFrame APIVercel
Passe o mouse ou foque uma peça: ela acende com as ligações.
NavegadorVercelMáquina localServiços de fora1 Visitante3 index.html5 Giro da garagem2 localStorage4 /creditos7 Seções6 Assets8 build.py10 YouTube9 Vercel CLI11 WhatsApp12 OpenStreetMap
12 peças11 ligações4 áreas

>Contexto

O bmwdokinho.com é o site do meu carro, um BMW 320i G20 M Sport azul que eu chamo de azulzinho. Ele conta o projeto do carro peça por peça e leva quem lê até as oficinas que fazem cada serviço: Modesto Performance, Gringo Escapes, Yellow Parts e Dry Mobil Car & Service, cada uma com botão de WhatsApp.

A página abre com uma intro no estilo Need for Speed. Depois vêm a planta interativa dos sistemas do carro, a garagem com o carro girando 360°, a tunagem, o ronco, o diário do projeto em polaroids, o mapa da rota entre as oficinas, um teste de largada e um rádio.

Construí o site com agentes de IA em dois dias, 28 e 29 de outubro de 2026. As imagens do carro e das peças são ilustrações geradas por IA e aparecem marcadas como ilustração.

>Arquitetura (HLD)

É um site estático, sem framework e sem backend. Cada seção mora numa pasta própria com três arquivos: o HTML, um CSS em que todo seletor começa pela classe da seção e um JS que só começa a trabalhar quando a seção entra na tela. Um script em Python junta a planta base e as seções num único index.html, e o deploy sai pelo Vercel CLI.

O único estado fica no navegador: o melhor tempo do teste de largada vai para o localStorage. O rádio cria o player do YouTube dentro do clique de play, então nada do YouTube carrega antes disso, e toca o vídeo oficial da faixa sem o site hospedar o áudio. Os botões das oficinas abrem o WhatsApp com uma mensagem que começa por "Oi! Vim pelo bmwdokinho.com".

O mapa da rota é um SVG feito com dados do OpenStreetMap e servido junto com o site, sem servidor de tiles. Os sons do motor são trechos de 18 segundos de vídeos sob CC BY 3.0, com o crédito de cada um na página /creditos.

Componentes

  • Seções isoladas :: HTML, CSS e JS próprios por seção. Todo seletor começa pela classe da seção, e o JS espera a seção aparecer (IntersectionObserver) antes de carregar qualquer coisa.
  • build.py :: Parte sempre do mesmo commit base, prende o CSS da planta em .s-planta e monta as seções na ordem da página. O index.html não é editado à mão.
  • Garagem 360° :: Um player lê o manifest com o ângulo medido de cada quadro e mostra o quadro mais próximo do ângulo atual. Os quadros-âncora carregam primeiro, para o carro girar cedo, e o resto chega depois.
  • Rádio :: Toca o upload oficial de Riders On The Storm (Fredwreck Remix) pela IFrame API do YouTube, com play, pausa e volume de verdade. Um botão fixo no topo comanda o mesmo player.
  • Rota dos parceiros :: Mapa em SVG com a rota animada entre as oficinas e um card por parada com o que cada uma fez, a data e o botão de WhatsApp.
  • Teste de largada :: Jogo de tempo de reação que guarda o melhor tempo no navegador e gera um texto para compartilhar.

>Trade-offs

HTML, CSS e JS puros, montados por um script de build.

Alternativa descartada: Next.js ou outro framework.

Por quê: Cada agente trabalhou numa seção isolada com um contrato curto (três arquivos e prefixo de CSS), e o script junta tudo sem bundler nem dependência. O index.html final tem 212 KB.

O ângulo de cada quadro do giro vem da própria imagem.

Alternativa descartada: Usar o ângulo pedido na hora de gerar a imagem.

Por quê: O player mostra o quadro mais próximo do ângulo, então um ângulo errado vira pulo. Cada quadro é casado contra um carro-guia 3D para medir o ângulo, o carro é recortado e assentado no mesmo chão, e quadro fora da escala esperada sai. Onde dois vizinhos ficam a mais de 2° um do outro, um cross-fade cobre a passagem.

O rádio toca pelo player do YouTube.

Alternativa descartada: Hospedar o arquivo de áudio no site.

Por quê: A faixa toca do vídeo oficial, com os direitos nos titulares, e quem não aperta play não baixa nada do YouTube.

>Destaques

  • >246 quadros no giro da garagem, com no máximo 3,5° entre dois vizinhos.
  • >Cross-fade entre quadros vizinhos quando a distância passa de 2°.
  • >Um index.html de 212 KB montado a partir de 10 pastas de seção e da planta base.
  • >Som só depois de um clique, e as animações respeitam prefers-reduced-motion.
  • >4 oficinas com WhatsApp direto, e cada mensagem já diz que veio do site.

>Curiosidades

  • *O rádio toca Riders On The Storm (Fredwreck Remix), de Snoop Dogg & The Doors, da trilha do Need for Speed Underground 2.
  • *Os três sons do ronco são de outros G20, de canais do YouTube, e o crédito de cada um está em /creditos.
Agendar diagnóstico · R$ 500Planos
bmwdokinho.com | The Broad Way | Kinho.dev