Encriptação de ponta a ponta, com as chaves nos seus próprios dispositivos
O Happier mantém uma sessão de programação sincronizada entre o computador onde corre e todos os dispositivos a partir dos quais a acompanha, e um servidor de relay fica no meio disso. Esta página é a arquitetura por baixo dessa frase: que chave é gerada onde, o que o relay guarda de facto, o que continua a conseguir ver, e o que muda num servidor configurado para desligar a encriptação.
Como é que uma mensagem é encriptada entre o seu telemóvel e o seu computador
Uma mensagem que envia do telemóvel, desenhada nos três pontos por que passa. Tudo o que o agente responde faz o mesmo caminho no sentido inverso, selado no seu computador antes de sair.
- O seu telemóvel
- Selada aqui. A mensagem é encriptada no dispositivo onde a escreveu, com uma chave que pertence àquela sessão e a mais nada — 32 bytes aleatórios sorteados quando a sessão é criada, AES-256-GCM, um nonce novo por mensagem. A chave de sessão é depois selada com a chave da sua própria conta através de uma troca X25519 efémera, e é a cópia selada que é entregue ao relay.
- O relay
- Transportada selada. O que o servidor escreve é uma linha com o formato { t: "encrypted", c: "…" } — base64, mais um envelope de chave selado para o qual não tem chave secreta. Consegue encaminhar essa linha, contá-la, guardá-la e devolvê-la. Não tem nada com que a abrir, e nenhum endpoint lhe pede isso.
- O seu computador
- Aberta aqui. A CLI abre a chave de sessão selada com a chave de conta que lhe foi dada quando ligou o terminal, desencripta, e passa o texto simples ao Claude Code, ao Codex, ao OpenCode ou ao agente que estiver a correr. A resposta faz a mesma viagem ao contrário, selada antes de sair.
O que o servidor de relay guarda
A encriptação é uma afirmação sobre o conteúdo, e uma afirmação sobre o conteúdo é apenas meia resposta. Aqui está a outra metade, com o mesmo nível de detalhe: as colunas que um servidor a operar este relay consegue ler sem uma chave.
- Texto cifrado, e um envelope de chave selado
- Uma linha por mensagem, contendo base64 e mais nada, mais a chave de dados envolvida da sessão. O envolvimento é feito num dispositivo; nenhuma rota do servidor produz um.
- Identificadores e forma
- Ids de conta, de dispositivo e de sessão, uma etiqueta aleatória por sessão, números de sequência, carimbos temporais e tamanhos. Esta é a parte que a encriptação não cobre em nenhum sistema que sincronize, e vale a pena ser claro: o relay sabe quanto enviou e quando.
- De que lado veio cada mensagem
- Todas as mensagens transportam um papel — utilizador, agente, evento ou desconhecido — fornecido pelo cliente juntamente com o texto cifrado. É uma coluna para que uma transcrição possa ser paginada e contada sem ser aberta. Numa linha encriptada o servidor não o consegue derivar; só consegue guardar o que o cliente arquivou.
- Uma projeção de atividade deliberadamente pequena
- Se uma sessão está por ler, quantos pedidos de permissão estão à espera, quantas perguntas o agente fez, se está a pensar, como terminou o último turno. Cada uma dessas é estado derivado — um contador, uma bandeira ou um carimbo temporal que o cliente escreve à medida que a sessão avança — nunca uma palavra do que foi dito. Existe para que um telemóvel que esteve fechado durante uma hora mostre um distintivo correto no momento em que o abre, e contar é o máximo que é dado ao servidor para o fazer.
- O que escreveu, e o que o agente respondeu
- A transcrição é o texto cifrado. Não há segunda cópia, nem índice do lado do servidor sobre ela, nem passo de resumo que precisasse de um.
- Onde a sessão está a correr
- O caminho do projeto, o nome da sua máquina, o seu diretório pessoal e a versão da CLI são metadados de sessão, e os metadados são encriptados com a mesma chave de sessão antes de a sessão ser criada. São campos dentro de um blob selado, não colunas pelas quais o servidor possa ordenar.
- As suas credenciais de fornecedor
- Uma conta ligada — a credencial do Claude ou do ChatGPT com que uma sessão corre — é selada no dispositivo antes de ser carregada, com uma chave derivada só para esse fim a partir do segredo da sua conta. O relay guarda um envelope e devolve-o aos seus próprios dispositivos.
- O seu repositório
- O seu repositório nunca é sincronizado nem espelhado. O agente lê e escreve ficheiros no computador onde corre, e esse computador continua a ser a única cópia completa. Quando pede um ficheiro, uma pasta ou um diff, ele viaja pelo mesmo caminho selado que tudo o resto — porque o pediu, e não porque o Happier guarde uma cópia.
As suas chaves de encriptação são criadas no seu próprio dispositivo
Há um segredo na raiz da sua conta, e ele é criado num dispositivo — não emitido por um servidor. Tudo o resto é derivado dele por uma árvore de chaves: uma raiz HMAC-SHA-512, e depois um passo HMAC por cada elemento de caminho etiquetado. O par de chaves que abre as chaves de sessão seladas sai dessa árvore sob a etiqueta "content", e o mesmo acontece a uma chave separada para cada outro tipo de blob guardado, para que nenhuma chave faça dois trabalhos.
É por isto que um navegador acabado de estrear pode iniciar sessão na sua conta e mesmo assim não lhe mostrar nada da semana passada. Iniciar sessão prova ao relay quem você é. Ler uma sessão antiga precisa da chave, e a chave não está no relay para ser enviada. Restaurar o dispositivo é o passo que a move — a partir de um dispositivo que já a tem, ou da chave secreta que guardou.
Significa também que o caso de perda é real e vale a pena ser dito uma vez: se todos os dispositivos com sessão iniciada desaparecerem e a chave secreta desaparecer com eles, as sessões encriptadas não podem ser recuperadas por nós nem por ninguém. Um relay que as pudesse devolver seria um relay que as conseguiria ler.
Ligar um dispositivo novo, e como as suas chaves lá chegam
Adicionar um dispositivo é o momento em que material de chaves se move, por isso é o momento que vale a pena perceber. Ler o código QR levanta um pedido, e é só isso que faz: a aprovação acontece num dispositivo que já tem sessão iniciada, e quando os dois ecrãs mostram um código curto de confirmação é suposto compará-los antes de aprovar.
O que a aprovação faz na prática é selar a chave de conteúdo com a chave pública do dispositivo que pediu, num envelope que transporta uma chave de remetente efémera e um nonce novo. Esse envelope viaja através do relay como tudo o resto. Ligar um terminal acrescenta mais uma amarração por cima: o payload é autenticado contra um segredo de emparelhamento que viajou no código QR, e não através do servidor, por isso um relay que trocasse o payload não conseguiria produzir uma etiqueta correspondente.
Política de armazenamento: a encriptação de ponta a ponta é a predefinição
Tudo o que está acima descreve a predefinição, e a predefinição não é uma sugestão da qual o cliente possa demover o servidor. Um relay novo está configurado para exigir armazenamento encriptado de ponta a ponta: uma escrita em texto simples é recusada com um erro de política em vez de ser aceite em silêncio. Os clientes leem a política a partir do endpoint de features do próprio servidor antes de criarem uma sessão, por isso o modo em que uma sessão está foi acordado antes da primeira mensagem dela.
Um operador de servidor tem outras duas definições disponíveis. Uma permite que seja uma conta a escolher, para que sessões encriptadas e em texto simples coexistam no mesmo relay — exige tanto a política opcional como a permissão de exclusão, e essa permissão está desligada a menos que o operador a ligue. A outra exige texto simples, para organizações que gerem a encriptação na camada de infraestrutura e precisam de que o servidor consiga ler e processar o conteúdo das sessões. Essa última é uma troca real e vale a pena dizê-lo sem suavizar: numa sessão em texto simples o servidor consegue ler a transcrição. É esse o objetivo da definição.
O modo é fixado por sessão no momento da criação, por isso uma sessão nunca é metade de cada, e mudar o modo de uma conta muda o que acontece às sessões novas em vez de mexer nas antigas. Nada é desencriptado retroativamente, e nada é encriptado retroativamente também.
As variáveis que definem as três, as opções de armazenamento por baixo delas e os controlos de identidade à volta delas são a metade do operador, e vivem na página de auto-alojamento para equipas.
As notificações push são enviadas pelo seu próprio computador
Uma notificação push é a única coisa que sai do modelo, porque tem de chegar a um telemóvel que não tem nada aberto. A resposta do Happier é que é o seu próprio computador que as envia. O servidor guarda os seus tokens push; a CLI no seu próprio computador lê-os de volta e envia ela mesma a notificação, o que mantém o relay fora de um caminho em que, de outra forma, teria de lhe ser dito o conteúdo.
O que o payload transporta é deliberadamente magro: o tipo de ferramenta ou de pedido, e uma dica curta quando ajuda — um ficheiro como src/file.ts, o nome de um comando, uma contagem como "3 perguntas". A entrada em bruto das ferramentas não é colocada lá. O suficiente para decidir se vale a pena pegar no telemóvel, num ecrã que qualquer pessoa atrás de si consegue ler.
Relay auto-alojado: os metadados também ficam no seu hardware
Tudo isto se mantém num relay que não é você a correr. A razão para correr o seu próprio é a linha acima sobre identificadores e forma: a encriptação não esconde quem fala com quem, nem com que frequência, e no seu próprio relay esse registo também é seu. Um comando coloca o relay em hardware seu, e o caminho passa a ser o seu dispositivo, o seu relay, o seu computador, sem nada lá dentro que não tenha sido você a instalar.
Leia você mesmo o código da encriptação
Não há nenhuma certificação nesta página porque não há nenhuma para reportar, e uma página de segurança que acena a conformidade que não tem é pior do que uma que não a menciona. O que está aqui em vez disso é o código a partir do qual todas as frases acima foram escritas, com licença MIT e legível antes de o correr: as primitivas em packages/protocol/src/crypto, a encriptação de sessão em apps/cli/src/api/encryption.ts, a política de armazenamento que o servidor impõe no seu endpoint de features, e o esquema que mostra exatamente que colunas estão em texto simples.
Essa é também a resposta honesta a como deve tratar esta página: como um mapa de onde procurar, não como uma promessa a aceitar em confiança. Leia os quatro ficheiros, ou corra o relay você mesmo e leia o que ele anuncia aos seus clientes.
A referência do modelo de encriptação cobre o mesmo terreno em forma de procedimento — o que o restauro lhe pede, o que cada modo de armazenamento significa para uma conta, e a que fluxo recorrer quando um dispositivo ainda não consegue ler uma sessão.

