Construindo Soledade

· PABLO'S DEVLOG


Há um tempo eu vi algo extremamente interessante, um projeto chamado Nightfall City e achei fantástico de uma pessoa que usa o pseudônimo de m15o, e achei fascinante.

Comecei a seguir de perto os projetos do m15o e quanto mais eu aprendia, mais queria entender sua criatividade e capacidade de modificar recursos e criar coisas novas.

Uma coisa me chamou mais atenção, dentre todas as coisas que vi: o protocolo que foi utilizado para Nightfall City.

Então me ocorreu que eu poderia talvez criar meu próprio protocolo e iniciar um projeto similar baseado inteiramente nele.

Então iniciei a construção do SOLED/2.

O que é #

Soledade se apresenta como “um blog textual, quieto e feito à mão”. Por baixo dessa frase existe uma metáfora que organiza o sistema inteiro: o site é uma pequena cidade.

Nada disso depende de JavaScript no navegador. O visitante recebe apenas HTML e CSS — a cidade é estática, e a lógica toda vive antes, no momento em que o texto é publicado.


A cidade por dentro #

Cidadãos, bairros e casas #

A cidadania é aberta: qualquer pessoa se registra por terminal, escolhe um handle e recebe uma identidade técnica (um segredo com hash SHA-256 — não é documento oficial). A partir daí já pode publicar. O Prefeito modera depois, se precisar.

A cada texto publicado corresponde um arquivo .md dentro de content/, com um pequeno cabeçalho YAML (o front matter) que diz o título, o bairro, as tags e a data:

1---
2title: "A canção de Cassilda"
3citizen: "pablo"
4district: "cinema"
5tags: ["ensaio", "carcosa"]
6date: "2026-06-01"
7---
1# O corpo do texto vem aqui, em Markdown.

Como funciona #

A arquitetura em uma frase #

Publicar é gravar um arquivo. Ler é um cat. A partir dessa ideia, o sistema tem três peças de infraestrutura e um pacote Python que costura tudo — sem Django, sem Flask, sem framework web.

Duas portas TCP, dois papéis #

A cidade não tem login no navegador. Toda a escrita e leitura “por dentro” acontece por TCP puro, atendido por dois pequenos servidores escritos só com a biblioteca padrão do Python:

O caminho de um texto até a web #

 1você, no terminal (ncat)
 2        |
 3        | porta 1915 · SOLED/2 + identidade
 4        v
 5
 6public/         ── HTML estático
 7        |
 8        v
 9
10Caddy :443      ── HTTPS automático
11        |
12        v
13
14navegador

O build.py limpa a pasta public/ e a regenera inteira a cada vez: páginas, índices por ano/mês, páginas de bairro, tags, feeds RSS (global, por cidadão e por bairro), sitemap.xml, 404 e um endpoint de saúde. O visitante final só toca em arquivos estáticos servidos pelo Caddy, que cuida do HTTPS sozinho.


A experiência #

Publicar por linha de comando #

Como não há formulário, o cidadão monta um “pacote de texto” e envia com ncat (ou nc). O site inclui um guia inteiro para isso. Um envio SOLED/2 tem esta forma — a identidade real fica no lugar do marcador:

 1# enviar um texto para a cidade (porta 1915)
 2
 3SOLED/2
 4CITIZEN pablo
 5IDENTITY <sua-identidade-cidadã>
 6PATH citizens/pablo/posts/meu-texto.md
 7
 8---
 9title: "Meu texto"
10district: "cinema"
11---
12
13# Corpo do texto
14
15.

O protocolo tem mais verbos: REGISTER (virar cidadão), PREVIEW (validar sem gravar), LIST (listar seus arquivos) e RECOVER (recuperar a identidade). Há limite de taxa por IP e moderação — banir IP ou cidadão — quando necessário.


Ficha técnica #

Do que a cidade é feita #

A apresentação é um único arquivo base.html: tema escuro, fonte monoespaçada, CSS embutido, nenhum pipeline de front-end. Toda a instalação em servidor é um script bash idempotente que prepara pacotes, venv, systemd, Caddy e firewall de uma vez.


Por que assim #

A filosofia de design #

Feito em texto. Servido por silêncio. Lido por navegador ou terminal.

— o rodapé de toda página em Soledade

Soledade é, no fim, uma aposta calma: que um lugar de escrita pode existir sem métricas, sem infinito scroll e sem algoritmo — só casas, bairros e palavras. A cidade está aberta, e a cidadania também.

Visite a cidade em soledade.city :)

last updated: