Saltar para o conteúdo
Telmo da Silva/hub

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ção

Plataforma 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

Online

Plataforma 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.

motospotters.pt ↗

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

Online

Agê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.

doutorweb.pt ↗

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 privado

Carteira 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.

Ver a transação na Pudge ↗

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 aberto

Move 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).

Ver o código no GitHub ↗

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.

Se isto te foi útil, o mais provável é ser útil a alguém que conheces. Partilha.

LinkedInWhatsApp

O percurso completo, com datas e funções, está no currículo. Como cheguei aqui está em sobre.