A web-based Nostr client built into the ExtFW framework. Feature overview, NIP support, and comparison with other clients.
Web Client · Open Architecture · Self-hostedNoxtr is a web-based Nostr client integrated into the ExtFW PHP framework. It runs as a module within a self-hosted website, combining Nostr protocol access with server-side features like user accounts, Lightning address hosting, and NIP-05 identity verification.
It is designed as a single-page application with no external JavaScript frameworks — vanilla JS with a lightweight DOM helper (wquery).
Runs on your own server (Apache/nginx, PHP, MySQL/SQLite). You control your data, your relay list, and your Lightning endpoints.
No React, no Vue, no npm, no build step. Pure vanilla JavaScript in a single file. Crypto via noble-secp256k1 and noble-ciphers.
NIP-05 verification and LNURL-pay Lightning addresses are auto-configured from your server's user accounts.
Supports NIP-07 browser extensions, nsec private key entry, NIP-46 Nostr Connect (remote signing with QR), and npub read-only mode.
Nostr Implementation Possibilities (NIPs) supported by Noxtr:
| Kind | Description | Usage |
|---|---|---|
| 0 | Profile Metadata | Name, avatar, banner, about, nip05, lud16 |
| 1 | Text Note | Main feed content, hashtags, mentions |
| 3 | Contact List | Follow/unfollow, petnames, relay hints |
| 4 | Encrypted DM | AES-CBC with IV, NIP-07 or privkey decryption |
| 5 | Deletion | Delete own notes and own channel messages (kind 42) |
| 6 | Repost | Repost notes |
| 7 | Reaction | Like/unlike notes |
| 40 | Channel Create | NIP-28 public chat channel |
| 41 | Channel Metadata | Channel name, about, picture |
| 42 | Channel Message | Messages in public channels (own messages deletable via kind 5) |
| 1984 | Report | NIP-56 spam reports |
| 30023 | Article (NIP-23) | Long-form content: mixed into feed with “Read” badge, full Markdown view, article composer |
| 38383 | P2P Order (NIP-69) | Bitcoin buy/sell orders from Mostro robots. P2P ₿ tab with order listing, plain-language explanation per order, and guided buy flow |
| 9734 | Zap Request | Lightning payment metadata |
| 9735 | Zap Receipt | Payment confirmation from server |
| 24133 | Nostr Connect | NIP-46 remote signing |
Global, Following, Followers, Topics (hashtag subscriptions), and Hot (engagement-ranked trending).
NIP-04 encrypted DMs with conversation threads, local DB caching, and extension-based decryption.
Create, join, and chat in public channels. Channel metadata, pinning, invite links, and creator-only settings. Delete own messages (NIP-09).
Long-form content (kind 30023) mixed into the feed with a “Read” badge and deduplication. Full Markdown view. Composer with title, summary, image, and tag fields.
Full thread view with root/reply markers, reply counts, chronological ordering, and permalinks.
NIP-57 zaps with internal balance transfers between registered users and external BTCPay invoices via LNURL-pay.
Self-hosted Lightning infrastructure via BTCPay Server. LNURL-pay endpoint serves invoices, creates BOLT11 payment requests, and processes zap receipts (kind 9735) with server-side Schnorr signatures. Received sats accumulate in user balance for internal transfers or withdrawal.
NIP-50 text search with multi-relay fallback. Profile search via @username. Entity detection for npub/note/nevent.
Subscribe to hashtags (#bitcoin, #nostr, etc.) and filter your feed. Suggested topics, bulk toggle, hot filter.
Bookmark notes locally. Mute users with optional NIP-56 spam reporting. Unmute management in settings.
Embedded images (lazy-loaded), video players, YouTube/Vimeo embeds. Dead domain detection with 24h TTL auto-retry.
Edit name, bio, avatar, banner. NIP-05 and Lightning address auto-configured from server account.
Add/remove/toggle relays. Live connection status. Exponential backoff reconnection. Subscription rebalancing.
Dedicated tab for buying Bitcoin without inter/mediaries using the Mostro protocol over Nostr. Displays sell orders (kind 38383, NIP-69) with a plain-language explanation for each. Guided flow: take order → encrypted DM to robot → submit Lightning receive invoice → get sats. No Lightning node required; works with Phoenix, Breez, Zeus.
Parse and render AR mesh network profile broadcasts (ar_profile, ar_collaboration) as visual cards with avatar, location, and social actions.
An impartial comparison of Noxtr against established Nostr clients. Each client has different strengths — this table aims to be factual, not promotional.
| Noxtr | Damus | Amethyst | Primal | Snort | Iris | Coracle | Nostur | |
|---|---|---|---|---|---|---|---|---|
| Platform | Web | iOS | Android | Web/iOS/Android | Web | Web/Multi | Web (PWA) | iOS/macOS |
| Open source | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Self-hosted | ✓ | — | — | — | ✓ | ✓ | ✓ | — |
| No build step required | ✓ | n/a | n/a | — | — | — | — | n/a |
| Documented NIPs | 18 | ~15 | 60+ | ~20 | 42 | ~15 | ~15 | ~15 |
| NIP | Noxtr | Damus | Amethyst | Primal | Snort | Iris | Coracle | Nostur | |
|---|---|---|---|---|---|---|---|---|---|
| 01 | Basic protocol | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 02 | Contact list | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 04 | Encrypted DMs (legacy) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | read | ✓ |
| 05 | DNS identity | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 07 | Browser signer | ✓ | n/a | n/a | ✓ | ✓ | ✓ | ✓ | n/a |
| 09 | Event deletion | ✓ | ~ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 10 | Reply threading | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 19 | Bech32 entities | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 23 | Long-form content (articles) | ✓ | — | ✓ | ✓ | ✓ | — | — | — |
| 25 | Reactions | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 28 | Public channels | ✓ | — | ✓ | — | ✓ | — | — | — |
| 44 | Versioned encryption | ✓ | ~ | ✓ | — | ✓ | ✓ | ✓ | ✓ |
| 46 | Nostr Connect | ✓ | — | ~ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 50 | Search | ✓ | ~ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 57 | Lightning Zaps | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| 65 | Relay list metadata | ✓ | ✓ | ~ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Feature | Noxtr | Damus | Amethyst | Primal | Snort | Iris | Coracle | Nostur |
|---|---|---|---|---|---|---|---|---|
| Modern DMs (NIP-17/44) | — | ~ | ✓ | — | ✓ | ✓ | ✓ | ✓ |
| Built-in wallet | balance | Coinos | — | ✓ | — | Cashu | — | — |
| Profile search (@user) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Public channels (NIP-28) | ✓ | — | ✓ | — | ✓ | — | — | — |
| Trending / Hot feed | ✓ | — | ✓ | ✓ | ✓ | — | — | — |
| Topic/hashtag subscriptions | ✓ | — | ✓ | ~ | ~ | — | — | ~ |
| NIP-05 hosting | ✓ | — | — | premium | paid | — | — | — |
| Lightning address hosting | ✓ | — | — | ✓ | paid | — | — | — |
| Multiple accounts | logout/login | — | ✓ | — | ✓ | — | ✓ | ✓ |
| Long-form content (NIP-23) | ✓ | — | ✓ | ✓ | ✓ | — | — | — |
| Communities (NIP-72) | — | — | ✓ | — | — | — | ✓ | — |
| File upload (NIP-96) | — | — | ✓ | — | ✓ | — | ✓ | — |
| BTCPay Server integration | ✓ | — | — | — | — | — | — | — |
| Buy Bitcoin P2P (Mostro) | unique | — | — | — | — | — | — | — |
| AR profile rendering | unique | — | — | — | — | — | — | — |
Areas where Noxtr is behind other clients:
Noxtr includes native support for Mostro, a peer-to-peer Bitcoin exchange protocol built on top of Nostr. You can buy or sell Bitcoin directly with other people, with no inter/mediaries or custodians, paying by bank transfer, cash, or any other agreed method.
The P2P ₿ tab in the navigation bar gives you access to the live order book with all available offers.
No prior Bitcoin experience needed. You only need a Lightning wallet on your phone (Phoenix, Breez, Zeus, Wallet of Satoshi…).
user@wallet.com) or a bolt11 invoice generated from your wallet — that is where you will receive the sats.If the seller’s wallet or the robot’s node cannot route the payment to your address, the trade card will show a field to enter an alternative Lightning address. Your sats are always safe with the robot.
If you already use the Mostro Mobile app, you can import your identity into Noxtr without creating a new account:
m/44'/1237'/38383'/0/0).Completed trades (cancelled or finished) are not recovered because the robot does not track them. Past history is only available if the same 12 words and interface initiated those trades.
After completing a trade you can rate the counterpart from 1 to 5 stars. Ratings received appear in your reputation card (⭐ average · number of trades). Mostro robots publish each user’s accumulated reputation alongside their order book entries.
To send messages to the robot, wss://relay.mostro.network must be active in the user’s relay list. The order book works with any general relay, but communication with the robot requires that specific relay. Noxtr adds it automatically as a default relay for new installations.
Noxtr does not require the server to run a Lightning node for the Mostro flow. The Lightning wallet belongs to the end user (Phoenix, Breez, Zeus, etc.). BTCPay Server is only needed for the zap system and profile Lightning addresses, not for Mostro.
Active trades are stored in NSTR_MOSTRO_TRADES and Mostro events in NSTR_MOSTRO_EVENTS. Both tables are created automatically. Reputation data is calculated from NSTR_MOSTRO_EVENTS with no extra table.
The server Monitor can be configured to automatically take orders that match predefined rules (amount, currency, robot age). See the Monitor section below.
The Monitor is a PHP process that runs in the background on the server and watches active Mostro trades even when no user has the web app open. It listens to Nostr relays continuously and acts whenever it receives relevant events.
If the site administrator has the Monitor running, you will receive automatic alerts whenever something happens in your trades:
| Event | Notification received |
|---|---|
| Someone takes your published order | Email: “Your order #XXXXXXXX has been taken” |
| The robot asks you to pay the hold invoice (selling BTC) | Email: “You must pay the hold invoice” |
| The buyer confirms they sent the fiat (selling BTC) | Email: “The buyer has sent the payment” |
| The trade completes | Email: “Trade completed” |
| New private message in your inbox | Telegram (if you have the bot linked) |
Each notification is sent once per trade and event type — no spam.
/start CODE command shown on screen and paste it into the bot chat in Telegram.The Monitor is managed from the web admin panel (/noxtr/server_admin) via the Start / Stop / Status buttons, or directly from the server console:
php /path/index.php noxtr/server/action=monitor --verbose
To keep it running in the background:
nohup php /path/index.php noxtr/server/action=monitor > /var/log/monitor.log 2>&1 &
The Monitor has its own Nostr identity. Authorized administrators can send it plain-text commands via DM from any Nostr client (including Noxtr). Its npub appears in the startup message and in the web panel.
| Command | Action |
|---|---|
ping | Checks the channel is responding. Returns pong. |
status | Version, watched trades, active filters, uptime, relays. |
trades | Live order book (options: age 4h, amount 50 EUR, status pending). |
relays | Relays connected in the current session. |
filter_trade list | Active auto-take rules. |
filter_trade amount 50 EUR | Adds rule: take orders for exactly 50 EUR. |
filter_trade days 0 | Adds rule: take orders from robots with 0 days of age. |
filter_trade remove amount 50 | Removes the 50 EUR rule. |
filter_trade clear | Removes all auto-take rules. |
email | Sends a test email to the admin. |
reload | Reconnects to relays without restarting the process. |
stop | Stops the process cleanly. |
help | Full contextual help. |
In addition to watching user trades, the Monitor notifies the administrator of every new order that appears in the Mostro order book:
To receive new-order notifications via Telegram, the administrator must have the bot linked and their Nostr pubkey added to admin_pubkeys in the Monitor configuration.
The Monitor can automatically take orders that match configured rules. This is useful for scenarios such as “always take orders from 0-day robots” or “always take orders for exactly 88 EUR”.
Auto-take is ephemeral: the Monitor generates a temporary keypair, takes the order, and notifies the admin, but does not create a persistent trade in the database. Subsequent tracking of the trade must be done manually from another Mostro client.
admin_pubkeys can send commands. Events are verified cryptographically with Schnorr signatures. Commands older than 5 minutes are automatically ignored.
| Component | Technology |
|---|---|
| Frontend | Vanilla JavaScript (single IIFE), wquery DOM helper |
| Backend | PHP (ExtFW framework module) |
| Database | MySQL or SQLite (dual-compatible SQL) |
| Web server | Apache (mod_rewrite) or nginx |
| Cryptography | noble-secp256k1 (BIP-340 Schnorr), noble-ciphers (XChaCha20-Poly1305), Web Crypto API (AES-CBC, HKDF) |
| Lightning | BTCPay Server (LNURL-pay, BOLT11 invoices) |
| Storage | Server DB (contacts, topics, bookmarks, DMs, relays, muted, channels) + localStorage/IndexedDB (keys, UI state) |