Noxtr Hoja de Especificaciones

Un cliente Nostr web integrado en el framework ExtFW. Resumen de funcionalidades, soporte de NIPs y comparativa con otros clientes.

Cliente Web · Arquitectura Abierta · Self-hosted
Volver a Noxtr · ExtFW Framework · Versión en inglés

¿Qué es Noxtr?

Noxtr es un cliente Nostr web integrado en el framework PHP ExtFW. Funciona como un módulo dentro de un sitio web auto-alojado, combinando el acceso al protocolo Nostr con funcionalidades del servidor como cuentas de usuario, hosting de direcciones Lightning y verificación de identidad NIP-05.

Está diseñado como una aplicación de página única sin frameworks JavaScript externos — vanilla JS con un helper DOM ligero (wquery).

Características Clave

Auto-alojado

Se ejecuta en tu propio servidor (Apache/nginx, PHP, MySQL/SQLite). Tú controlas tus datos, tu lista de relays y tus endpoints Lightning.

Cero Dependencias

Sin React, sin Vue, sin npm, sin paso de compilación. JavaScript vanilla puro en un solo archivo. Criptografía vía noble-secp256k1 y noble-ciphers.

Identidad Integrada

La verificación NIP-05 y las direcciones Lightning LNURL-pay se auto-configuran desde las cuentas de usuario del servidor.

Multi-autenticación

Soporta extensiones de navegador NIP-07, clave privada nsec, NIP-46 Nostr Connect (firma remota con QR) y modo sólo lectura con npub.

Soporte de NIPs

Posibilidades de Implementación de Nostr (NIPs) soportadas por Noxtr:

NIP-01Protocolo básico
NIP-02Lista de contactos
NIP-04DMs cifrados
NIP-05Identidad DNS
NIP-07Firmante del navegador
NIP-09Eliminación de eventos
NIP-10Hilos de respuesta
NIP-17DMs privados (gift wrap)
NIP-19Entidades Bech32
NIP-23Contenido largo
NIP-25Reacciones
NIP-28Canales públicos
NIP-44Cifrado versionado
NIP-46Nostr Connect
NIP-47Wallet Connect (NWC)
NIP-50Búsqueda
NIP-56Reportes
NIP-57Zaps Lightning
NIP-59Gift wrap
NIP-65Metadatos de relays
NIP-69₿rdenes P2P (Mostro)
NIP-94Metadatos de archivos
NIP-96Almacenamiento HTTP
NIP-98Auth HTTP

Tipos de Evento (Kinds)

KindDescripciónUso
0Metadatos de perfilNombre, avatar, banner, bio, nip05, lud16
1Nota de textoContenido principal del feed, hashtags, menciones
3Lista de contactosSeguir/dejar de seguir, petnames, hints de relay
4DM cifrado (NIP-04)AES-CBC con IV, descifrado vía NIP-07, NIP-46 o privkey
5EliminaciónBorrar notas propias y mensajes de canal propios (kind 42)
6RepostCompartir notas
7ReacciónLike/unlike en notas
13Seal (NIP-17)Capa inter/media del gift wrap para DMs privados
14Rumor (NIP-17)Mensaje plano (sin firma) que se envuelve en el seal
40Crear canalCanal de chat público NIP-28
41Metadatos de canalNombre, descripción, imagen del canal
42Mensaje de canalMensajes en canales públicos (eliminación propia vía kind 5)
1059Gift wrap (NIP-59)Sobre exterior cifrado para DMs NIP-17 y mensajes Mostro. Oculta remitente y destinatario
1063Metadatos de archivo (NIP-94)Devuelto por servidores NIP-96 al subir un archivo: URL, hash, mime, dimensiones
1984ReporteReportes de spam NIP-56
9734Solicitud de ZapMetadatos de pago Lightning
9735Recibo de ZapConfirmación de pago desde el servidor
23194NWC request (NIP-47)Solicitud cifrada (NIP-04) del cliente a la wallet NWC: pay_invoice, get_balance, etc.
23195NWC response (NIP-47)Respuesta cifrada de la wallet con resultado o error
24133Nostr ConnectFirma remota NIP-46
27235HTTP Auth (NIP-98)Evento de autenticación para uploads NIP-96 y login web
30023Artículo (NIP-23)Contenido largo: mezclado en el feed con badge “Read”, vista completa con Markdown, composición de artículos
38383Orden P2P (NIP-69)Órdenes de compraventa Bitcoin de robots Mostro. Tab P2P ₿ con listado de órdenes, explicación didáctica y flujo de compra guiado

