Sovbit Nostr Relay Stack — Now in Testing
This has been a long time coming. sovbit.host is getting a massive upgrade, and before I flip the switch I need real user feedback. Testing is live now at sovbit.dev, nothing there is permanent, so go break things.
Let me explain what this actually is.
In the past I ran three relays (free, paid, WOT), a file host, NIP-05 addresses, and a Lightning address server for zaps. It worked, but it was a hodgepodge of services held together by good intentions and duct tape. This is my attempt to build something coherent — a complete, production-ready paid Nostr relay stack. Not just a relay config, but the entire layer on top: payments, subscriber portal, file hosting, video publishing, admin tooling, content moderation, and spam filtering. No Docker. One server, one git repo, one install script (eventually….the installer is still a work in progress). I don’t really like the way WOT relays work. Using me as a source of authority and trust seems dumb so that is probably going to go away.
The Relay
There are two tiers running on the same strfry instance:
The free relay is open to everyone. No account needed, no payment. It runs through a spam filter chain so the feed stays clean, but anyone can connect and post.
The paid relay requires authentication and an active subscription. If you're not subscribed, you get a rejection message with a link to the portal. Bypasses are available for operators who need specific event kinds through for example, a Robosats order book event (kind 38383) would get flagged as spam pretty fast, so there's a way to allow specific kinds through on a per-operator basis.
Spam Filtering
Three layers chained together: relay-policy-wrapper.sh kicks things off, chain-policy.py manages the subprocess chain, nspam-strfry (shoutout utxo the webmaster 🧑💻 (npub1utx…50e8) for this) handles ML-based spam detection on kind:1 events with a per-pubkey pending/whitelist/blacklist state machine, and relay-policy handles NIP-42 auth, rate limits, and subscription verification. The result should be a significantly cleaner feed than a raw open relay.
Payments
Users buy time, not a subscription plan. One price per day in sats fully configurable by the operator. Bulk discounts are also configurable: the more days you buy, the bigger the discount. Once a payment is confirmed via webhook, the subscription activates immediately.
A renewal bot sends NIP-17 encrypted DMs at 7, 3, and 1 day before your subscription expires so you don't get cut off by surprise.
The User Portal
Once you're logged in, via browser extension or NIP-46 bunker signer, you can:
* See your subscription status and exact expiry date
* Generate a Lightning invoice to extend your subscription
* View your relay connection URLs including WSS, Tor, and I2P addresses
* Upload images and videos to your personal file storage
* Manage your Nostr profile (kind:0) and avatar
* Register a Nostr address (user@yourdomain.com NIP-05)
* Back up and restore your follow list and profile
* Manage your uploaded files and published videos
File Hosting and Video
Images and videos are hosted on the same server via Blossom (BUD-01/02/06) and NIP-96. Storage quotas are configurable per tier free accounts get a smaller quota, paid subscribers get more.
For video, whether you upload via the portal or a Nostr client, the backend accepts it, queues a transcode job, and ffmpeg produces HLS segments at multiple quality tiers (720p, 480p, 360p) with proper bitrate caps (ill add 1080p later). Range requests are supported so iOS playback works. The transcoded video gets a NIP-71 event published with proper imeta tags including the HLS streaming URL, so clients that support adaptive bitrate get the best experience and everything else falls back to the raw blob.
From the portal you can then choose to publish the video as a YouTube-style horizontal video or a short-form vertical clip. This will probably need some refinement, but the core pipeline is working.
A note on the file host
To upload files you need an account — free or paid. This is an intentional design choice.
I run files.sovbit.host using the nostrcheck software. Like most Nostr media servers, it uses NIP-98 auth — any valid Nostr key can upload without pre-registering. That means anyone with a Nostr key, bot or not, can dump files. Without a registered account tied to an upload I have no practical way to manage abuse at scale as a solo operator.
On the new stack, every upload is tied to a registered pubkey. If someone uploads something that gets banned, that pubkey gets blocked from uploading again. The hash blocklist prevents the same content from being re-uploaded by any other account.
Free accounts get a storage quota. Login takes ten seconds with a browser extension or a bunker signer. That is the only barrier — no email, no KYC, just your Nostr key.
Sorry but also kinda not sorry. I'm sick of Chinese model spam, gore porn, and CSAM on my host and it's been hell to moderate. nostrcheck does a fantastic job making moderation tools but as a solo operator I need a more limited upload window.
Content Moderation
Every uploaded image and video goes into a moderation queue. Admins can approve, delete, or ban content. Banned file hashes go into a blocklist so the same content can't be re-uploaded by any user. Basic but functional.
Tor/I2P Access
The relay and portal are accessible over both Tor and I2P if you need to connect without revealing your IP. The relay WebSocket runs directly through both transports.
For Operators
The whole thing is designed to be self-hosted and rebranded. The install script handles system deps, Rust builds, strfry compilation, PostgreSQL setup and migrations, nginx vhosts, certbot SSL, and optional Tor/I2P setup. Grafana and Prometheus are included for monitoring. Pricing, discounts, storage quotas, and domain names are all configurable via environment variables.
Test it: relay.sovbit.dev / freelay.sovbit.dev / portal.sovbit.dev
Feedback welcome. What's broken, what's missing, what's confusing. Now I'm going to go do some yard work and let people break things. I'm intentionally keeping prices low during testing not trying to gouge anyone, but I do need to make sure the payment flows work, and after I touch some grass ill try and address issues.
Public repo is here: https://codeberg.org/Enkisu/sovbit-nostr if any big brain dev wants to rip this apart please do.
