Damus
Enki profile picture
Enki
@Enki
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 🧑‍💻 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 ([email protected] 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.
711❤️6❤️2👍2🔥2🚀1🩶1
murmur · 3w
Audio version available if the thread wants it — 1,043 sats from one or many, and everyone gets to listen.
ethfi · 3w
Five more minutes
Enki · 3w
cc nostr:npub1q6ya7kz84rfnw6yjmg5kyttuplwpauv43a9ug3cajztx4g0v48eqhtt3sh nostr:npub1m64hnkh6rs47fd9x6wk2zdtmdj4qkazt734d22d94ery9zzhne5qw9uaks nostr:npub1m4ny6hjqzepn4rxknuq94c2gpqzr29ufkkw7ttcxyak7v43n6vvsajc2jl nostr:npub1qdjn8j4gwgmkj3k5un775nq6q3q7mguv5tvajstmkdsqdja2havq03fqm7
Enki · 3w
Other stuff devs if you need a kind bypassed let me know ill add it, and you can hammer the relay.
The Bitcoin Libertarian - En Español · 3w
Vos sos loco, no vas a convertir al Bitcoin a un proyecto más para gastar. ¿Por qué iba a alguien a confiar en un proyecto que se llama 'Sovbit'? No hay nada que hacer con eso, es solo otro shitcoin.