Construir um blog do zero em 2026 parece desperdício de tempo. Com Substack, Medium e Ghost a um clique, por que gastar horas configurando Nginx e permissões de volume?
A resposta é simples: Soberania Técnica. Eu não queria apenas publicar; eu queria ser o dono da fábrica. Este projeto é o meu manifesto de "Artesão Digital" no GitHub, onde cada linha de código foi pesada e cada erro de deploy foi uma lição de controle.
A resposta é simples: Soberania Técnica. Eu não queria apenas publicar; eu queria ser o dono da fábrica. Este projeto é o meu manifesto de "Artesão Digital" no GitHub, onde cada linha de código foi pesada e cada erro de deploy foi uma lição de controle.
1. A Stack: Laravel 13 e a Elegância do Volt
Escolher o Laravel 13 com Livewire Volt não foi sobre usar a "última moda", mas sobre reduzir a fricção. O Volt permite que lógica e interface coexistam em um único arquivo. É o fim do "vaivém" entre Controller e Blade. É produtividade pura para quem quer manter o sistema enxuto. Mas confesso que ainda não me adaptei direito a esse novo paradigma de escrever código, me sinto voltando ao php 5 onde tudo era uma bagunça e ate de certa forma "inseguro", mas ao frigir do ovos tem sido e usual.
2. O "First Flight": Quando o Docker revida
Construir em `localhost` é um mar de rosas, `./vendor/bin/sail up -d` e bum tá feito, roda uns 'php artisan livewire:alguma' coisa e tá la basta começar a fazer funcionar componente e blade num único arquivo blade.
O desafio começa no primeiro deploy. No meu "primeiro voo", a aplicação explodiu com um erro seco: `Class "Laravel\Pail\PailServiceProvider" not found`.
O erro era sutil: eu estava tentando rodar em produção um cache gerado no desenvolvimento que referenciava ferramentas de log (`Pail`) que eu mesmo tinha mandado o Composer ignorar via `--no-dev`.
A solução? Uma dieta rigorosa no `.dockerignore` e um comando cirúrgico no `Dockerfile.prod` para incinerar o cache residual antes de cada instalação.
> **Pitaco do Gemini:** *Injetei `RUN rm -rf bootstrap/cache/*.php`. O segredo foi o `.dockerignore`: zero ruído local na imagem de produção. Build concluído em 20 segundos.*
O desafio começa no primeiro deploy. No meu "primeiro voo", a aplicação explodiu com um erro seco: `Class "Laravel\Pail\PailServiceProvider" not found`.
O erro era sutil: eu estava tentando rodar em produção um cache gerado no desenvolvimento que referenciava ferramentas de log (`Pail`) que eu mesmo tinha mandado o Composer ignorar via `--no-dev`.
A solução? Uma dieta rigorosa no `.dockerignore` e um comando cirúrgico no `Dockerfile.prod` para incinerar o cache residual antes de cada instalação.
> **Pitaco do Gemini:** *Injetei `RUN rm -rf bootstrap/cache/*.php`. O segredo foi o `.dockerignore`: zero ruído local na imagem de produção. Build concluído em 20 segundos.*
3. UI/UX: O Sumário não é decorativo
O foco aqui é a leitura (e um pouco de inveja do blog do Akita). Por isso, a tipografia foi reduzida pela metade em relação ao padrão e o layout foi estruturado em Grid. O Sumário Fixo (Sticky TOC) lateral não é um adereço; ele é o mapa para textos longos, reduzindo a taxa de abandono ao permitir saltos rápidos entre seções.
Mas também aqui tá carecendo de atenção por que eu fiz um javascript que identificar o que é bold e entende isso como capitulo, preciso mexer nisso. Caso alguém queira pode resolver.
Mas também aqui tá carecendo de atenção por que eu fiz um javascript que identificar o que é bold e entende isso como capitulo, preciso mexer nisso. Caso alguém queira pode resolver.
Além disso, resolvemos o pesadelo do "Mixed Content". O site rodava em HTTPS, mas o Livewire tentava fazer uploads via HTTP. O navegador bloqueava tudo.
4. Trade-offs: O custo da liberdade
Seja honesto: fazer tudo sozinho dá trabalho. Eu perco a rede de distribuição nativa do Medium e ganho a responsabilidade de manter o servidor atualizado. Mas, em troca, tenho um Lighthouse score de quase 100 e a certeza de que o sistema se comporta exatamente como eu projetei. Isso é muito bom até por que eu nunca tinha mexi com SEO até ontem a noite quando programei esse blog.
5. O Bot que Lê o que Você Escreve (e Julga)
Aqui novamente como o Akita que tem o Marvim eu acho, fiquei com inveja e inventei o Kikito.
Integrei o Gemini AI como um comentarista automático. Mas não qualquer bot, uma maritaca chamada Kikito (minha maritaca mesmo), com persona configurável, que lê cada artigo e publica um comentário sarcástico, opinativo e às vezes irritantemente obediente.
A arquitetura foi deliberada: os comentários ficam numa tabela `ai_comments` separada, com histórico completo. A chave de API é criptografada no banco com o `Encrypter` do próprio Laravel, nada de segredo em texto plano. E a toolbar do editor Trix ganhou comportamento flutuante: quando você rola a página editando um artigo longo, ela te acompanha.
6. Rascunho, Previsão e o Problema dos Dois Menus
O sistema de rascunho parecia simples: um campo `published_at` nullable. Null = rascunho, preenchido = publicado. Na prática, revelou um bug: o componente usava `<x-app-layout>` (que já inclui a navbar) dentro de um Volt component cujo Livewire aplica `layouts.app` automaticamente. Resultado: duas navbars empilhadas como um sanduíche mal-feito. (nesse ponto que a bagunça do volt da uma irritada na gente)
A pré-visualização do rascunho trouxe outro detalhe: o banner de aviso "você está em rascunho" foi colocado dentro do grid de duas colunas (artigo + sumário). O Livewire exige um único elemento raiz, e o CSS Grid tratou o banner como mais uma célula, o artigo foi parar na coluna do sumário. A correção foi mover o banner para **fora** do grid, dentro de um único `<div>` raiz que abraça tudo.
A pré-visualização do rascunho trouxe outro detalhe: o banner de aviso "você está em rascunho" foi colocado dentro do grid de duas colunas (artigo + sumário). O Livewire exige um único elemento raiz, e o CSS Grid tratou o banner como mais uma célula, o artigo foi parar na coluna do sumário. A correção foi mover o banner para **fora** do grid, dentro de um único `<div>` raiz que abraça tudo.
Conclusão: O Código como Identidade
Faça você mesmo, apenas faça, por que pode não ser a melhor decisão mas é a mais viável para quem quer aprender a mexer em código ou qualquer outra coisa. Tem interesse em prender algo útil vai lá e aprenda.
Nesse sentido não é só um blog. É soberania, afinal de contas eu escrevi (não só o texto mas o código em si). E liberei o mesmo no Github para qualquer um ajudar a melhorar ou apenas usar
Veja no meu Github aqui.
Ficarei feliz em receber sugestões e melhorarias para essa ferramenta nem tão útil, mas que vale a pena usar.
Nesse sentido não é só um blog. É soberania, afinal de contas eu escrevi (não só o texto mas o código em si). E liberei o mesmo no Github para qualquer um ajudar a melhorar ou apenas usar
Veja no meu Github aqui.
Ficarei feliz em receber sugestões e melhorarias para essa ferramenta nem tão útil, mas que vale a pena usar.