<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Private Nostr Relay: strfry with an npub write allowlist (community package)]]></title><description><![CDATA[<p dir="auto">I've packaged <a href="https://github.com/hoytech/strfry" target="_blank" rel="noopener noreferrer nofollow ugc">strfry</a> (GPL-3.0), a fast C++ <a href="https://nostr.com" target="_blank" rel="noopener noreferrer nofollow ugc">Nostr</a> relay, as a Cloudron community app. "Private" here means private writes: only the public keys you list can publish, and every other write is rejected. It won't turn into an open public relay that strangers fill up.</p>
<p dir="auto"><strong>What it's for</strong></p>
<p dir="auto">A Nostr relay is a shared noticeboard. Clients post signed events to it, and other clients read them back. Your posts, profile and follow list reach other people because their clients read them from relays. With this package, one of those relays is yours:</p>
<ul>
<li><strong>Your own outbox.</strong> Add it to your Nostr client next to public relays. Your posts, profile and follows have a copy on your own server that no one else can moderate away, and others can still read them there.</li>
<li><strong>A small group's relay.</strong> List the keys of family, a team, or a club. Only those members can post, and nobody needs an account on your server.</li>
<li><strong>Bots and services.</strong> Give an automation its own key and a relay it can always publish to.</li>
</ul>
<p dir="auto"><strong>What it isn't:</strong> a private messaging server. Messages are private only when your client encrypts them (for example NIP-17 direct messages). The relay then stores ciphertext, but who messaged whom can still be visible. Restricting DM reads to the people involved needs a strfry release that isn't out yet.</p>
<p dir="auto"><strong>Install</strong> (Cloudron 9.1 or later): from <a href="https://ca.cloudron.io/app/com.marcusquinn.cloudron.strfry" target="_blank" rel="noopener noreferrer nofollow ugc">Community Apps</a>, or add this versions URL under Community apps in your dashboard settings, or run:</p>
<pre><code>cloudron install --versions-url https://raw.githubusercontent.com/marcusquinn/cloudron-nostr-relay-app/main/CloudronVersions.json --location relay
</code></pre>
<p dir="auto">Your relay is then <code>wss://&lt;your-app-domain&gt;</code>. Add keys to <code>/app/data/allowlist.txt</code> with the app's File Manager or Web Terminal: one <code>npub</code> or 64-character hex key per line, <code>#</code> for comments. Changes apply to the next event, no restart.</p>
<p dir="auto"><strong>What the package does</strong></p>
<ul>
<li>Starts closed. An empty, missing or unreadable allowlist rejects every write, and an invalid or partly written entry never grants access. Rejected clients see <code>blocked: pubkey is not on the relay allowlist</code>.</li>
<li>The check uses the event's signing key. Replies and reactions from people who aren't on the list are not stored, even when they reference your events.</li>
<li>The strfry LMDB database, generated config and allowlist live under <code>/app/data</code> and are in Cloudron backups.</li>
<li>NIP-11 relay information (name, description, contact, operator key) is set with app environment variables (<code>RELAY_NAME</code>, <code>RELAY_DESCRIPTION</code>, <code>RELAY_CONTACT</code>, <code>RELAY_OPERATOR_PUBKEY</code>).</li>
<li>Client IPs come from Cloudron's proxy, and Cloudron terminates TLS.</li>
<li>strfry 1.1.3 is built from the pinned upstream tag on <code>cloudron/base:6.0.0</code>. The default memory limit is 512 MB.</li>
</ul>
<p dir="auto"><strong>Please read before relying on it:</strong></p>
<ul>
<li><strong>Reads are public.</strong> Anyone who knows the address can read stored events. Treat what you publish as public unless it is encrypted. Writes don't need a login: every event is signed, and the relay checks that the signing key is on your list.</li>
<li>Never put a private key (<code>nsec</code>) in the allowlist. It is ignored, and the file is readable by anyone with app access.</li>
<li>The database has no size cap of its own. It grows with stored events, within your server's disk.</li>
</ul>
<p dir="auto"><strong>Tested on a live Cloudron:</strong> install from the versions URL; allowlisted writes accepted and others rejected over <code>wss://</code>; NIP-11 settings; persistence across restart; backup and restore; and the 0.1.0 → 0.1.1 update from the published catalog with data intact. Results are in the repository's <code>test/QUALIFICATION.md</code>.</p>
<p dir="auto">Source, docs and issues: <a href="https://github.com/marcusquinn/cloudron-nostr-relay-app" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/marcusquinn/cloudron-nostr-relay-app</a>. It's packaged independently of the strfry project; the packaging files are MIT. Feedback welcome, especially from people running it with many clients or a large event history.</p>
]]></description><link>https://forum.cloudron.io/topic/16142/private-nostr-relay-strfry-with-an-npub-write-allowlist-community-package</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 18:46:01 GMT</lastBuildDate><atom:link href="https://forum.cloudron.io/topic/16142.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 17 Oct 2026 03:16:52 GMT</pubDate><ttl>60</ttl></channel></rss>