Moon Flower Society > Murad Terminal: uma BBS elegante e centrada
Arquitetura autoral e viável para um arquivo textual interativo com alma de BBS, acessível pela web, SSH e Telnet.
Posted June 22, 2026. Markdown. Tags: terminal, bbs, arquitetura, indieweb, zine, go, ansi, markdown.
Uma proposta simples, bonita e viável para um site-terminal com alma de BBS, sem nostalgia vazia nem excesso de arquitetura.
Projeto: Murad Terminal / site-BBS / arquivo textual interativo
Versão inicial: 22 de junho de 2026
O projeto não deve ser “uma BBS genérica instalada em um servidor”.
Também não deve ser “um site comum fingindo ser terminal”.
A forma mais elegante é esta:
Um sistema editorial em terminal, com alma de BBS, acessível por Web, SSH e Telnet.
Ou seja:
A BBS, aqui, não é o protocolo.
A BBS é o ritual: entrar, explorar, ler, deixar uma marca, descobrir arquivos, navegar por menus, sentir que existe uma comunidade/arquivo vivo do outro lado.
Web para alcance. Terminal para ritual. Markdown para preservação. ANSI para alma.
Essa frase deve guiar quase todas as decisões.
Quando surgir uma dúvida técnica, pergunte:
Se for só vaidade técnica, corte.
O Murad Terminal deve ser um lugar para:
O projeto deve parecer menos um “site” e mais um nó textual.
Exemplo de abertura:
╔════════════════════════════════════════════════════╗
║ MURAD TERMINAL ║
║ TEXTMODE ARCHIVE NODE ║
╚════════════════════════════════════════════════════╝
NODE: SAO-PAULO / ARCHIVE
MODE: PUBLIC
STATUS: ONLINE
[1] Biblioteca
[2] Zines
[3] Logs
[4] ANSI/ASCII
[5] Guestbook
[6] Sobre
[7] Ajuda
[0] Sair
murad@terminal:~$
O projeto não deve virar:
A armadilha é clara: gastar 90% do tempo criando infraestrutura e 10% criando experiência.
Tem que ser o contrário.
A arquitetura mais limpa é separar o projeto em cinco camadas:
┌────────────────────────────────────────────┐
│ Entrada │
│ Web Terminal / SSH / Telnet │
└────────────────────────────────────────────┘
↓
┌────────────────────────────────────────────┐
│ Sessão │
│ estado, usuário, caminho atual, tamanho │
└────────────────────────────────────────────┘
↓
┌────────────────────────────────────────────┐
│ Motor de Comandos │
│ help, ls, open, search, back, random │
└────────────────────────────────────────────┘
↓
┌────────────────────────────────────────────┐
│ Motor Editorial │
│ Markdown, índice, zines, biblioteca │
└────────────────────────────────────────────┘
↓
┌────────────────────────────────────────────┐
│ Armazenamento │
│ arquivos + SQLite │
└────────────────────────────────────────────┘
O núcleo não deve se importar se o visitante veio por Web, SSH ou Telnet.
Ele recebe:
input do usuário
e devolve:
saída textual/ANSI
Essa separação evita criar três sistemas diferentes.
A stack mais elegante e centrada para uma versão autoral é:
Go
Wish
Bubble Tea opcional
xterm.js
SQLite
Markdown + frontmatter
Caddy ou Nginx
Docker
Porque Go é uma ótima escolha para esse tipo de projeto:
Python seria excelente para protótipo rápido.
Rust seria excelente para obsessão técnica.
Go é o melhor meio-termo para produto pequeno, elegante e público.
Porque ele permite criar aplicações acessíveis por SSH. O visitante pode conectar com:
ssh guest@terminal.seudominio.com -p 2222
e cair direto no Murad Terminal, sem shell real do servidor.
Wish também se integra com Bubble Tea, caso você queira interfaces TUI mais sofisticadas no futuro.
Porque permite colocar um terminal de verdade dentro do navegador.
Assim, uma pessoa comum pode entrar por:
https://terminal.seudominio.com
sem instalar nada.
Porque o sistema dinâmico inicial é pequeno.
SQLite basta para:
PostgreSQL só faria sentido depois, se o projeto crescer de verdade. Antes disso é peso morto.
A maioria das pessoas deve entrar pela Web.
https://terminal.seudominio.com
A página inicial deve ter:
A Web é a vitrine.
O terminal é o ritual.
A experiência mais bonita para usuário técnico deve ser SSH:
ssh guest@terminal.seudominio.com -p 2222
O usuário guest não deve abrir shell.
Ele deve cair direto no app.
Nada de:
/bin/bash
Nada de shell real.
Nada de comandos do sistema.
A sessão SSH deve ser apenas uma interface para o Murad Terminal.
Telnet deve existir, mas com limites:
telnet terminal.seudominio.com 2323
Regras:
Telnet é estética e homenagem.
SSH é operação segura.
Web é alcance.
O conteúdo deve viver em arquivos, não no banco.
Estrutura recomendada:
content/
about.md
help.md
zines/
murad-press-001/
index.md
terminal.md
zine.pdf
cover.txt
meta.yaml
terminal-notes-001/
index.md
terminal.md
meta.yaml
biblioteca/
historia/
index.md
textos/
tecnologia/
index.md
textos/
cinema/
index.md
textos/
saude-mental/
index.md
textos/
logs/
2026-06-22-primeiro-node.md
manifestos/
manifesto-do-terminal.md
ansi/
gallery.md
Regra:
Markdown é fonte. TXT/ANSI/HTML/PDF são exportações.
Isso evita bagunça. Se cada formato virar “fonte”, o projeto morre em inconsistência.
Cada texto importante deve ter metadados.
Exemplo:
---
title: "Manifesto do Terminal"
slug: "manifesto-do-terminal"
section: "manifestos"
date: "2026-06-22"
status: "published"
tags: ["terminal", "bbs", "arquivo", "zine"]
terminal_width: 80
---
Isso permite gerar:
O banco guarda apenas o que muda.
SQLite inicial:
guestbook (
id INTEGER PRIMARY KEY,
nick TEXT NOT NULL,
message TEXT NOT NULL,
approved INTEGER DEFAULT 0,
created_at TEXT NOT NULL
);
sessions (
id TEXT PRIMARY KEY,
ip_hash TEXT,
entrypoint TEXT,
started_at TEXT,
last_seen TEXT
);
events (
id INTEGER PRIMARY KEY,
event_type TEXT NOT NULL,
metadata TEXT,
created_at TEXT NOT NULL
);
Não coloque artigo, zine e manifesto no banco no começo.
Isso é erro clássico.
Conteúdo editorial precisa ser versionado com Git.
O terminal deve aceitar dois modos ao mesmo tempo:
Para visitante casual:
[1] Biblioteca
[2] Zines
[3] Logs
[4] Guestbook
[0] Sair
Para visitante curioso:
help
map
ls
cd zines
open 001
back
home
search bbs
random
guestbook
about
clear
exit
O erro seria escolher só um.
Menu puro fica bobo.
Comando puro assusta usuário comum.
Híbrido é o caminho certo.
help mostra ajuda
map mostra mapa do terminal
ls lista itens da seção atual
cd entra em seção
open abre item
back volta
home volta ao início
search busca textos
random abre item aleatório
about explica o projeto
clear limpa tela
exit encerra sessão
fortune mostra frase/fragmento aleatório
whoami mostra identidade da sessão
now mostra horário do node
motd mensagem do dia
guestbook abre livro de visitas
nfo mostra informações do sistema/projeto
invoke qel
sudo open arcana
hack reality
open blackbox
Easter egg bom é tempero.
Easter egg demais vira adolescente demais.
O leitor de textos precisa ser simples e confortável.
Comandos durante leitura:
n próxima página
p página anterior
q sair
h ajuda
/ buscar dentro do texto
g ir para início
G ir para fim
Cada página deve mostrar:
Título
Seção
Página atual
Comandos básicos
Exemplo:
┌──────────────────────────────────────────────────────┐
│ Murad Press #001 │
│ O Manifesto do Arquivo │
└──────────────────────────────────────────────────────┘
Todo arquivo é uma conversa com o futuro.
A web moderna ficou lisa demais: rápida, rastreável,
otimizada, previsível. O terminal exige presença.
[p 1/4] [n] next [p] prev [q] quit
Nada de linhas com 140 caracteres.
Terminal bom respeita largura.
Largura recomendada:
80 a 100 colunas
A estética deve ser:
BBS + terminal Unix + zine + arquivo oculto + laboratório textual
Mas com controle.
Use pouco:
Ciano comandos e links
Amarelo destaques
Cinza texto normal
Branco títulos
Verde status OK
Vermelho erros/alertas
Magenta áreas especiais
Se tudo brilha, nada importa.
ANSI demais fica carnavalesco e cansa.
╔════════════════════════════════════════════════════╗
║ MURAD TERMINAL ║
╚════════════════════════════════════════════════════╝
╔═══▒▓█☠☠☠ CYBER OCCULT HACKER BBS 3000 ☠☠☠█▓▒═══╗
A segunda parece paródia. Use com cuidado.
O terminal precisa ter voz própria.
Não precisa fingir que é hacker anos 1990.
Isso seria cosplay.
A voz ideal:
Exemplo:
[SYS] Este arquivo ainda está incompleto.
[SYS] Arquivos incompletos também dizem alguma coisa.
Ou:
[WARN] Nada encontrado. Ou você procurou mal, ou o arquivo está mentindo.
Isso é muito melhor do que “access granted” repetido como clichê.
Arquivo organizado de textos.
/biblioteca
historia
tecnologia
cinema
saude-mental
ocultismo
literatura
Publicações numeradas e fechadas.
/zines
murad-press-001
terminal-notes-001
arcana-brief-001
Zine precisa ter edição, capa, sumário e fechamento.
Se for só “um monte de post”, não é zine.
Notas curtas de laboratório.
/logs
2026-06-22-primeiro-node
2026-06-23-parser-markdown
Logs podem ser mais crus.
Eles dão sensação de arquivo vivo.
Galeria visual.
/ansi
logos
banners
dividers
experiments
Livro de visitas.
Campos:
Precisa de moderação.
Guestbook sem moderação vira lixão de bot.
murad-terminal/
cmd/
terminald/
main.go
internal/
app/
app.go
session.go
router.go
adapters/
ssh/
telnet/
websocket/
content/
loader.go
indexer.go
markdown.go
search.go
render/
ansi.go
pager.go
menu.go
wrap.go
storage/
sqlite.go
guestbook.go
events.go
content/
about.md
help.md
zines/
biblioteca/
logs/
manifestos/
ansi/
welcome.ans
main-menu.ans
goodbye.ans
web/
index.html
terminal.html
assets/
data/
terminal.db
Dockerfile
docker-compose.yml
README.md
conexão aberta
↓
cria Session
↓
detecta entrada: web / ssh / telnet
↓
mostra welcome.ans
↓
mostra menu principal
↓
recebe comando
↓
Router interpreta
↓
Content Engine busca conteúdo
↓
Renderer formata saída
↓
Adapter envia ao usuário
↓
repete até exit/timeout
A página web não precisa ser cheia de coisa.
Ela deve ter:
MURAD TERMINAL
[Entrar pelo navegador]
Também disponível via:
ssh guest@terminal.seudominio.com -p 2222
telnet terminal.seudominio.com 2323
Ao clicar, abre o xterm.js.
Fluxo:
Browser
↓
xterm.js
↓
WebSocket
↓
murad-terminal core
Não exponha shell real via navegador.
O navegador fala com o app, não com /bin/bash.
VPS simples com Debian.
Portas:
443 HTTPS / Web terminal
2222 SSH público do app
2323 Telnet público do app
Evite porta 23 para Telnet.
Ela atrai ruído automático de bot.
Use Caddy ou Nginx para:
Rode o app isolado.
container:
usuário sem root
filesystem read-only quando possível
volume para content/
volume para data/
O app nunca deve ter permissão ampla no servidor.
Regras sem romantismo:
A estética pode ser hacker.
A operação não pode ser amadora.
A primeira versão boa não precisa ter mil coisas.
Ela precisa ter poucas coisas muito bem resolvidas.
help, map, ls, open, back, home, random, exit./zines./biblioteca./about.fortune.Não meça pelo número de features.
Meça por perguntas melhores:
Se a resposta for sim, está funcionando.
O erro mais provável seria este:
tentar criar uma BBS completa antes de criar um arquivo interessante.
Não faça isso.
Crie primeiro:
Depois expanda.
Sem conteúdo, a stack é só decoração.
┌──────────────────────┐
│ terminal.seudominio │
└──────────┬───────────┘
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
Web/xterm.js SSH/Wish Telnet/2323
│ │ │
└────────────────┼────────────────┘
▼
Murad Terminal Core
│
┌───────────────────┼───────────────────┐
▼ ▼ ▼
Markdown SQLite ANSI/TXT
conteúdo dinâmico estética
A versão mais elegante e centrada é:
Go como núcleo
Wish para SSH
xterm.js para Web
Telnet em 2323 como modo retrô
Markdown como fonte editorial
SQLite para dados dinâmicos
ANSI/ASCII como linguagem visual
Docker + Caddy/Nginx para deploy
Mas a prioridade real não é a stack.
A prioridade é o conceito:
Murad Terminal é um arquivo vivo em modo texto. Uma biblioteca-zine acessível por terminal. Uma BBS sem a gordura de BBS. Um lugar para ler, explorar e deixar vestígios.
Essa é a forma mais forte.
Não tente competir com web moderna.
Use o terminal justamente porque ele faz outra coisa: ele desacelera, dá textura, cria presença e transforma leitura em exploração.
View the original Markdown file
Ideas | What changed | RSS | About | Text version
Pablo Murad <pablomurad@pm.me>