Pitch: Anatomia do Vivo de Codigo: Como Construi um Blog com Stack de Startup
Como Construí um Blog que Parece Startup Unicórnio com $0/mês
Depois de 21 anos desenvolvendo para empresas, criei um blog pessoal que roda pipeline ML autônomo, knowledge graph caseiro e publica posts sozinho. Por que não usar WordPress? Porque cada projeto é uma chance de experimentar tecnologias que vou usar nos próximos clientes.
A Stack Completa: Decision Log Real
Frontend: Next.js 16 + React 19 na Vercel
Database: PostgreSQL + pgvector no Supabase
Backend: 10 containers Docker na Oracle Cloud (grátis)
Pipeline: 12 crons Python + FastAPI + MinIO
Resultado: 27 posts publicados, ~2.000 palavras cada, custo mensal praticamente zero.
Por Que Next.js 16 Venceu Astro e Hugo
Considerei Astro (melhor performance), Hugo (velocidade insana) e até WordPress (ecossistema gigante). Next.js venceu por três razões técnicas:
1. Server Components para ML: Posso rodar machine learning direto no servidor, sem API calls. O sistema de segmentação de anúncios roda como server component.
2. ISR + On-Demand Revalidation: Quando o pipeline publica um post, um webhook revalida apenas páginas necessárias. Sem rebuild completo.
3. Flexibilidade híbrida: Páginas estáticas (posts), dinâmicas (busca) e híbridas (comentários) na mesma aplicação.
Trade-offs aceitos:
- Bundle maior que Astro (Vercel Edge resolve)
- Mais complexo que Hugo (JavaScript é nativo pra mim)
- Build time: ~2min para 27 posts
- First Contentful Paint: ~0.8s
PostgreSQL + pgvector: O Cérebro da Operação
Supabase entrega PostgreSQL com pgvector nativo. Isso significa embeddings vetoriais de 384 dimensões rodando direto no banco, sem Pinecone ou Weaviate.
-- Busca semântica real rodando em produção
SELECT
p.title,
p.slug,
1 - (p.embedding <=> $1::vector) as similarity
FROM posts p
WHERE 1 - (p.embedding <=> $1::vector) > 0.7
ORDER BY similarity DESC
LIMIT 10;
Por que não Pinecone: 70/mês vs 0/mês no Supabase. Com 27 posts, pgvector entrega a mesma qualidade.
Knowledge Graph caseiro: Relacionamentos entre posts, tags e conceitos armazenados como JSONB. Busca por "React" traz posts sobre Next.js automaticamente.
Pipeline ML Sem GPU: Como Funciona
O segredo está na Oracle Cloud Free Tier: 4 OCPUs ARM + 24GB RAM grátis para sempre. Rodo 10 containers Docker:
# Geração de embeddings com sentence-transformers
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
def generate_embedding(text):
# Limpa e processa o texto
clean_text = preprocess_content(text)
# Gera embedding 384-dimensional
embedding = model.encode(clean_text)
return embedding.tolist()
Pipeline completo:
- Cron coleta conteúdo (Notion API)
- IA processa e otimiza texto
- Gera embeddings vetoriais
- Publica no banco + CDN
- Revalida Next.js via webhook
Custo: $0 (Oracle Free Tier)
Tempo: Post completo em ~3 minutos
Vercel + Cloudflare: CDN Duplo
Configuração inusitada: Vercel como origem, Cloudflare como proxy. Por quê?
- Vercel: Deploy automático, Edge Functions
- Cloudflare: Cache agressivo, proteção DDoS, analytics detalhados
Resultado: TTFB médio de 89ms no Brasil, 134ms na Europa.
Analytics Próprio: Umami + Dados Customizados
Google Analytics não basta para decisões de produto. Rodo Umami self-hosted + coleta customizada:
- Tempo real de leitura (não estimativa)
- Scroll depth por seção
- Origem do tráfego (dev.to, LinkedIn, direto)
- Performance por dispositivo
Tudo armazenado no mesmo PostgreSQL, queries em tempo real.
Custos Reais: A Planilha Completa
- Vercel: $0 (Hobby Plan)
- Supabase: $0 (Free Tier - 500MB usado de 500MB)
- Oracle Cloud: $0 (Free Tier permanente)
- Cloudflare: $0 (Free Plan)
- Domínio: R$ 40/ano
Total mensal: ~R$ 3,33
Resultados em Produção
Performance:
- Core Web Vitals: 100/100 no PageSpeed
- First Contentful Paint: 0.8s
- Time to Interactive: 1.2s
Escalabilidade testada:
- 1.000 posts simultâneos (stress test)
- 50 requests/segundo sem degradação
- Pipeline processa 10 posts/hora
Lições Aprendidas: O Que Faria Diferente
- Começaria com Astro: Para blog puro, performance > flexibilidade
- Redis para cache: PostgreSQL aguenta, mas Redis seria mais elegante
- Testes desde o início: Pipeline complexo = bugs complexos
Leia o artigo completo com todos os exemplos de código e diagramas em https://vivodecodigo.com.br/backend/anatomia-vivo-de-codigo-arquitetura-blog-tech