Estudo de caso · Código privado

Bridnote

Aplicação de anotações em produção em bridnote.com, escrita em Go e renderizada no servidor. Inclui notas com cifra ponta a ponta, um editor visual de texto formatado e um editor em modal com salvamento automático. O código é privado, então esta página descreve o produto e as decisões de engenharia em nível geral.

Papel
Autor único
Stack
Go · PostgreSQL · Lexical
Código
Repositório privado
No ar
bridnote.com
Tela inicial do Bridnote no tema claro, com notas fixadas e outras notas em cartões coloridos
Tela inicial com dados de demonstração.

Visão geral

Anotações rápidas acabam espalhadas por arquivos e conversas, sem nada que proteja a conta ou o conteúdo. O Bridnote é um único lugar para escrever, etiquetar, anexar arquivos, arquivar e proteger notas, com verificação em duas etapas e registro da atividade da conta. É um serviço no ar, disponível em bridnote.com, e também é onde tomo e defendo decisões de engenharia de ponta a ponta, do modelo de dados ao comportamento da interface. A contrapartida de código aberto tem o seu próprio estudo de caso, o Bridopen; as notas protegidas e o editor de texto formatado pertencem a este código privado.

Minha contribuição

Sou o único autor do repositório: 75 commits entre setembro e outubro de 2026. Projetei as camadas e escrevi o backend, as migrations do banco, os templates HTML, o código do navegador, a integração do editor e as suítes de testes. Também escrevi a configuração de contêineres, o workflow de release e a documentação, inclusive os registros de decisão de arquitetura.

O projeto existe para exercitar decisões de ponta a ponta que eu consiga justificar por escrito: limites entre camadas, o que o servidor pode saber, migrations de esquema, releases e o comportamento da interface em uso real.

Arquitetura

Um monolito modular em camadas. Um único ponto de entrada compõe configuração, banco, storage, e-mail, repositories, services e handlers, e registra as rotas. Os módulos de negócio (notas, usuários, páginas legais) ficam separados da infraestrutura transversal que compartilham.

Fluxo de uma requisição no Bridnote Uma requisição do navegador passa por uma cadeia de middlewares e chega a um handler. O handler chama um service, que chama um repository para o banco, o storage de anexos ou o mailer. O handler devolve ao navegador um template renderizado no servidor. Navegador Editor · cifra no cliente CADEIA DE MIDDLEWARES Middleware de segurança proteção das requisições Sessão no servidor Autenticação usuários logados Tratamento de erros Handler HTTP, DTO, render Service casos de uso, validação Repository SQL, scans, transações Mailer SMTP confirmação, recuperação Storage de anexos volume local, fora do banco verificados antes de aceitar PostgreSQL notas, usuários, sessões, auditoria Tracejado: resposta renderizada devolvida ao navegador
Fluxo simplificado de uma requisição, desenhado a partir da documentação do projeto.

Regras de camada

  • Handlers cuidam só de HTTP: sessão, leitura da requisição, resposta, renderização e JSON.
  • Services concentram casos de uso, validação de fluxo e orquestração.
  • Models guardam entidades, estados, constantes e regras puras de domínio.
  • Repositories isolam SQL, leitura de linhas, transações e mapeamento de persistência.
  • Templates recebem DTOs e page models, nunca regras de negócio.

Stack

  • Backend: Go com o servidor HTTP da biblioteca padrão; sem framework web.
  • Dados: PostgreSQL com migrations versionadas.
  • Views: templates renderizados no servidor com navegação parcial, Tailwind e JavaScript puro.
  • Editor: o editor de texto formatado Lexical, empacotado no build para o deploy continuar só Go.
  • Entrega: Docker Compose atrás de um proxy reverso, com releases marcadas por tags no Git.

Decisões de engenharia

Três decisões que moldaram o produto, cada uma com a alternativa considerada e o que ela custa. O repositório mantém vinte e um registros de decisão no total.

1. Cifra ponta a ponta só para as notas que o usuário marcar como protegidas

