
LifeLog nasce — o blog que documenta a jornada
Por que mais um blog?
Eu passei os últimos meses construindo — Arachne, Capivara, Dogwalk, TatuEngine, portfólio. Cada projeto gerou decisões, bugs, pivôs, aprendizados. Mas tudo ficava na minha cabeça ou, quando muito, em notas soltas no Obsidian que ninguém mais via.
Aí me peguei pensando: quantas vezes eu resolvi um problema difícil, documentei a solução num arquivo .md dentro do repositório, e meses depois nem lembrava que tinha escrito?
Não é sobre ego ou “construir audiência”. É sobre:
- Registro público — as decisões que tomei, os erros que cometi, os acertos que funcionaram
- Referência futura — daqui 6 meses, quero poder procurar “como eu fiz o deploy do Arachne no VPS?” e achar o post
- Disciplina — escrever força organização mental. Se não consigo explicar, não entendi direito
- Troca — talvez alguém esbarre num post e poupe horas de debug
O nome LifeLog veio naturalmente. Não é um blog tradicional com editorial e pauta — é o log da vida de dev. O que tô fazendo, o que tô aprendendo, o que deu errado.
A stack — Astro 7 + MDX
Escolher a stack foi mais rápido do que eu esperava. Eu já conhecia Astro de outros projetos, e a versão 7 trouxe:
- Content Collections tipadas com schema Zod — frontmatter validado em build
- MDX nativo — JSX dentro de markdown sem plugins extras
- Shiki syntax highlighting com temas light/dark automáticos
- Zero JS por padrão — posts são HTML puro, só carregam script se tiver interatividade
# Criar o projeto foi questão de minutos
npm create astro@latest lifelog -- --template basics
npx astro add mdx
npx astro add tailwind
O schema do post ficou enxuto:
// src/content/config.ts
import { defineCollection, z } from 'astro:content'
const posts = defineCollection({
type: 'content',
schema: z.object({
title: z.string(),
description: z.string(),
date: z.date(),
pubDate: z.date().optional(),
project: z.enum(['arachne', 'dogwalk', 'portfolio', 'capivara',
'tatuengine', 'estudos', 'descobertas']),
tags: z.array(z.string()),
icon: z.string().optional(),
cover: z.string().optional(),
featured: z.boolean().default(false),
draft: z.boolean().default(false),
}),
})
Cada post vira uma rota automaticamente. A tipagem é tão forte que se eu errar o nome de uma tag no frontmatter, o build quebra. Isso evita o “blog sujo” que a maioria abandona depois de 3 posts.
Por que não Notion / Substack / Medium?
Já usei todos. Sempre a mesma história: começo animado, escrevo 4 posts, a plataforma muda o layout, meus links quebram, o lock-in me irrita, abandono.
Com Astro + MDX:
- Arquivos
.mdxnum diretório — portável pra qualquer stack - Git versionado — cada post tem histórico de alteração
- Build estático — deploy em qualquer lugar (Vercel, Cloudflare, Netlify, S3)
- Sem banco, sem CMS, sem dashboard — só
git push
O deploy vai pra Vercel via GitHub Actions:
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm ci
- run: npm run build
- run: npx vercel deploy --prod --token=${{ secrets.VERCEL_TOKEN }}
Build em ~30 segundos. Post novo no ar em 1 minuto depois do push. Zero infra pra gerenciar.
O TerminalWidget — o toque interativo
A maioria dos posts termina com um componente terminal fake que resume as ideias:
Ele não serve pra nada além de ser divertido — e é exatamente por isso que funciona.
O que esperar daqui
Esse blog vai cobrir:
- Histórico — posts retrospectivos sobre decisões passadas (como este)
- Tempo real — o que estou fazendo agora, problemas atuais
- Descobertas — ferramentas, técnicas, papers que mudaram meu fluxo
- Código — snippets reais, não pseudocódigo bonitinho
Sem periodicidade fixa. Sem SEO obsession. Sem Newsletter. Só o log da jornada.
“A consistência supera a perfeição.” — eu mesmo, nos meus infinitos drafts que nunca publiquei
Esse post é o primeiro. O commit 1a2b3c4 no repositório. Daqui a um ano quero poder scrollar e ver o caminho.