Vendor lock-free stateless alternative to blastr with additional features:
- relay discovery
- spam filtering
- event filtering
- kind
- possible per relay as well
- author/mention
- PoW
- kind
- gossip
- subscribe to events (of particular authors and event kinds) and distribute them automatically
- won't transmit protected events by default
- tor/onion relays
- relays ignore list
- minimizes the risk of being rate-limited by relays
- it checks whether event is already published on a certain relay
cargo install --locked broadcastrcargo install --locked --force --git https://github.com/codonaft/broadcastrbroadcastr \
--listen ws://localhost:8080 \
--relays https://codonaft.com/relays.json \
--read-relays wss://monitorlizard.nostr1.com,wss://relay.nostr.watch,wss://relaypag.es
💡 Usage 👁️
Usage: broadcastr [--listen <listen>] [--relays <relays>] [--read-relays <read-relays>] [--block-relays <block-relays>] [--block-ttl <block-ttl>] [--kinds <kinds>] [--pubkeys <pubkeys>] [--no-mentions] [--subscribe] [--no-protect] [--no-gossip-discovery] [--no-nip66-discovery] [--no-azzamo] [--tor-proxy <tor-proxy>] [--proxy <proxy>] [--log-level <log-level>] [--max-relays <max-relays>] [--max-events-by-author-per-min <max-events-by-author-per-min>] [--max-events-by-ip-per-min <max-events-by-ip-per-min>] [--max-events-per-min <max-events-per-min>] [--min-pow <min-pow>] [--max-tags <max-tags>] [--update-interval <update-interval>] [--max-backoff-interval <max-backoff-interval>] [--connect-timeout <connect-timeout>] [--request-timeout <request-timeout>] [--relay-info <relay-info>] [--redirect <redirect>] [--max-msg-size <max-msg-size>] [--tcp-backlog <tcp-backlog>] [--max-frame-size <max-frame-size>]
Broadcast Nostr events to other relays
Options:
--listen the listener ws URI (e.g. "ws://localhost:8080")
--relays relays or relay-list URIs in a descending order of priority
(comma-separated, optionally with per relay event kind
allow-list, e.g.
"https://codonaft.com/relays.json,file:///path/to/relays-in-array.json,wss://user.kindpag.es#k=0+3+10002,ws://1.2.3.4:5678")
--read-relays same, but for read-only relays; overrides the --relays
entries
--block-relays same, but for ignored relays; put public URL to your
broadcastr here to avoid loops
--block-ttl store automatically blocked relays for given amount (default
is 2h)
--kinds allow some event kinds only (comma-separated allow-list, e.g
"0,1,3,5,6,7,4550,34550")
--pubkeys allow authors or mentioned authors only (comma-separated
hex/bech32/NIP-21 allow-list)
--no-mentions disallow mentions of the allowed authors' events or events
with the authors' replies
--subscribe subscribe and automatically distribute all allowed events
(including mentions)
--no-protect ignore NIP-70 protection tag for the automatically
distributed events
--no-gossip-discovery
don't discover additional relays from user profiles
--no-nip66-discovery
don't discover additional relays using NIP-66
--no-azzamo don't use azzamo.net for spam filtering
--tor-proxy connect to tor onion relays using socks5 proxy (e.g.
"127.0.0.1:9050")
--proxy make all connections using socks5 proxy
--log-level log level (default is info)
--max-relays limit the connection pool
--max-events-by-author-per-min
limit events by author (default is 5)
--max-events-by-ip-per-min
limit events by IP (default is 50)
--max-events-per-min
limit all events (default is 1000)
--min-pow proof of work difficulty limit
--max-tags max tags allowed for non-kind-3 events (default is 32)
--update-interval relays and spam-lists update interval (default is 15m)
--max-backoff-interval
max update backoff interval (default is 5m)
--connect-timeout connection timeout (default is 15s)
--request-timeout request timeout (default is 10s)
--relay-info relay info NIP-11 JSON
--redirect redirect to a given URL when accessed from a browser
--max-msg-size event message size
--tcp-backlog max incoming connections per listener IP address
--max-frame-size ws frame size
-h, --help display usage information
🌐 nginx 👁️
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
real_ip_header X-Forwarded-For;
real_ip_recursive on;
server {
location / {
proxy_http_version 1.1;
proxy_connect_timeout 20s;
proxy_socket_keepalive on;
proxy_send_timeout 365d;
proxy_read_timeout 365d;
proxy_request_buffering off;
proxy_buffering off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://localhost:8080/;
}
}
}
▶ ⚙️ OpenRC
- make it compatible with ordinary clients (besides
nak)- support delivery of multiple events over the same connection
- response with
varyheader
- support azzamo ban api
- use client IP (requires
X-Forwarded-FororX-Real-IPrequest header in your reverse proxy)- rate-limit
- allow-list
- which overrides pubkeys allow-list?
- disables rate-limit for tor exit nodes?
- use follower list as allow-list
- use REQ filter as allow-list?
- e.g. allow events that ping a certain npub
- limit number of
ptags for events by strangers to avoid spam
- limit number of
- e.g. allow events that ping a certain npub
- deduplicate concurrently sent events
- option to subscribe to a certain REQ filter and automatically broadcast such events
- with auto added
authorsandsince don't disconnect from relays specified in10002of the allowed npubs, keep reading from them?
- with auto added
- NIP-11
- custom relay info
- don't serialize
null?
- custom http page or a redirect
- improve RAM usage
- run memory profiler
- disconnect from relays?
- that previously didn't receive events with the same kind?
- that closed connections after we sent them event?
- option to disconnect after timeout?
- which are NIP-42-only ("auth-required"/"auth failed")
- ban relays that didn't receive the known kinds
- relays that fail due to TLS or DNS
- make sure we don't attempt to connect to faulty relays
- retry to connect with an exponential backoff?
- add metrics
- endpoint that returns a healthy relay list?
- socks5/http proxy for all connections
login to NIP-42 relays?- does it make sense transmitting someone else's events from a generated
nsec?
- does it make sense transmitting someone else's events from a generated
- option to ignore TLS issues?
- disallow for NIP-59 and NIP-70?
- per relay event kind allow-list
- find newest replaceable and addressable events and broadcast them instead
- allow transmission of others' events mentioned by allowed authors
- except for NIP-56 reported events and NIP-59 gift wraps
- disallow potentially spammy events from strangers that mention allowed authors
- check how fast the stranger responded
- responding to a long enough article too fast is a red flag
- check if the stranger is listed in authors' subscriptions
- check spam reports on the stranger? check in mute-lists?
- the reports/mute-lists might not be trustworthy, but happened due to some interpersonal conflict
- if it's a new event—there will not be any reports yet
- put possibly spammy events to quarantine period and recheck later before transmitting?
- check whether it was labeled by a trusted spam detector bot?
- check the age of the stranger?
- count their public posts and comments?
- check trust rank?
- in this example, allow event
6cb47b0680acb9ec08cce944a1350de030e3be63e402d2eaec01805de757a41abut not0000ae5c088c3653f76642756833ea9b52dde0d7eb75ea2b69c609221043a0aa- spammy events can be shared by legit npubs
- check how fast the stranger responded
- act as a proxy for REQs?
- a RAM-cached proxy for all transmitted events?
- a proxy to a list of relays?
- act as a NIP-59 gift wrap proxy?
- receive events from NIP-42 authenticated users only, WS only
- distribute to relevant 10050 relay lists
- ignore broken DM relays
I'm currently investing all my time in FOSS projects.
If you found this repo useful and you want to support me, please
Your support keeps me going ❤️ (◕‿◕)
MIT/Apache-2.0