Skip to content

Latest commit

 

History

History
147 lines (131 loc) · 7.12 KB

File metadata and controls

147 lines (131 loc) · 7.12 KB

Broadcastr

Made for Nostr Crates.io Crates.io Dependency Status Awesome GitHub Sponsors

Vendor lock-free stateless alternative to blastr with additional features:

  • spam filtering (spam.nostr.band and azzamo.net)
  • events filtering
    • kind
    • author/mention
    • PoW
  • gossip
  • tor/onion relays
  • minimizes the risk of being rate-limited by the relay
    • it checks whether event is already published on a certain relay
  • relays ignore list

Changelogs.

Install

From crates.io

cargo install --locked broadcastr

From git

cargo install --locked --force --git https://github.com/codonaft/broadcastr

Run

broadcastr --listen ws://localhost:8080 --relays https://codonaft.com/relays.json --read-relays wss://nostr.wine,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>] [--max-relays <max-relays>] [--tor-proxy <tor-proxy>] [--proxy <proxy>] [--pubkeys <pubkeys>] [--no-mentions] [--event-kinds <event-kinds>] [--subscribe] [--max-events-by-author-per-min <max-events-by-author-per-min>] [--max-events-by-ip-per-min <max-events-by-ip-per-min>] [--min-pow <min-pow>] [--no-gossip-discovery] [--no-nip66-discovery] [--no-azzamo] [--no-nip11-requests] [--update-interval <update-interval>] [--max-backoff-interval <max-backoff-interval>] [--connect-timeout <connect-timeout>] [--request-timeout <request-timeout>] [--log-level <log-level>] [--max-tags <max-tags>] [--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 (comma-separated, e.g.
                    "https://codonaft.com/relays.json,file:///path/to/relays-in-array.json,ws://1.2.3.4:5678")
  --read-relays     same, but for read-only relays; overrides entries of the
                    write relays
  --block-relays    same, but for ignored relays; put public URL to your
                    broadcastr here to avoid loops
  --max-relays      limit the connection pool
  --tor-proxy       connect to tor onion relays using socks5 proxy (e.g.
                    "127.0.0.1:9050")
  --proxy           make all connections using socks5 proxy
  --pubkeys         allow authors or mentioned authors only (comma-separated
                    hex/bech32/NIP-21 allow-list)
  --no-mentions     disallow mentions (of the allowed authors) by others
  --event-kinds     allow some event kinds only (comma-separated allow-list, e.g
                    "0,1,3,5,6,7,4550,34550")
  --subscribe       subscribe and automatically distribute events of the allowed
                    authors and event kinds
  --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)
  --min-pow         pow difficulty limit (NIP-13)
  --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
  --no-nip11-requests
                    consume less CPU but block possibly failing relays more
                    aggressively
  --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)
  --log-level       log level (default is info)
  --max-tags        max tags allowed for non kind 3 events (default is 32)
  --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

TODO

  • make it compatible with ordinary clients (besides nak)
    • support delivery of multiple events over the same connection
    • response with vary header
  • support azzamo ban api
  • use client IP (requires X-Forwarded-For or X-Real-IP request 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 p tags for events by strangers to avoid spam
  • deduplicate concurrently sent events
  • option to subscribe to a certain REQ filter and automatically broadcast such events
    • with auto added authors and since
    • don't disconnect from relays specified in 10002 of the allowed npubs, keep reading from them?
  • NIP-11
    • custom relay info
    • make it work behind reverse proxy
  • custom http page or a redirect
  • improve RAM usage
    • run memory profiler
    • disconnect from relays?
      • that previousely 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
  • socks5/http proxy for all connections
  • remove spam.nostr.band?
  • login to NIP-42 relays?
    • does it make sense transmitting someone else's events from a generated nsec?

Support

I'm currently investing all my time in FOSS projects.

If you found this repo useful and you want to support me, please

  • ⭐ star
  • zap
  • 🌚 something else

Your support keeps me going ❤️ (◕‿◕)

License

MIT/Apache-2.0