Decisão:
as notas escolhidas são cifradas no navegador com uma frase-senha que fica com o usuário, junto com uma chave de recuperação mostrada uma única vez. O servidor guarda apenas texto cifrado dessas notas e não consegue lê-las.
Alternativa:
cifrar todas as notas, ou confiar em cifra de disco e em uma política de privacidade.
Motivo:
operador, vazamento do banco ou ordem legal recebem texto cifrado nas notas que importam, enquanto as notas comuns mantêm busca no servidor e cartões renderizados.
Limitação:
esquecer a frase-senha sem ter a chave de recuperação torna as notas ilegíveis para sempre, e as notas protegidas ficam fora da busca no servidor.

2. Editor visual com HTML saneado guardado como conteúdo da nota

Decisão:
as notas são editadas com um editor de texto formatado no modal e guardadas como HTML que o servidor sanea ao gravar. Texto puro continua aceito e é convertido.
Alternativa:
Markdown com barra de atalhos e prévia, ou dois formatos paralelos para texto puro e HTML.
Motivo:
o público não é técnico, e um protótipo que expunha marcas de Markdown foi reprovado. Um único formato gravado simplifica exportação e busca.
Limitação:
o editor exige JavaScript e aumenta o peso da página que o abre, e a busca precisa ignorar a formatação.

3. A nota abre em um modal e salva sozinha

Decisão:
ver, editar e criar uma nota acontecem em um único modal sobre a lista em que o usuário está, com salvamento automático logo após a última alteração, desfazer e refazer.
Alternativa:
páginas separadas de visualização, edição e criação, com botões explícitos de Salvar e Cancelar.
Motivo:
mudar uma palavra custava quatro cliques e uma troca de página; o modal mantém a posição na grade e elimina os passos extras.
Limitação:
o salvamento automático multiplica requisições pequenas, então os salvamentos têm debounce e saem um por vez; edições incompletas são sinalizadas em vez de descartadas em silêncio.

Qualidade, segurança e operação

O projeto está no ar, então esta seção fica no nível da abordagem. Os detalhes de implementação das proteções não são publicados aqui de propósito.

Testes e portão de release

  • 33 arquivos de teste em Go, cobrindo handlers, services, repositories, models e pacotes de plataforma.
  • 19 specs de navegador que abrem todas as telas em um Chromium real, além de um teste unitário dos scripts de navegação.
  • O workflow de release roda os testes Go, o teste do front-end e os testes de navegador antes de publicar.

Proteção da conta

  • As senhas são guardadas apenas como hashes com salt.
  • Verificação em duas etapas opcional, lista de sessões ativas e encerramento por sessão.
  • Defesas em camadas no pipeline de requisições e separação entre notas comuns e protegidas.

Dados e operação

  • Migrations de banco versionadas e releases com tags, a última sendo a v0.1.5.
  • Trilha de auditoria separada dos eventos da conta, que registra identificadores, nunca o conteúdo das notas.
  • Os anexos ficam fora do banco e são verificados antes de serem aceitos.
  • Exportação e exclusão da conta pelo usuário logado.

Resultados e limitações

O que existe hoje é uma aplicação funcional: cadastro com confirmação por e-mail, login com verificação em duas etapas opcional, recuperação de senha, notas abertas em um modal com salvamento automático, desfazer e refazer, um editor visual com estilos de texto, listas, listas de tarefas e tabelas, tarefas que se marcam direto no cartão, etiquetas e cores, ordem manual por arrastar e soltar, anexos, arquivo e lixeira com exclusão reversível, busca por texto, etiqueta e cor que ignora acentos, notas protegidas com anexos protegidos, tema claro e escuro, e exportação e exclusão da conta.

Limitações declaradas

  • O código é privado. As afirmações desta página não podem ser verificadas de fora. Posso apresentar o código, os testes e os registros de decisão mediante pedido.
  • Nenhum benchmark de desempenho foi publicado. Não tenho medidas de latência, vazão ou disponibilidade para afirmar sobre este projeto.
  • Não há números públicos de uso. O serviço está no ar, mas ainda em desenvolvimento ativo, na versão 0.1.5; não afirmo número de usuários nem adoção.
  • Notas protegidas não podem ser recuperadas sem a frase-senha ou a chave de recuperação, e ficam fora da busca no servidor por desenho.

Experimente

O Bridnote está online em bridnote.com. O código-fonte é privado; para o código em si, posso fazer uma apresentação da arquitetura, dos testes e dos registros de decisão.

As capturas desta página usam dados fictícios de demonstração, no tema claro.