Resumen de Funcionalidades

Modos de Feed

Global, Siguiendo, Seguidores, Temas (suscripciones por hashtag) y Tendencias (ranking por engagement).

Mensajes Directos (NIP-04 / NIP-17)

DMs cifrados con NIP-04 (AES-CBC) y NIP-17 con gift wrap (NIP-59 + NIP-44 XChaCha20-Poly1305). Mismo tab para ambos, distinguibles visualmente con 🔒 en los NIP-17. Hilos de conversación, caché en BD local y descifrado vía extensión NIP-07, NIP-46 o nsec.

Wallet Lightning (NIP-47 NWC)

Conexión con wallets compatibles con Nostr Wallet Connect (Alby, Mutiny, Phoenix, Coinos, etc.). Configura tu URI nostrwalletconnect:// una vez y paga zaps y facturas Mostro automáticamente desde la wallet del usuario sin pasar por BTCPay. WebSocket dedicado al relay NWC, cifrado NIP-04, timeout 30s.

Almacenamiento de Archivos (NIP-96)

Las imágenes adjuntas a notes se suben a servidores NIP-96 externos (nostr.build por defecto, configurables en el tab Relays). Auto-descubrimiento de capabilities vía /.well-known/nostr/nip96.json. Auth con NIP-98 (kind 27235) firmado con la clave del usuario. Soporte para múltiples servidores con cadena de fallback.

Canales Públicos (NIP-28)

Crear, unirse y chatear en canales públicos. Metadatos de canal, fijar canales, enlaces de invitación y configuración exclusiva del creador. Eliminación de mensajes propios (NIP-09).

Artículos (NIP-23)

Contenido largo (kind 30023) mezclado en el feed con badge “Read” y deduplicación. Vista completa con renderizado Markdown. Compositor con campos de título, resumen, imagen y etiquetas.

Hilos (NIP-10)

Vista completa de hilos con marcadores root/reply, conteo de respuestas, orden cronológico y enlaces permanentes.

Zaps Lightning

Zaps NIP-57 con transferencias internas entre usuarios registrados y facturas externas vía BTCPay y LNURL-pay.

Integración con BTCPay Server

Infraestructura Lightning auto-alojada vía BTCPay Server. El endpoint LNURL-pay sirve facturas, crea solicitudes de pago BOLT11 y procesa recibos de zap (kind 9735) con firmas Schnorr del servidor. Los sats recibidos se acumulan en el balance del usuario para transferencias internas o retiro.

Búsqueda

Búsqueda de texto NIP-50 con fallback multi-relay. Búsqueda de perfiles con @usuario. Detección de entidades npub/note/nevent.

Suscripción a Temas

