Cifrado de extremo a extremo, con las claves en tus propios dispositivos
Happier mantiene una misma sesión de programación sincronizada entre el ordenador en el que se ejecuta y todos los dispositivos desde los que la miras, y en medio de eso hay un servidor de relay. Esta página es la arquitectura que hay debajo de esa frase: qué clave se genera dónde, con qué se queda realmente el relay, qué puede ver aún y qué cambia en un servidor configurado para desactivar el cifrado.
Cómo se cifra un mensaje entre tu teléfono y tu ordenador
Un mensaje que envías desde el teléfono, dibujado en los tres puntos por los que pasa. Todo lo que el agente responde recorre el mismo camino en sentido contrario, sellado en tu ordenador antes de salir.
- Tu teléfono
- Sellado aquí. El mensaje se cifra en el dispositivo en el que lo escribiste, bajo una clave que pertenece a esa sesión y a nada más — 32 bytes aleatorios generados al crear la sesión, AES-256-GCM, un nonce nuevo por mensaje. La clave de sesión se sella después con la clave propia de tu cuenta mediante un intercambio X25519 efímero, y es la copia sellada la que se le entrega al relay.
- El relay
- Transportado sellado. Lo que el servidor escribe es una fila con la forma { t: "encrypted", c: "…" } — base64, más un sobre de clave sellado para el que no tiene ninguna clave secreta. Puede enrutar esa fila, contarla, guardarla y devolverla. No tiene nada con lo que abrirla, y ningún endpoint se lo pide.
- Tu ordenador
- Abierto aquí. La CLI abre la clave de sesión sellada con la clave de cuenta que recibió cuando conectaste la terminal, descifra y le pasa el texto en claro a Claude Code, Codex, OpenCode o al agente que esté en marcha. La respuesta hace el mismo viaje al revés, sellada antes de salir.
Qué almacena el servidor de relay
El cifrado es una afirmación sobre el contenido, y una afirmación sobre el contenido es solo media respuesta. Aquí está la otra mitad, con el mismo nivel de detalle: las columnas que puede leer sin clave quien opere este relay.
- Texto cifrado, y un sobre de clave sellado
- Una fila por mensaje, que contiene base64 y nada más, más la clave de datos envuelta de la sesión. El envoltorio se hace en un dispositivo; ninguna ruta del servidor produce uno.
- Identificadores y forma
- Ids de cuenta, dispositivo y sesión, una etiqueta aleatoria por sesión, números de secuencia, marcas de tiempo y tamaños. Esta es la parte que el cifrado no cubre en ningún sistema que sincronice, y merece decirse claramente: el relay sabe cuánto enviaste y cuándo.
- De qué lado vino cada mensaje
- Cada mensaje lleva un rol — usuario, agente, evento o desconocido — que aporta el cliente junto al texto cifrado. Es una columna para que una transcripción se pueda paginar y contar sin abrirla. En una fila cifrada el servidor no puede deducirlo; solo puede almacenar lo que el cliente registró.
- Una proyección de actividad deliberadamente pequeña
- Si una sesión está sin leer, cuántas solicitudes de permiso hay esperando, cuántas preguntas ha hecho el agente, si está pensando, cómo terminó el último turno. Cada una de esas cosas es estado derivado — un contador, una bandera o una marca de tiempo que el cliente escribe según avanza una sesión — nunca una palabra de lo que se dijo. Existe para que un teléfono que ha estado cerrado una hora muestre un distintivo correcto en cuanto lo abres, y contar es lo máximo que se le da que hacer al servidor para ello.
- Lo que escribiste, y lo que respondió el agente
- La transcripción es el texto cifrado. No hay una segunda copia, ni un índice sobre ella en el servidor, ni un paso de resumen que necesitara uno.
- Dónde se está ejecutando la sesión
- La ruta del proyecto, tu nombre de host, tu directorio personal y la versión de la CLI son metadatos de sesión, y los metadatos se cifran con la misma clave de sesión antes de que la sesión se cree. Son campos dentro de un blob sellado, no columnas por las que el servidor pueda ordenar.
- Tus credenciales de proveedor
- Una cuenta conectada — la credencial de Claude o de ChatGPT con la que corre una sesión — se sella en el dispositivo antes de subirse, bajo una clave derivada para ese único propósito a partir del secreto de tu cuenta. El relay almacena un sobre y se lo devuelve a tus propios dispositivos.
- Tu repositorio
- Tu repositorio nunca se sincroniza ni se replica. El agente lee y escribe archivos en el ordenador en el que se ejecuta, y ese ordenador sigue siendo la única copia completa. Cuando pides un archivo, una carpeta o un diff, viaja por el mismo camino sellado que todo lo demás — porque lo has pedido, no porque Happier guarde una copia.
Tus claves de cifrado se crean en tu propio dispositivo
Hay un secreto en la raíz de tu cuenta, y se crea en un dispositivo — no lo emite un servidor. Todo lo demás se deriva de él mediante un árbol de claves: una raíz HMAC-SHA-512 y luego un paso HMAC por cada elemento etiquetado de la ruta. El par de claves que abre las claves de sesión selladas sale de ese árbol bajo la etiqueta "content", y también sale de ahí una clave distinta para cada otro tipo de blob almacenado, de modo que ninguna clave hace dos trabajos.
Por eso un navegador recién estrenado puede iniciar sesión en tu cuenta y aun así no enseñarte nada de la semana pasada. Iniciar sesión demuestra al relay quién eres. Leer una sesión antigua necesita la clave, y la clave no está en el relay para que la envíe. Restaurar el dispositivo es el paso que la mueve — desde un dispositivo que ya la tiene, o desde la clave secreta que guardaste.
También significa que el caso de pérdida es real y merece decirse una vez: si todos los dispositivos con la sesión iniciada han desaparecido y la clave secreta ha desaparecido con ellos, las sesiones cifradas no las podemos recuperar ni nosotros ni nadie. Un relay que pudiera devolverlas sería un relay que podría leerlas.
Vincular un dispositivo nuevo, y cómo le llegan tus claves
Añadir un dispositivo es el momento en que se mueve material de claves, así que es el momento que merece la pena entender. Escanear el código QR levanta una solicitud, y eso es todo lo que hace: la aprobación ocurre en un dispositivo que ya tiene la sesión iniciada y, cuando las dos pantallas muestran un código de confirmación corto, se espera que los compares antes de aprobar.
Lo que hace realmente la aprobación es sellar la clave de contenido con la clave pública del dispositivo que la pidió, en un sobre que lleva una clave de emisor efímera y un nonce nuevo. Ese sobre viaja por el relay como todo lo demás. Conectar una terminal añade una atadura más encima: el payload se autentica contra un secreto de emparejamiento que viajó dentro del código QR, no a través del servidor, así que un relay que cambiara el payload no podría producir una etiqueta que cuadrara.
Política de almacenamiento: el cifrado de extremo a extremo es el valor por defecto
Todo lo de arriba describe el valor por defecto, y ese valor por defecto no es una sugerencia de la que el cliente pueda disuadir al servidor. Un relay recién instalado está configurado para exigir almacenamiento cifrado de extremo a extremo: una escritura en claro se rechaza con un error de política en vez de aceptarse en silencio. Los clientes leen la política del propio endpoint de features del servidor antes de crear una sesión, así que el modo en el que está una sesión se acordó antes de su primer mensaje.
Quien opera un servidor tiene otros dos ajustes disponibles. Uno puede permitir que una cuenta elija, de modo que las sesiones cifradas y en claro coexistan en el mismo relay — hace falta tanto la política opcional como el permiso de exclusión, y ese permiso está apagado salvo que el operador lo encienda. El otro exige texto en claro, para organizaciones que gestionan el cifrado en la capa de infraestructura y necesitan que el servidor pueda leer y procesar el contenido de las sesiones. Ese último es un intercambio real y merece decirse sin suavizarlo: en una sesión en claro el servidor puede leer la transcripción. Ese es el sentido del ajuste.
El modo queda fijado por sesión en el momento de crearla, así que una sesión nunca es mitad y mitad, y cambiar el modo de una cuenta cambia lo que pasa con las sesiones nuevas en lugar de alcanzar hacia atrás a las antiguas. Nada se descifra retroactivamente, y nada se cifra retroactivamente tampoco.
Las variables que fijan las tres, las opciones de cifrado en reposo que hay debajo y los controles de identidad que las rodean son la mitad del operador, y viven en la página de autoalojamiento para equipos.
Las notificaciones push las envía tu propio ordenador
Una notificación push es lo único que se sale del modelo, porque tiene que llegar a un teléfono que no tiene nada abierto. La respuesta de Happier es que las envía tu propio ordenador. El servidor almacena tus tokens de push; la CLI de tu propio ordenador los lee de vuelta y envía la notificación ella misma, lo que mantiene al relay fuera de un camino cuyo contenido, si no, habría que contarle.
Lo que lleva el payload es deliberadamente escaso: el tipo de herramienta o de solicitud, y una pista corta donde ayude — un archivo como src/file.ts, el nombre de un comando, un recuento como "3 preguntas". La entrada bruta de la herramienta no se mete ahí. Lo justo para decidir si coger el teléfono, en una pantalla que puede leer cualquiera que esté detrás de ti.
Relay autoalojado: los metadatos también se quedan en tu hardware
Todo esto se sostiene en un relay que no ejecutas tú. La razón para ejecutar el tuyo es la fila de arriba sobre identificadores y forma: el cifrado no oculta quién habla con quién, ni con qué frecuencia, y en tu propio relay ese registro también es tuyo. Un comando pone el relay en hardware tuyo, y el camino pasa a ser tu dispositivo, tu relay, tu ordenador, sin nada dentro que no hayas desplegado tú.
Lee tú mismo el código del cifrado
En esta página no hay ninguna certificación porque no hay ninguna que reportar, y una página de seguridad que insinúa un cumplimiento que no tiene es peor que una que no lo menciona. Lo que hay en su lugar es el código a partir del cual se escribió cada frase de arriba, con licencia MIT y legible antes de ejecutarlo: las primitivas en packages/protocol/src/crypto, el cifrado de sesión en apps/cli/src/api/encryption.ts, la política de almacenamiento que el servidor aplica en su endpoint de features, y el esquema que muestra exactamente qué columnas están en claro.
Esa es también la respuesta honesta a cómo deberías tratar esta página: como un mapa de dónde mirar, no como una promesa que aceptar por fe. Lee los cuatro archivos, o ejecuta el relay tú mismo y lee lo que anuncia a sus clientes.
La referencia del modelo de cifrado cubre el mismo terreno como procedimiento — qué te pide una restauración, qué significa cada modo de almacenamiento para una cuenta, a qué flujo recurrir cuando un dispositivo aún no puede leer una sesión.

