Developer and self-hosted
Nostr
Estado: Plugin incluido opcional (deshabilitado de forma predeterminada hasta que se configure).
Nostr es un protocolo descentralizado para redes sociales. Este canal permite que OpenClaw reciba y responda a mensajes directos cifrados (DM) mediante NIP-04.
Plugin incluido
Las versiones actuales de OpenClaw incluyen Nostr como Plugin incluido, por lo que las compilaciones empaquetadas normales no necesitan una instalación separada.
Instalaciones antiguas/personalizadas
- La incorporación (
openclaw onboard) yopenclaw channels addsiguen mostrando Nostr desde el catálogo compartido de canales. - Si tu compilación excluye Nostr incluido, instala el paquete npm directamente.
openclaw plugins install @openclaw/nostr
Usa el paquete sin versión para seguir la etiqueta de versión oficial actual. Fija una versión exacta solo cuando necesites una instalación reproducible.
Usa un checkout local (flujos de trabajo de desarrollo):
openclaw plugins install --link <path-to-local-nostr-plugin>
Reinicia el Gateway después de instalar o habilitar plugins.
Configuración no interactiva
openclaw channels add --channel nostr --private-key "$NOSTR_PRIVATE_KEY"
openclaw channels add --channel nostr --private-key "$NOSTR_PRIVATE_KEY" --relay-urls "wss://relay.damus.io,wss://relay.primal.net"
Usa --use-env para mantener NOSTR_PRIVATE_KEY en el entorno en lugar de almacenar la clave en la configuración.
Configuración rápida
- Genera un par de claves de Nostr (si es necesario):
# Using nak
nak key generate
- Añádelo a la configuración:
{
channels: {
nostr: {
privateKey: "${NOSTR_PRIVATE_KEY}",
},
},
}
- Exporta la clave:
export NOSTR_PRIVATE_KEY="nsec1..."
- Reinicia el Gateway.
Referencia de configuración
| Clave | Tipo | Predeterminado | Descripción |
|---|---|---|---|
privateKey |
string | obligatorio | Clave privada en formato nsec o hexadecimal |
relays |
string[] | ['wss://relay.damus.io', 'wss://nos.lol'] |
URL de relés (WebSocket) |
dmPolicy |
string | pairing |
Política de acceso a DM |
allowFrom |
string[] | [] |
Pubkeys de remitentes permitidos |
enabled |
boolean | true |
Habilitar/deshabilitar canal |
name |
string | - | Nombre para mostrar |
profile |
object | - | Metadatos de perfil NIP-01 |
Metadatos de perfil
Los datos de perfil se publican como un evento NIP-01 kind:0. Puedes administrarlos desde la Control UI (Canales -> Nostr -> Perfil) o configurarlos directamente en la configuración.
Ejemplo:
{
channels: {
nostr: {
privateKey: "${NOSTR_PRIVATE_KEY}",
profile: {
name: "openclaw",
displayName: "OpenClaw",
about: "Personal assistant DM bot",
picture: "https://example.com/avatar.png",
banner: "https://example.com/banner.png",
website: "https://example.com",
nip05: "[email protected]",
lud16: "[email protected]",
},
},
},
}
Notas:
- Las URL de perfil deben usar
https://. - Importar desde relés combina campos y conserva las anulaciones locales.
Control de acceso
Políticas de DM
- pairing (predeterminado): los remitentes desconocidos reciben un código de emparejamiento.
- allowlist: solo las pubkeys en
allowFrompueden enviar DM. - open: DM entrantes públicos (requiere
allowFrom: ["*"]). - disabled: ignora los DM entrantes.
Notas de aplicación:
- Las firmas de eventos entrantes se verifican antes de la política de remitente y del descifrado NIP-04, por lo que los eventos falsificados se rechazan pronto.
- Las respuestas de emparejamiento se envían sin procesar el cuerpo del DM original.
- Los DM entrantes tienen límite de tasa y las cargas sobredimensionadas se descartan antes del descifrado.
Ejemplo de allowlist
{
channels: {
nostr: {
privateKey: "${NOSTR_PRIVATE_KEY}",
dmPolicy: "allowlist",
allowFrom: ["npub1abc...", "npub1xyz..."],
},
},
}
Formatos de clave
Formatos aceptados:
- Clave privada:
nsec...o hexadecimal de 64 caracteres - Pubkeys (
allowFrom):npub...o hexadecimal
Relés
Predeterminados: relay.damus.io y nos.lol.
{
channels: {
nostr: {
privateKey: "${NOSTR_PRIVATE_KEY}",
relays: ["wss://relay.damus.io", "wss://relay.primal.net", "wss://nostr.wine"],
},
},
}
Consejos:
- Usa 2-3 relés para redundancia.
- Evita demasiados relés (latencia, duplicación).
- Los relés de pago pueden mejorar la fiabilidad.
- Los relés locales son adecuados para pruebas (
ws://localhost:7777).
Compatibilidad de protocolo
| NIP | Estado | Descripción |
|---|---|---|
| NIP-01 | Compatible | Formato básico de evento + metadatos de perfil |
| NIP-04 | Compatible | DM cifrados (kind:4) |
| NIP-17 | Planificado | DM con envoltorio de regalo |
| NIP-44 | Planificado | Cifrado versionado |
Pruebas
Relé local
# Start strfry
docker run -p 7777:7777 ghcr.io/hoytech/strfry
{
channels: {
nostr: {
privateKey: "${NOSTR_PRIVATE_KEY}",
relays: ["ws://localhost:7777"],
},
},
}
Prueba manual
- Anota la pubkey del bot (npub) desde los registros.
- Abre un cliente de Nostr (Damus, Amethyst, etc.).
- Envía un DM a la pubkey del bot.
- Verifica la respuesta.
Solución de problemas
No se reciben mensajes
- Verifica que la clave privada sea válida.
- Asegúrate de que las URL de relé sean accesibles y usen
wss://(ows://para local). - Confirma que
enabledno seafalse. - Revisa los registros del Gateway para detectar errores de conexión de relé.
No se envían respuestas
- Comprueba que el relé acepte escrituras.
- Verifica la conectividad saliente.
- Observa los límites de tasa del relé.
Respuestas duplicadas
- Es esperado cuando se usan varios relés.
- Los mensajes se deduplican por ID de evento; solo la primera entrega activa una respuesta.
Seguridad
- Nunca confirmes claves privadas en commits.
- Usa variables de entorno para las claves.
- Considera
allowlistpara bots de producción. - Las firmas se verifican antes de la política de remitente, y la política de remitente se aplica antes del descifrado, por lo que los eventos falsificados se rechazan pronto y los remitentes desconocidos no pueden forzar trabajo criptográfico completo.
Limitaciones (MVP)
- Solo mensajes directos (sin chats grupales).
- Sin archivos multimedia adjuntos.
- Solo NIP-04 (envoltorio de regalo NIP-17 planificado).
Relacionado
- Resumen de canales — todos los canales compatibles
- Emparejamiento — autenticación de DM y flujo de emparejamiento
- Grupos — comportamiento de chats grupales y control de menciones
- Enrutamiento de canales — enrutamiento de sesiones para mensajes
- Seguridad — modelo de acceso y endurecimiento