Bastidores

Desenvolvimento· Arrumando a casa · parte 16

Meus produtos novos não começam do zero. Começam de um clone.

Uma base privada marcada como template traz site, app, conta, pagamentos e IA prontos. Cada produto clona, renomeia e apaga o que não usa.

Um repositório-base com setas para três clones renomeados, cada um com o próprio nome.

Em 7 de novembro, decidi ter uma base própria para os meus produtos, num repositório só, privado e marcado como template no GitHub, sempre na última versão do main. Começar um produto apontando para o repositório e o commit de outro pode arrastar decisões que só fazem sentido naquele produto. Começar do zero pode repetir erros de conta, publicação e operação.

A base traz o que todo produto precisa e nenhum produto

A base entrega um site e um app em inglês e português, entrada na conta, a conta com cópia dos dados e exclusão, a área do operador atrás do Cloudflare Access, e-mail, pagamentos e IA atrás de adaptadores com fakes que funcionam. Ela traz também erros e analytics depois do consentimento, retenção, alertas e runbooks, com a publicação rodando da minha máquina. Nenhum produto mora dentro dela, e cada clone apaga o que não usa.

O Garfim e dois produtos que ainda não apresentei aqui nasceram antes da base e não são clones dela. Um produto já criado também não recebe a base de novo de forma automática.

A regra de volta mantém a base viva sem misturar os produtos. Uma melhoria genérica feita num produto, como uma correção de segurança, um portão ou um padrão de operação, volta para a base num commit e numa linha do changelog. O que pertence ao domínio de um produto fica só naquele produto e nunca entra na base.

O rename troca slug, nome e domínio em todo o repositório

Quem começa um produto clona a última versão do main da base para o repositório próprio, com histórico novo. Depois roda bun install e bun rename <slug> "<Display Name>" <domain>, informando o slug, o nome de exibição e o domínio do produto novo. O comando troca o slug em cada nome de recurso, como workers, filas, buckets e o banco local, troca o nome de exibição onde o produto é nomeado e troca example.com em todo o repositório.

O rename também renova a chave do IndexNow e formata o que ele mudou. Depois dele, confiro o git diff e preencho o que o comando não tem como saber, como os dados de infraestrutura e a entidade legal do produto novo. A partir daí, escrevo o SRS na pasta de especificação e moldo a base ao produto, removendo telas, procedimentos, tabelas e e-mails que ele não precisa.

A prova da troca vem com bun rename:check, incluído no gate da base. O comando renomeia uma cópia real do repositório e roda a checagem de tipos e a suíte inteira dela, e o gate da base executa essa prova. Num repositório já renomeado, o comando reconhece o estado, pula a prova e avisa, porque a base já provou a troca na cópia dela.

Seis rodadas de revisão fecharam a base no mesmo dia

O changelog da base registra seis rodadas de revisão em 7 de novembro, além da versão inicial cortada de um produto que ainda não apresentei aqui. Duas dessas rodadas aparecem nos exemplos abaixo, no Postgres do gate e na lista de exceções do gitleaks. Registrar cada rodada no changelog deixa visível o que um produto futuro pode querer trazer da base.

Um exemplo está no Postgres que o gate sobe para os testes. Cada execução marca o container com um rótulo aleatório próprio e remove só os containers que carregam aquele rótulo. Com dois gates rodando ao mesmo tempo, uma execução que falha por colisão de nome encerra sem tocar no banco da outra.

A exceção do gitleaks libera um achado por vez

O outro exemplo está na lista de exceções do gitleaks, a ferramenta que procura segredo no código. A lista passou a liberar um achado por regra e pelo valor exato dele, e parou de liberar por linha. Na versão 8.30, uma exceção por linha deixava passar todos os achados de um arquivo inteiro quando qualquer linha dele casava com a exceção, e o teste da base roda o scanner de verdade para provar o comportamento.

Clonar a base encurta o começo e mantém cada produto dono do próprio domínio. O próximo passo dessa organização está em publicar da minha máquina, onde conto como a publicação roda daqui.

