/gnost-relay

nostr relay written in go

Primary LanguageGoGNU General Public License v3.0GPL-3.0

gnost-relay

Nostr relay written in go

Features

  • NIPs supported: 1, 9, 11, 12, 15, 16, 20, 26, 28, 33, 40, 42.
  • Websocket compression support (permessage-deflate), with support for client and server context takeover (i.e., sliding window support).
  • Hot config reloading. Edits to the config.json file will be instantly applied without requiring restart.
  • --import command line flag allows new events to be added via stdin. Events should be in jsonl format. Use in conjunction with gnost-deflate-client
  • Event handling logic happens via SQL triggers (i.e., NIPs 9, 16, 33, 40).
  • New events are notified to listeners via postgresql's built in pg_notify feature. This implies that different instances of gnost-relay can be run concurrently. Indeed, any software which writes to the DB will automatically notify listeners connected to the relay.
  • Memory allocations are minimized using pools.
  • Token bucket style rate limiters for handling the messages are enabled on each websocket connection.

Example usage

Running the relay

DATABASE_URL=postgres://x gnost-relay --config config.json

Importing events

With keepalive set, the connection will remain open, and new events will be added to the gnost-relay database, and notified to any listeners. See gnost-deflate-client for more info.

echo '[{"since":1676863922,"kinds":[1]}]' |\
gnost-deflate-client --port 443 --scheme wss --host nos.lol --keepalive 30 --output - |\
DATABASE_URL=postgres://x gnost-relay --import

Installation notes

  • Needs to have a postgresql database configured. The executable expects that the DATABASE_URL environment variable is set.
  • Should be run with a reverse proxy in front (e.g., NGINX).
  • See the instructions for more details.