Suscríbete a hashtags (#bitcoin, #nostr, etc.) y filtra tu feed. Temas sugeridos, activación masiva, filtro de tendencias.

Favoritos y Silenciados

Guarda notas como favoritos localmente. Silencia usuarios con reporte de spam NIP-56 opcional. Gestión de silenciados en ajustes.

Manejo de Media

Imágenes embebidas (carga diferida), reproductores de vídeo, embeds de YouTube/Vimeo. Detección de dominios caídos con reintento a las 24h.

Gestión de Perfil

Editar nombre, bio, avatar, banner. NIP-05 y dirección Lightning auto-configurados desde la cuenta del servidor.

Gestión de Relays

Añadir/eliminar/activar relays. Estado de conexión en tiempo real. Reconexión con backoff exponencial. Rebalanceo de suscripciones.

₿itcoin P2P (Mostro)

Tab dedicado para comprar Bitcoin sin inter/mediarios usando el protocolo Mostro sobre Nostr. Muestra órdenes de venta (kind 38383, NIP-69) con explicación didáctica en lenguaje llano. Flujo guiado: tomar orden → DM cifrado al robot → enviar factura Lightning de cobro → recibir sats. Sin nodo Lightning propio; compatible con Phoenix, Breez, Zeus.

Tarjetas de Perfil AR

Parsea y renderiza broadcasts de perfiles de redes mesh AR (ar_profile, ar_collaboration) como tarjetas visuales con avatar, ubicación y acciones sociales.

Comparativa de Clientes

Una comparación imparcial de Noxtr frente a clientes Nostr establecidos. Cada cliente tiene fortalezas diferentes — esta tabla pretende ser factual, no promocional.

Soportado ~ Parcial No soportado n/a No aplica

General

Noxtr Damus Amethyst Primal Snort Iris Coracle Nostur
Plataforma Web iOS Android Web/iOS/Android Web Web/Multi Web (PWA) iOS/macOS
Código abierto
Auto-alojado
Sin paso de compilación n/a n/a n/a
NIPs documentados 18 ~15 60+ ~20 42 ~15 ~15 ~15

Soporte de NIPs Principales

NIP Noxtr Damus Amethyst Primal Snort Iris Coracle Nostur
01Protocolo básico
02Lista de contactos
04DMs cifrados (legacy) lectura
05Identidad DNS
07Firmante del navegador n/a n/a n/a
09Eliminación de eventos ~
10Hilos de respuesta
17DMs privados (gift wrap) ~
19Entidades Bech32
23Contenido largo (artículos)
25Reacciones
28Canales públicos
44Cifrado versionado ~
46Nostr Connect ~
47Nostr Wallet Connect
50Búsqueda ~
57Zaps Lightning
65Metadatos de relays ~
94Metadatos de archivo ~ ~
96Almacenamiento HTTP de archivos
Pendientes de implementar en Noxtr
29Grupos relay-based ~
35Torrents
51Listas (mute, pin, bookmarks, sets) ~ ~ ~
72Comunidades moderadas
78App data personalizada ~ ~ ~

Funcionalidades

Funcionalidad Noxtr Damus Amethyst Primal Snort Iris Coracle Nostur
DMs modernos (NIP-17/44) ~
Wallet integrado balance Coinos Cashu
Búsqueda de perfiles (@user)
Canales públicos (NIP-28)
Feed de tendencias
Suscripción a temas/hashtags ~ ~ ~
Hosting NIP-05 premium pago
Hosting dirección Lightning pago
Múltiples cuentas logout/login
Contenido largo (NIP-23)
Comunidades (NIP-72)
Subida de archivos (NIP-96)
Metadatos de archivo (NIP-94) ~ ~
Nostr Wallet Connect (NIP-47)
Listas sincronizadas (NIP-51) ~ ~ ~
Grupos relay (NIP-29) ~
App data en relay (NIP-78) ~ ~ ~
Torrents (NIP-35)
Integración BTCPay Server
Compra Bitcoin P2P (Mostro) único
Renderizado de perfiles AR único
Nota de imparcialidad: Amethyst lidera el ecosistema en número de NIPs (60+). Primal ofrece la mejor experiencia de onboarding e infraestructura de búsqueda. Coracle destaca en gestión de relays. Iris fue pionero en cifrado de DMs con double ratchet. Nostur tiene la mejor integración con el ecosistema Apple. El diferenciador de Noxtr es la infraestructura de identidad auto-alojada (NIP-05 + dirección Lightning) y la arquitectura sin dependencias — no la amplitud de NIPs.

Limitaciones Conocidas (no por mucho tiempo)

Áreas donde Noxtr está por detrás de otros clientes:

Fortalezas Distintivas

₿itcoin P2P — Mostro

Noxtr incluye soporte nativo para Mostro, un protocolo de intercambio de Bitcoin entre pares (P2P) que funciona sobre Nostr. Puedes comprar o vender Bitcoin directamente con otras personas, sin inter/mediarios ni custodios, pagando con transferencia bancaria, Bizum, efectivo o cualquier otro método acordado.

El tab P2P ₿ en la barra de navegación te da acceso al order book en tiempo real con todas las ofertas disponibles.

¿Qué es Mostro? Un robot (programa automático) que actúa como árbitro de confianza entre comprador y vendedor. El robot retiene los Bitcoin del vendedor en depósito hasta que el comprador confirma haber enviado el dinero fiat, momento en que los libera automáticamente. Nadie puede robar: ni el comprador (porque los sats están bloqueados), ni el vendedor (porque el robot no los libera hasta recibir la confirmación).

Cómo comprar Bitcoin (paso a paso)

No necesitas ninguna experiencia previa con Bitcoin. Solo necesitas una wallet Lightning en el móvil (Phoenix, Breez, Zeus, Wallet of Satoshi…).

  1. Abre el tab P2P ₿ — Verás una lista de ofertas de venta con importe, moneda y método de pago.
  2. Elige una oferta que se adapte a ti (importe, método de pago) y pulsa Comprar.
  3. Introduce tu Lightning Address (ej. usuario@wallet.com) o una factura bolt11 generada desde tu wallet — ahí es donde recibirás los sats.
  4. El robot entra en acción: bloquea los Bitcoin del vendedor y te notifica cuánto debes pagar en fiat y cómo.
  5. Envía el dinero al vendedor por el método indicado (transferencia, Bizum, etc.) y pulsa Fiat enviado.
  6. El vendedor confirma que ha recibido el pago fiat y pulsa Liberar sats.
  7. ¡Listo! Los sats llegan a tu wallet Lightning. El trade aparece como completado en la ficha.

Si la wallet del vendedor o el nodo del robot no puede enrutar el pago a tu dirección, la ficha del trade mostrará un campo para introducir otra dirección Lightning alternativa. Tus sats están siempre a salvo con el robot.

Cómo vender Bitcoin

  1. Pulsa Nueva orden en el tab P2P ₿ y elige Vender BTC.
  2. Configura la oferta: importe en fiat, moneda, método de pago aceptado y tipo de importe (fijo o rango).
  3. Publica la orden. Aparecerá en el order book para que otros la tomen.
  4. Cuando alguien la toma, el robot te envía una hold invoice (factura retenida). Págala desde tu wallet Lightning — los sats quedarán bloqueados, no cobrados, hasta finalizar el trade.
  5. Da al comprador los datos de pago y espera a recibir el dinero fiat por el método acordado.
  6. Cuando llegue el dinero fiat, pulsa Liberar sats. El robot los enviará al comprador.

Importar identidad desde Mostro Mobile

Si ya usas la app Mostro Mobile, puedes importar tu identidad en Noxtr sin crear una cuenta nueva:

  1. En la pantalla de login de Noxtr, pulsa 📲 Mostro Mobile.
  2. Introduce tus 12 palabras semilla (la misma frase que usas en Mostro Mobile).
  3. Noxtr derivará tu clave privada Nostr usando el mismo estándar que Mostro Mobile (BIP39 + BIP32, ruta m/44'/1237'/38383'/0/0).
  4. Tus trades activos se recuperarán automáticamente enviando un mensaje restore al robot.

Los trades terminados (cancelados o completados) no se recuperan porque el robot no los rastrea. El historial pasado solo está disponible si las 12 palabras y la interfaz son las mismas que iniciaron esos trades.

Reputación y valoraciones

Al completar un trade puedes valorar a la contraparte de 1 a 5 estrellas. Las valoraciones recibidas aparecen en tu ficha de reputación (⭐ promedio · número de trades). Los robots Mostro publican la reputación acumulada de cada usuario en sus órdenes del order book.

Disputas

Si algo va mal en un trade en estados activo o fiat_enviado (la contraparte no responde, no envía el dinero, niega haber recibido un pago confirmado…), puedes iniciar una disputa. La disputa la resuelve un administrador humano del robot Mostro.

  1. Pulsa Disputar en la ficha del trade. El botón aparece junto a las acciones cuando el trade está en activo o fiat_enviado.
  2. Confirma. Tu cliente envía la acción dispute al robot.
  3. El robot publica la disputa y notifica a la contraparte. Tu trade pasa a estado disputado con un identificador de disputa visible en la ficha.
  4. Espera a que un admin la tome. Cuando ocurra, recibirás la acción admin-took-dispute y aparecerá un nuevo recuadro de chat directo con el admin debajo de la ficha del trade.
  5. Resuelve con el admin. El chat es independiente del chat con la contraparte y está cifrado con una clave compartida derivada específicamente entre tu trade key y la pubkey del admin.
  6. Veredicto del admin. El admin puede liberar los sats al comprador (admin-settle-dispute) o cancelar la disputa devolviéndolos al vendedor (admin-cancel-dispute). El trade se cierra automáticamente.

Si quieres retirar tu propia disputa antes de que un admin la tome, pulsa Anular disputa. Después ya no puedes — solo el admin decide.

Si la contraparte solicita cancelación cooperativa de un trade activo y no estás de acuerdo, puedes Disputar en lugar de aceptar la cancelación.

Listado de tus disputas en /noxtr/disputes: muestra ID de disputa, estado público (initiated / in-progress), iniciador, admin asignado y última actualización.

Seguridad del chat de disputa. Tu cliente solo acepta mensajes en el canal de la disputa cuya pubkey real (tras desempaquetar el gift wrap NIP-59) sea la del robot Mostro o la del admin asignado. Cualquier intento de impersonación por terceros se descarta automáticamente. Esto cumple el requisito del protocolo Mostro.

Para administradores — Mostro P2P

Relay obligatorio

Para enviar mensajes al robot es necesario que wss://relay.mostro.network esté activo en la lista de relays del usuario. El order book funciona con cualquier relay general, pero la comunicación con el robot requiere ese relay específico. Noxtr lo añade automáticamente como relay por defecto en las nuevas instalaciones.

Sin nodo Lightning propio

Noxtr no requiere que el servidor tenga un nodo Lightning para el flujo Mostro. La wallet Lightning es del usuario final (Phoenix, Breez, Zeus, etc.). BTCPay Server solo es necesario para el sistema de zaps y direcciones Lightning de perfil, no para Mostro.

Datos almacenados

Los trades activos se guardan en NSTR_TRADES y los eventos Mostro en NSTR_EVENTS. Ambas tablas se crean automáticamente. Los datos de reputación se calculan a partir de NSTR_EVENTS sin tabla adicional.

Auto-take (opcional)

El Monitor del servidor puede configurarse para tomar órdenes automáticamente cuando coincidan con reglas predefinidas (importe, moneda, antigüedad del robot). Ver sección Monitor más abajo.

Monitor del Servidor — Notificaciones y Auto-take

El Monitor es un proceso PHP que corre en el servidor en segundo plano y vigila los trades Mostro activos aunque ningún usuario tenga la web abierta. Escucha los relays Nostr continuamente y actúa cuando recibe eventos relevantes.

Para usuarios — ¿Qué hace el Monitor por ti?

Si el administrador del sitio tiene el Monitor activo, recibirás avisos automáticos cuando ocurra algo en tus trades:

EventoNotificación recibida
Alguien toma tu orden publicadaEmail: “Han tomado tu orden #XXXXXXXX”
El robot te pide pagar la hold invoice (vendes BTC)Email: “Debes pagar la hold invoice”
El comprador confirma que envió el fiat (vendes BTC)Email: “El comprador ha enviado el pago”
El trade se completaEmail: “Trade completado”
La contraparte inicia una disputaEmail + Telegram: “⚠️ La contraparte ha iniciado una disputa”
Has iniciado tú una disputaEmail + Telegram: confirmación “Has iniciado una disputa”
Un admin ha tomado la disputaEmail + Telegram: “🛡️ Un admin ha tomado la disputa — abre la web para chatear con él”
Mensaje privado nuevo en tu buzónTelegram (si tienes el bot vinculado)

Cada notificación se envía una sola vez por trade y tipo de evento — no hay spam.

Vincular Telegram para recibir avisos

  1. Ve a la sección Telegram de la web.
  2. Pulsa Vincular Telegram.
  3. Desde el móvil: pulsa el enlace “Abrir bot en Telegram” — se abre directamente el chat del bot y basta con pulsar Iniciar.
  4. Desde el ordenador: copia el comando /start CODIGO que aparece en pantalla y pégalo en el chat del bot en Telegram.
  5. El bot confirmará la vinculación. A partir de ese momento recibirás avisos de mensajes privados nuevos en Noxtr.

Para administradores — Arrancar y parar el Monitor

El Monitor se gestiona desde el panel de administración web (/noxtr/server_admin) con los botones Start / Stop / Status, o directamente desde la consola del servidor:

php /ruta/index.php noxtr/server/action=monitor --verbose

Para dejarlo corriendo en background:

nohup php /ruta/index.php noxtr/server/action=monitor > /var/log/monitor.log 2>&1 &

Para administradores — Comandos de control por DM Nostr

El Monitor tiene su propia identidad Nostr. Los administradores autorizados pueden enviarle DMs con comandos de texto plano desde cualquier cliente Nostr (incluyendo Noxtr). Su npub aparece en el mensaje de arranque y en el panel web.

ComandoAcción
pingComprueba que el canal responde. Devuelve pong.
statusVersión, trades vigilados, filtros activos, uptime, relays.
tradesOrder book en tiempo real (opciones: age 4h, amount 50 EUR, status pending).
relaysRelays conectados en la sesión actual.
filter_trade listReglas de auto-take activas.
filter_trade amount 50 EURAñade regla: tomar órdenes de exactamente 50 EUR.
filter_trade days 0Añade regla: tomar órdenes de robots con 0 días de antigüedad.
filter_trade remove amount 50Elimina la regla de 50 EUR.
filter_trade clearElimina todas las reglas de auto-take.
emailEnvía un email de prueba al admin.
reloadReconecta a los relays sin reiniciar el proceso.
stopPara el proceso limpiamente.
helpAyuda contextual completa.

Para administradores — Notificaciones de nuevas órdenes

Además de vigilar trades propios, el Monitor notifica al administrador cada nueva orden que aparece en el order book Mostro:

Para recibir notificaciones de nuevas órdenes por Telegram, el administrador debe tener el bot vinculado y su pubkey Nostr añadida a admin_pubkeys en la configuración del Monitor.

Para administradores — Auto-take

El Monitor puede tomar órdenes automáticamente cuando coincidan con reglas configuradas. Es útil para situaciones como “tomar siempre órdenes de robots de 0 días” o “tomar siempre órdenes de exactamente 88 EUR”.

El auto-take es efímero: el Monitor genera un keypair temporal, toma la orden y notifica al admin, pero no crea un trade persistente en la base de datos. El seguimiento posterior del trade debe hacerse manualmente desde otro cliente Mostro.

Seguridad del canal de control: Solo los administradores con pubkey en admin_pubkeys pueden enviar comandos. Los eventos se verifican criptográficamente con firma Schnorr. Los comandos con más de 5 minutos de antigüedad se ignoran automáticamente.

Arquitectura Técnica

ComponenteTecnología
FrontendJavaScript vanilla (IIFE único), helper DOM wquery
BackendPHP (módulo del framework ExtFW)
Base de datosMySQL o SQLite (SQL dual-compatible)
Servidor webApache (mod_rewrite) o nginx
Criptografíanoble-secp256k1 (BIP-340 Schnorr), noble-ciphers (XChaCha20-Poly1305), Web Crypto API (AES-CBC, HKDF)
LightningBTCPay Server (LNURL-pay, facturas BOLT11)
AlmacenamientoBD del servidor (contactos, temas, favoritos, DMs, relays, silenciados, canales, servidores NIP-96, NWC URI) + localStorage/IndexedDB (claves, estado UI). Imágenes adjuntas suben a servidores NIP-96 externos — no al servidor PHP

Backlog — Ideas y Mejoras Futuras

Funcionalidades en cola sin fecha definida. La fuente canónica vive en _modules_/noxtr/BACKLOG.md dentro del repositorio.

NIP-51 — Sincronización de listas

Hacer portables las listas (topics, bookmarks, muted, channels, relays) entre clientes Nostr y entre instancias Noxtr vía kinds 10000-10015. Hoy las listas viven solo en BD local; el export/import manual cubre la migración. NIP-51 añadiría sync continuo y bidireccional.

NIP-ED2K — Indexador eMule sobre Nostr

Propuesta de NIP propio (no estandarizado) para directorio descentralizado de servidores ed2k y enlaces ed2k. Kinds 2010 (server) y 2011 (file). La especificación completa está en _modules_/noxtr/NIP-ED2K.md.

NIP-35 — Indexador de Torrents

Implementación sencilla de kind 2003 con tags magnet/nombre/tamaño. Postergado: el ecosistema está casi vacío hoy (0 eventos kind 2003 en los relays activos). Tendría sentido junto con NIP-ED2K en un tab unificado de "compartir archivos".

NIP-72 — Comunidades Moderadas

Comunidades tipo subreddit con moderación criptográfica. Kinds 34550 (definición) y 4550 (aprobación de moderador). Tab separado de Channels (NIP-28). Útil para feeds curados tipo foro.

CLI_USER — Cifrado client-side

Cifrar columnas sensibles de la tabla CLI_USER en el navegador, de manera que el servidor no vea datos personales en claro. Requiere diseño previo (qué columnas, qué clave, qué pasa si el usuario la pierde).