Voltar ao portfólio
No ar

deltalog

Blog técnico com CMS baseado em arquivos, sem banco de dados

Conteúdo versionado no Git, publicação por pull request e site estático. O CMS edita arquivos do próprio repositório.

Período08/2026 · atual · 1 mês
PapelProjeto pessoal, ponta a ponta: produto, arquitetura, código e deploy
CódigoRepositório privado, porque os rascunhos são arquivos versionados
Home do deltalog
01 / Contexto

O problema

Eu queria um lugar meu para registrar decisão técnica com o contexto ainda fresco: por que escolhi uma ferramenta, o que quebrou no caminho, o que eu faria diferente. Blog hospedado resolve a publicação e cria dois problemas no lugar. O conteúdo passa a morar em um banco que não é meu, e cada post depende de um editor que eu não controlo.

O que eu escrevo ali é o que eu vivi: problema que apareceu no meu trabalho, decisão que eu tomei, resultado que eu medi. Conteúdo assim envelhece junto com o projeto, então precisa ser versionado do mesmo jeito que código: revisável em diff, com histórico e reversível. Daí a decisão de base, que sustenta todas as outras: conteúdo em arquivos no próprio repositório, CMS por cima deles, zero banco de dados.

02 / Ferramentas

Stack

Clique em qualquer item para ver o que é e onde eu uso

03 / Como funciona

Arquitetura

App Router com quase tudo estático. Duas coleções em arquivo, lidas em Server Component, sem camada de dados no cliente.

  • Posts em .mdoc e ferramentas em .yaml, versionados no Git e editados pelo Keystatic em modo GitHub, que abre pull request em branch própria.
  • Um único leitor em escopo de módulo concentra as regras de listagem: filtro de rascunho, tempo de leitura, paginação e posts relacionados.
  • Busca e filtros funcionam com formulário GET e links. A página inteira funciona com JavaScript desligado.
  • Rota de admin e API do CMS devolvem 404 quando não existe GitHub App configurado.
  • Favicon, apple icon e cards de compartilhamento são gerados por código. Nenhuma imagem binária versionada.
Sumário e âncora saem do mesmo slug, gerado no transform do heading
Sumário e âncora saem do mesmo slug, gerado no transform do heading
Filtro inteiro em GET: a página funciona com JavaScript desligado
Filtro inteiro em GET: a página funciona com JavaScript desligado
Ferramenta é entidade, não tag: cada uma tem página e contagem de citações
Ferramenta é entidade, não tag: cada uma tem página e contagem de citações
Melhor jeito de ver: navegar no siteO blog está no ar, com o primeiro post publicado.