Uma aula prática de ponta a ponta: do primeiro commit no GitHub ao site completo em produção, com Claude Code, HTML puro e zero framework. Tudo reprodutível no seu navegador e terminal.
gh api, sem interface gráficaAntes de colocar a mão na massa, três conceitos precisam ficar claros. Sem decorar — basta entender o papel de cada um.
Pense no GitHub como o Google Drive dos programadores: cada alteração fica registrada, com data, autor e possibilidade de voltar no tempo. Para o site, ele também faz o papel de servidor de hospedagem gratuito através do GitHub Pages.
repositório = a pasta do projeto na nuvemcommit = uma fotografia do projeto num momento do tempobranch main = a linha principal, é o que vai ao arGitHub Pages = transforma o repositório em site públicoClaude Code é um terminal inteligente: você conversa em português, ele lê arquivos, escreve código, roda comandos e faz deploy. Para o advogado que não programa, o fluxo é sempre o mesmo: descrever o que quer → revisar o que o Claude fez → aprovar o commit.
O Claude Code não substitui o entendimento — ele substitui o trabalho braçal. Você ainda precisa saber o que quer. O "como" ele faz.
O site inteiro é construído com três tecnologias nascidas nos anos 90:
HTML — estrutura (parágrafos, títulos, listas)CSS — aparência (cores, fontes, espaçamentos)JavaScript — interatividade (toggle de tema, busca, formulário)Por que não usamos React, Next.js, WordPress? Porque HTML puro carrega em 100ms, não tem backend para invadir, não depende de plugin para atualizar, e o GitHub Pages hospeda de graça para sempre.
nodejs.org. É pré-requisito para o Claude Code rodar.npm install -g @anthropic-ai/claude-code
gh em cli.github.com. É o que permite subir código pela linha de comando.gh auth login
github.com/new, nome: meusite. Marque público. Crie.cd C:\Users\seunome\meusite claude
Nunca suba arquivos de processo, nome de cliente ou documento confidencial para um repositório público. Para isso existem os repositórios privados — veremos na aula 06 do curso principal.
Todo site é apenas uma pasta com arquivos index.html. Cada subpasta vira uma URL.
douglasvilar-site/ ├── index.html → douglasvilar.com.br/ ├── ia/index.html → douglasvilar.com.br/ia/ ├── mentoria/index.html → douglasvilar.com.br/mentoria/ ├── inscricao/index.html → douglasvilar.com.br/inscricao/ ├── noticias/ │ ├── index.html → /noticias/ (agregador) │ └── contrato-corretor-associado/index.html ├── curso/aula-site/index.html └── CNAME → arquivo com o domínio
Em vez de escrever a cor #C8322C em 100 lugares, declaramos uma vez no topo e reutilizamos:
/* variáveis reutilizáveis */ :root{ --ink: #08080A; /* preto */ --paper: #F4EFE6; /* bege claro */ --blood: #C8322C; /* vermelho sangue */ --cyan: #00E5FF; /* destaque tech */ --radius: 14px; /* arredondamento */ } /* uso em qualquer lugar */ .botao { background: var(--blood); color: var(--paper); }
Para mudar a identidade visual do site inteiro, basta mexer nessas 5 linhas. Foi isso que permitiu criar o tema CLÁSSICO em uma tarde.
A fonte cresce e encolhe sozinha conforme a tela:
h1 { font-size: clamp(2.4rem, 6vw, 4.8rem); }
/* mínimo 2.4rem | ideal 6% da tela | máximo 4.8rem */
Resultado: no celular fica legível sem quebrar, no desktop preenche com impacto editorial.
O prompt que usamos com o Claude Code foi literalmente este:
"Crie um index.html para um advogado de 47 anos, OAB/PR, especialista em direito imobiliário e IA aplicada à advocacia. Estilo editorial minimalista, paleta dark com vermelho sangue e ciano de destaque. Hero com nome grande em serifa, chip com OAB, áreas de atuação, seção de podcasts com iframe do YouTube, seção de IA, contato por WhatsApp. HTML puro, tudo em um arquivo."
YouTube pesa. Em vez de carregar 4 iframes direto, exibimos uma miniatura e só ativamos o player ao clique:
<div class="pod" onclick="playPod(this,'BfLaR8YL_g0')"> <img src="https://i.ytimg.com/vi/BfLaR8YL_g0/hqdefault.jpg"> <button>▶</button> </div> <script> function playPod(el, id){ el.innerHTML = `<iframe src="https://www.youtube-nocookie.com/embed/${id}?autoplay=1" allow="autoplay"></iframe>`; } </script>
É o domínio "sem rastreamento" do YouTube. Não deixa cookies no visitante e é melhor para LGPD.
A inscrição do curso é um formulário 100% funcional que não precisa de servidor, banco de dados nem backend. Como?
localStorage (histórico local)function enviar(){ const msg = `Olá Douglas, quero me inscrever! Nome: ${nome.value} Modalidade: ${modalidade.value} Telefone: ${tel.value}`; // abre WhatsApp com mensagem pré-escrita window.open(`https://wa.me/5541991234567?text=${encodeURIComponent(msg)}`); // salva cópia local e dispara evento localStorage.setItem('inscricao_'+Date.now(), msg); gtag('event', 'enrollment_submit'); }
Por que funciona? Porque o "servidor" que recebe a inscrição é o próprio WhatsApp. Zero custo, zero manutenção, zero LGPD complicada.
Se alguém clica em "Mentoria em Grupo" na página da mentoria, o link leva para /inscricao/?modalidade=grupo e o formulário já chega com a opção marcada:
const params = new URLSearchParams(location.search); if(params.get('modalidade')){ document.querySelector(`input[value="${params.get('modalidade')}"]`).checked = true; }
A página /noticias/ agrega 30 fontes gratuitas (Conjur, Migalhas, JOTA, G1, Folha, Valor, STF, STJ, CNJ, TJ-PR, Gazeta do Povo, Estadão...) sem backend. Como?
/feed, /rss)const FEEDS = [ { nome:'Conjur', url:'https://www.conjur.com.br/rss.xml', peso:3 }, { nome:'STF', url:'https://portal.stf.jus.br/rss/noticias.asp', peso:3 }, /* ...mais 28 fontes */ ]; async function buscar(feed){ const r = await fetch(`https://api.allorigins.win/get?url=${encodeURIComponent(feed.url)}`); const xml = new DOMParser().parseFromString((await r.json()).contents, 'text/xml'); return [...xml.querySelectorAll('item')].map(i => ({ titulo: i.querySelector('title').textContent, link: i.querySelector('link').textContent, data: new Date(i.querySelector('pubDate').textContent), fonte: feed.nome, peso: feed.peso })); }
Pontuamos cada notícia por 3 fatores e ranqueamos:
function hotScore(item){ const horas = (Date.now() - item.data) / 3600000; const frescor = Math.max(0, 48 - horas) / 48; // últimas 48h const hits = HOT_WORDS.filter(w => item.titulo.toLowerCase().includes(w)).length; return (frescor * 3) + (hits * 0.5) + (item.peso * 0.3); }
Palavras-quentes: stf, stj, cnj, lei, selic, ia, distrato, corretor, ministro... Resultado: as manchetes jurídicas relevantes sobem para o topo automaticamente.
Salvamos o resultado em localStorage por 30 minutos. Na segunda visita, carrega instantâneo. Depois de 30 min, atualiza em segundo plano.
Um artigo jurídico publicado de qualquer jeito não aparece no Google. Um artigo seguindo o padrão E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) sobe nos resultados e ainda aparece com o rich snippet do FAQ. Foi o que fizemos com o artigo de corretor associado.
<details>/<summary><script type="application/ld+json"> { "@context": "https://schema.org", "@graph": [ { "@type": "Article", "headline": "Contrato de corretor associado...", "author": { "@type":"Person", "name":"Douglas Vilar" }, "datePublished": "2026-04-20", "dateModified": "2026-04-20" }, { "@type": "FAQPage", "mainEntity": [ /* perguntas */ ] }, { "@type": "BreadcrumbList", "itemListElement": [ /* trilha */ ] } ] } </script>
Esses 3 tipos (Article + FAQPage + BreadcrumbList) fazem o Google exibir seu artigo com caixa expansível de perguntas no resultado da busca. Tráfego orgânico praticamente dobra.
Depois de publicar, cole a URL em search.google.com/test/rich-results para conferir se está tudo validado.
Adicionamos um botão que alterna entre o visual "moderno" (dark editorial com neon) e "clássico" (papel creme, tipografia serifa). A lógica é absurdamente simples:
<button onclick="toggleTheme()">◐ CLÁSSICO</button> <script> function toggleTheme(){ const atual = document.documentElement.dataset.theme; const novo = atual === 'classic' ? '' : 'classic'; document.documentElement.dataset.theme = novo; localStorage.setItem('dv_theme', novo); } </script> <style> [data-theme="classic"]{ --paper: #FAF7F0; --ink: #1A1D21; /* sobrescreve apenas os tokens que mudam */ } </style>
Como usamos design tokens, mudar 4 variáveis CSS reidentifica o site inteiro. Escolha do usuário fica salva no navegador.
17px (padrão web é 16px) — +6% de legibilidade48px (alvo de toque confortável)scroll-margin-top para âncoras não ficarem embaixo do menu fixoPara subir qualquer alteração ao ar, o fluxo é esse:
# 1. pegar o SHA do arquivo atual (necessário para update) gh api repos/USUARIO/REPO/contents/index.html --jq '.sha' # 2. enviar o arquivo novo (via Python ajuda a encodar em base64) python -c " import base64, json c = open('index.html','rb').read() open('up.json','w').write(json.dumps({ 'message':'feat: atualiza home', 'content': base64.b64encode(c).decode(), 'branch':'main', 'sha':'COLAR_O_SHA_AQUI' }))" # 3. PUT no GitHub gh api -X PUT repos/USUARIO/REPO/contents/index.html --input up.json
Em produção real, o Claude Code faz esse ciclo inteiro para você — você só aprova. Em 30 segundos o site está no ar.
Todo commit é uma fotografia. Se o site quebrar ou você se arrepender de um texto, gh api traz qualquer versão anterior de volta. Nunca trabalhe sem essa rede de segurança.
No nosso fluxo: (1) cópia local antes de editar, (2) commit no repositório principal, (3) pasta /backup/v1-home-20260420/ com a versão antiga acessível por URL. Três redes, nenhuma aranha.
Tudo o que você viu nessas 2 horas usa tecnologia com mais de 20 anos. HTML é de 1993. CSS de 1996. JavaScript de 1995. RSS de 1999. O novo é o Claude Code fazendo a ponte entre o seu português e o código — e o GitHub Pages transformando um repositório em site público de graça.
O site douglasvilar.com.br inteiro foi construído seguindo exatamente esse roteiro. Cada página que você vê pode ser inspecionada (Ctrl+U no navegador) para ver como foi feita. Nada é segredo.
Próximo passo: abra o terminal, instale o Claude Code e comece pelo seu index.html. Em uma tarde você tem um site no ar com seu nome de domínio.
Essa aula é um aperitivo do Curso IA na Prática da Advocacia (8 aulas completas) e da Mentoria individual, onde construímos o seu site junto com você, do zero à publicação.
Conhecer o curso completo Ver modalidades de mentoria