Join Nostr
2026-09-19 12:38:31 UTC

NostrSMS: Bridging SMS & XMPP to Nostr with NIP-46 Remote Signing

NostrSMS Logo

"Because, why not."

Nostr is built on decentralized cryptographic identity, but everyday communications often still happen over legacy telecommunications and transport protocols. What if you're on a road trip with flaky mobile data, carrying a dumbphone, or simply prefer texting from your standard SMS app while staying plugged into your Nostr feed?

That’s the exact itch NostrSMS was built to scratch.

Today, we're sharing NostrSMS v0.1.0 — a lightweight, sovereign bot written in Go that bridges incoming SMS and XMPP chats directly into Nostr notes, replies, reactions, and boosts, without ever touching your private keys.


📱 How the Pipeline Works

Under the hood, NostrSMS is natively an XMPP bot. If you use standard XMPP clients like Dino, Gajim, Monocles, or Conversations, you can message the bot directly.

To achieve standard SMS bridging, you route SMS through federated gateways: 1. jmp.chat: Provides a standard phone number for SMS. 2. Cheogram: Forwards that SMS traffic directly into your XMPP account. 3. NostrSMS: Receives the message over XMPP, handles commands, requests signatures from your remote signer, and publishes to relays.

Text from standard SMS → routed through XMPP → published to Nostr. Simple, clean, and reliable.


🛡️ Security Model: Why Self-Hosting Matters

NostrSMS uses NIP-46 (Nostr Connect) to request signatures from your remote signer (like nsecBunker, Amber, or mobile signers). Your secret key (nsec) remains securely tucked away on your signer at all times.

However, bridging protocols means the bot holds an ephemeral ECDH conversation key to communicate with your signer during active sessions. Because of this, self-hosting is strongly recommended.

We designed NostrSMS with strict privacy and security constraints: - 100% Stateless & RAM-Only: There is no database. Encryption keys, active bunker connections, follow lists, and note caches reside exclusively in volatile memory. Restarting the process or sending !disconnect wipes everything instantly. - Zero Hardcoded Public Relays: The bot never forces public relays on you (no Damus, Primal, or nos.lol hardcoded). It dynamically fetches your personal read/write relays from your NIP-65 (Kind 10002) profile over your bunker connection. - Linux Sandbox Hardening: Includes production-ready systemd unit files (nostrsms.service and nostrsms-user.service) configured with ProtectSystem=strict, ProtectHome=read-only, and NoNewPrivileges=true.


✨ What's in v0.1.0

Here is a rundown of the features included in this initial release:

1. Post Preview Confirmation Mode (!confirm)

Sending an SMS by accident is easy. To prevent broadcasting half-written thoughts or replying to the wrong thread, NostrSMS features an optional draft preview mode. Notes, replies, reactions, and reposts generate an in-memory preview with a 10-minute TTL. Reply y to confirm or n to discard.

2. Smart Zero-Copy Mentions

When an incoming mention alert arrives in your chat, you can reply immediately with !r <text>, or react with !like, !heart, or !boost without copying and pasting long note1... strings.

3. Curated Home Feed (!f)

Instead of relay spam, !f queries your active read relays strictly filtered to your NIP-02 follows list (kind:3), complete with petnames and a 30-minute safety cache TTL.

4. NIP-10 Threading & Gossip Outbox

Full root and reply marker handling with participant p tag inheritance. Outbox gossip broadcasts replies across your write relays, the thread parent relays, and the target authors' dynamic NIP-65 inbox relays.

5. Reactions & Boosts

Engage natively from text messages with NIP-25 likes (!like), hearts (!heart), custom emojis (!react 1 🔥), and NIP-18 reposts (!boost).

6. Live Mention Streaming (!alerts)

Real-time background push streaming delivers incoming replies and mentions straight into your SMS/XMPP conversation as they hit your read relays.


🛠️ Getting Started

You can spin up your own instance in minutes:

git clone https://git.vanderwarker.family/nostr/nostrsms.git
cd nostrsms
make build
cp config.ini.dist config.ini

Configure your XMPP credentials and bot key in config.ini, then run ./nostrsms or install the user service via make service-user.

Stay sovereign, run your own bridge, and see you on the relays!

PV ☮️ 💜 ⚡

"This is the way."