Floonet
Floonet is a network of Nostr relays for the Grin community. Anyone can run one, and anyone can run a name authority on one so people can claim (and optionally pay for) a name.
A Floonet relay is an ordinary Nostr relay with strong opinions. It stores only the handful of event kinds the Grin ecosystem actually uses, it says nothing about payments in its public metadata, it welcomes connections arriving over Tor, and it ships hardened by default. Wallets like Goblin use Floonet relays to deliver gift-wrapped Grin payments and to resolve names like alice.
The flagship relay, relay.floonet.dev, runs floonet-strfry and is the Goblin wallet’s default money-path relay: wallets reach it over Tor, dialing its ordinary clearnet host through a Tor exit so the wallet’s own IP never touches the payment path. The same relay also hosts the Magick Market marketplace, so it runs the shipped default whitelist unmodified: one relay, two applications.
The two packages
Floonet ships as two relay packages. Both carry the same conventions; pick the one that fits how you like to operate.
| Package | Base | Shape |
|---|---|---|
| floonet-strfry | strfry (C++) | Stock strfry at a pinned ref plus a spec: a modular write-policy plugin, a bundled name authority, and a TLS proxy, deployed as one Docker Compose unit. |
| floonet-rs | nostr-rs-relay (Rust) | A single binary with an installer and a hardened systemd unit. Policy lives in a composable admission module; the name authority and the GoblinPay payment processor are built in. |
Both add the same four features, each configurable, optional, and modular:
- An event-kind whitelist (the keystone: default deny, see below).
- Authentication: NIP-42 plus pubkey whitelists.
- Paid access and paid names via GoblinPay (Grin).
- A name authority: the bundled NIP-05 service that maps names to keys, served under the relay’s own subdomain by default so
name@relay.yourdomainjust works with no separate hostname to run. Chosen in setup, it can run alongside the relay, standalone, or not at all, and it supersedes the older standalone goblin-nip05d.
The relay needs no special transport component. Wallets reach it over Tor; a Floonet relay is just a normal public relay that accepts Tor connections.
The whitelist keystone
The single most important design decision in Floonet is default deny. A Floonet relay accepts only the event kinds it has been explicitly told to allow, and drops everything else. The core of the allowed set is exactly what a Grin payment wallet needs:
| Kind | What it is |
|---|---|
0 | Profile metadata |
3 | Contact list |
5 | Deletion request (NIP-09) |
13 | Seal (NIP-59) |
1059 | Gift wrap (NIP-59): the sealed envelope payments travel in |
10002 | Relay list (NIP-65) |
10050 | DM relay list (NIP-17) |
27235 | HTTP auth (NIP-98): used by the name authority |
The shipped default in both packages is this wallet core plus the Magick Market marketplace kinds (listings, orders, receipts) and Nostr Connect login: 24 kinds in total, and exactly the list running in production on relay.floonet.dev; the allowed kinds reference has the full table. Everything else, zaps and bot spam, is rejected. This keeps a Floonet relay lean, cheap to run, and uninteresting to abuse. The list is one editable config value in both packages, so it can grow (or shrink to the wallet core) without code changes. See The whitelist: default deny.
Public notes get one extra gate on top. The two public-note kinds, 1 (text notes) and 30023 (long-form articles), are accepted only from an operator-chosen set of authorized authors, and are closed by default. That is the self-hoster guarantee: running a Floonet relay means no public-note spam, and you decide exactly who can post notes and articles (for example an official news key), while profiles, gift wraps, marketplace events, and DM and relay lists keep flowing for everyone. See Public notes are author-locked.
How to read these docs
- Concepts: the ideas every operator should know, whichever package they run.
- floonet-strfry and floonet-rs: deploy, configure, and extend each package.
- Operate: hardening, rate limits, and charging GRIN for relay resources.
- Reference: config keys, endpoints, and the allowed-kinds table.
Where these docs cite code, they use file:line references into the package source or the pinned upstream so you can read along.