Trabalho
Cinco coisas construídas, com o estado verdadeiro e a parte difícil de cada uma.
Escolhi cinco em vez de listar tudo o que já construí. A razão está escrita no primeiro capítulo do guia de validação: uma pasta com quarenta projetos começados não é prova de criatividade, é o registo de quantas vezes a parte difícil foi adiada. Estas cinco abrem-se e verificam-se. Para cada uma escrevi qual foi o problema a sério, que costuma dizer mais sobre quem constrói do que a lista de tecnologias.
Compartmentalizer
Em produçãoPlataforma de deploy própria, em Python, numa VPS: recebe um commit, constrói a imagem Docker, verifica a saúde da versão nova e só depois a põe a servir. Cada aplicação corre isolada, com a sua base de dados, a sua rede e limites de recursos, e os backups saem cifrados para armazenamento externo todas as noites. É o que mantém este site e as restantes aplicações do estúdio no ar.
Não há link para abrir, porque não é um site. A prova é esta página: está a ser servida por ela neste momento, tal como as outras desta lista.
A parte difícil
Trocar a versão de uma aplicação sem a deitar abaixo. A nova só recebe tráfego depois de responder ao health check, com a antiga ainda de pé, e o sistema reverte sozinho se ela não responder. As aplicações que guardam chaves privadas são a exceção deliberada: essas param primeiro, porque duas instâncias a segurar a mesma chave é um problema pior do que um segundo de indisponibilidade.
Moto Spotters
OnlinePlataforma comunitária para motociclistas em Portugal: perfil e garagem, grupos, passeios com passaporte de carimbos verificados pelo organizador, gestão de motoclubes (sócios, quotas, documentos), compra e venda de motos entre particulares com mensagens internas, e um diretório de oficinas e lojas com pedidos de orçamento. Next.js e PostgreSQL, instalável como app, com moderação de conteúdo por LLM.
A parte difícil
A moderação. O conteúdo que os utilizadores escrevem passa por um LLM antes de ficar visível, em 10 categorias de conteúdo, cada uma com o seu critério. Ligar o modelo foi a parte fácil. O difícil foi decidir o que fazer quando ele hesita: bloquear a mais mata a comunidade, bloquear a menos deixa passar o que não pode passar, e a resposta não é a mesma para uma fotografia e para uma mensagem privada.
O que ainda não está feito
A moderação corre em modo sombra: o modelo avalia cada conteúdo e regista a decisão que tomaria, mas ainda não bloqueia nada. Fica assim até os falsos positivos estarem calibrados com dados reais, e só depois passa a bloquear.
DoutorWeb
OnlineAgência de web design para pequenos negócios, com uma dúzia de ferramentas gratuitas de uso imediato, sem registo: gerador de orçamentos, cartão de visita digital, menu digital, QR de wifi, compressor de imagens, verificador de SEO. Servem quem precisa delas hoje e mostram, a quem pondera contratar, como trabalho.
A parte difícil
Manter o site rápido enquanto lhe acrescento ferramentas. Cada ferramenta nova é mais uma página que tem de abrir depressa num telemóvel com rede fraca, que é exatamente onde está o cliente deste serviço. É fácil ter um site rápido no dia do lançamento e é difícil ainda o ter seis ferramentas depois.
Carteira de conta inteligente em CKB
Testnet, repositório privadoCarteira de conta inteligente na rede Nervos CKB em que perder o dispositivo não perde os fundos. Gastar exige a confirmação biométrica do próprio telemóvel (passkey), verificada pelo contrato na cadeia e não por um servidor meu: a chave nunca sai do dispositivo e a página não guarda nada. Recuperar o acesso exige o acordo de um número mínimo de guardiões escolhidos pelo dono, com um prazo de espera em que ele pode vetar. Contrato próprio, em Rust.
A parte difícil
Pôr um passkey de hardware a autorizar uma transação sem intermediário nenhum. O desafio que o dispositivo assina tem de ser exatamente o resumo da transação, só que esse resumo depende do tamanho da assinatura, e o tamanho só se conhece depois de o dispositivo assinar. É circular, e é aí que isto costuma partir. A solução foi fixar o campo da assinatura num tamanho constante, com enchimento no fim, para o resumo ficar determinado antes de alguém assinar. Ninguém repara nisto quando funciona.
O que ainda não está feito
Está em testnet e continua em testnet até haver auditoria externa feita por outra pessoa. A chave que permite atualizar o contrato ainda está comigo, e é a última coisa a fechar, depois da auditoria. Escrevo isto aqui porque o contrário seria exatamente o erro que o guia de validação passa doze capítulos a tentar evitar.
Ponte entre Cardano e Nervos CKB
Testnet, código abertoMove valor entre Cardano e Nervos CKB sem custódia nem comité: em vez de confiar numa entidade central, cada lado verifica a prova de consenso do outro dentro do próprio contrato. Uma direção usa Mithril, o light client oficial do Cardano, verificado dentro da CKB-VM; a outra usa uma prova Groth16 do consenso da CKB, verificada em Plutus. As duas direções correm em testnet (Cardano Preview e CKB Pudge).
A parte difícil
Uma auditoria adversarial com vários agentes de IA, cada um instruído a tentar quebrar o sistema e não a aprová-lo, encontrou uma forma de forjar um certificado que devia ser único. Corrigi com uma proteção que impede a repetição, e um teste que reproduz o ataque original: nenhuma falha conta como corrigida sem isso.
O que ainda não está feito
Testnet, sem valor real em risco: o próprio README diz para não se aproximar disto com fundos a sério. Falta auditoria independente por terceiros antes de sequer considerar mainnet, e a chave de administração ainda está comigo.