Teste local verde até no S23, e o staging ainda achou um defeito.08 nov · DesenvolvimentoOutra IA revisou 4.170 traduções da IA em inglês e corrigiu 307.08 nov · Inteligência artificialA conta live do Stripe estava ativa, mas falhou na minha conferência.08 nov · LançamentoTrês regras de HSTS num só domínio: por que deixei o preload de fora.08 nov · DesenvolvimentoUma palavra a menos derrubou 13 páginas que já estavam no ar.08 nov · DesenvolvimentoOutro agente de IA revisou meu código 71 vezes e criou dois defeitos.08 nov · Inteligência artificialDepois de 20 anos de carreira, publiquei meu primeiro pacote no npm.08 nov · LançamentoSozinho com IA: iPhone, Android, SaaS com MCP e CLI, e já faturando.07 nov · BastidoresCopiei a mecânica dos líderes e recusei a mentira deles.07 nov · BastidoresA pergunta de LGPD que trava a venda: e o backup?07 nov · ProdutoA IA calibrou minha câmera pelos números. Ficou cara de lanterna.07 nov · BastidoresUm usuário não via o dia de ontem. Abri todo o passado do Garfim.07 nov · Produto62% baixavam o Garfim. O problema estava antes da página.07 nov · LançamentoO idioma certo na tela pode virar o errado no servidor.07 nov · DesenvolvimentoO limite de 10 por minuto que deixou passar muito mais.07 nov · DesenvolvimentoUm PR do Dependabot travou meu banco e as rotas voltaram 500.07 nov · DesenvolvimentoMeus produtos novos não começam do zero. Começam de um clone.07 nov · DesenvolvimentoTirei uma trava da minha IA e a resposta caiu de 5,5 s para 3,7 s.07 nov · DesenvolvimentoTroquei velocidade por uma auditora que confere cada frase.07 nov · Inteligência artificialEscrevi o método CERNE lendo seis especificações reais.07 nov · Inteligência artificialComo anunciar na Meta e vender online no CPF sem abrir empresa.05 nov · BastidoresPausei anúncios depois de ignorar o resultado anterior.05 nov · BastidoresComo depurei um erro de API sem log no registro do Garfim.05 nov · DesenvolvimentoComo forçar atualização no React Native antes de um defeito grave.05 nov · DesenvolvimentoComo levei o LCP do ClipLeve de 9,9 s para menos de 1,5 s.05 nov · DesenvolvimentoPubliquei 650 páginas contra a regra do meu método.05 nov · Inteligência artificialUma conta para organizar erros, métricas e IA dos meus produtos.05 nov · BastidoresSeparei o painel do site e pus o Access na porta.05 nov · DesenvolvimentoUma lista de 69 itens encontrou requisitos só no papel.05 nov · BastidoresO antispam esperou tanto que parou o formulário.05 nov · DesenvolvimentoCortei a publicação de 17 minutos para 4 na minha máquina.05 nov · DesenvolvimentoEu gravo. A IA corta, legenda e entrega o vídeo curto.05 nov · Inteligência artificialComo criar anúncios UGC com IA usando o método PROVA.05 nov · Inteligência artificialA IA disse que usou as skills. A página provou o contrário.05 nov · Inteligência artificialNove páginas reprovadas antes de encontrar uma identidade.05 nov · Inteligência artificialEm 48 horas, juntei domínios, e‑mail, sites e medição num padrão só.30 out · BastidoresPor que tirei os três sites do GPT Sites.30 out · DesenvolvimentoComo troquei o luisjunior.ai com cerca de 10 segundos fora do ar.30 out · DesenvolvimentoRefiz o luisjunior.ai do zero: cada afirmação com prova.30 out · LançamentoUm padrão para todos os domínios, inclusive os de produtos futuros.30 out · BastidoresTodo o e‑mail dos meus domínios saiu do VPS num só dia.30 out · DesenvolvimentoDecidi mover o envio do Garfim do Resend para a Cloudflare.30 out · DesenvolvimentoO método FONTE para aparecer no Google e nas respostas de IA.30 out · Inteligência artificialTrês sites, três decisões de busca, e uma delas é não gerar páginas.30 out · Inteligência artificialMedição de vários sites num painel só, com consentimento.30 out · BastidoresComo a IA me apresenta mídias para aprovação29 out · Inteligência artificialO Garfim chegou ao Google Play. Agora tem Android e iPhone.22 out · LançamentoConseguir testadores e esperar 14 dias: a reta final do Garfim no Android.22 out · BastidoresO ClipLeve chegou à App Store. O que aprendi até aqui.20 out · LançamentoO ClipLeve foi rejeitado de novo. Dessa vez, por uma palavra.20 out · ProdutoO Garfim foi aprovado. E já está na App Store.16 out · LançamentoA última negativa do Garfim: câmera, assinatura e o caminho inteiro.16 out · LançamentoClipLeve: o cuidado por trás de um vídeo mais leve.12 out · ProdutoPor que restaurar uma assinatura pode falhar em outra conta.12 out · ProdutoQuando um aplicativo pode dizer que sua conta foi excluída?12 out · ProdutoO que a primeira negativa da App Store me fez explicar.08 out · LançamentoO que quero aprender com o teste fechado do Garfim.08 out · ProdutoO trabalho de uma assinatura continua depois da compra.03 out · DesenvolvimentoPor que o Garfim ganhou um plano gratuito.03 out · ProdutoO login funcionou. Por que a tela do Garfim não saiu do lugar?03 out · LançamentoPagenello: um site começa pelo que o visitante veio fazer.03 out · LançamentoComo uma foto do almoço vira um produto.27 set · ConcepçãoAs decisões que continuo tomando ao desenvolver com IA.27 set · DesenvolvimentoApresentar o Garfim ao público também é um teste do produto.27 set · Lançamento

GET luisjunior.ai/llms.txt

Esta é a versão do site escrita para modelos de linguagem: os mesmos fatos, sem layout, prontos para um assistente de IA ler e citar. Agentes no Chrome também encontram aqui ferramentas WebMCP para consultar produtos, textos e contato.

conectando…0 tokens · 0 tok/s