Home

Awesome

Nostr Relay NestJS

Coverage Status FOSSA Status

Powered by nostr-relay & NestJS.

A high-performance nostr relay, using PostgreSQL.

If you'd like to help me test the reliability of this relay implementation, you can add wss://nostr-relay.app to your relay list (it's free) 💜⚡️

Note: Please use the released version of this code. The latest version may contain changes to migration scripts and other elements that are not finalized.

Deploy on Railway

Features

🟢 Full implemented 🟡 Partially implemented 🔴 Not implemented

FeatureStatusNote
NIP-01: Basic protocol flow description🟢
NIP-02: Follow List🟢
NIP-04: Encrypted Direct Message🟢
NIP-05: Mapping Nostr keys to DNS-based internet identifiers🟢
NIP-09: Event Deletion🔴No real deletion in a distributed system
NIP-11: Relay Information Document🟢
NIP-13: Proof of Work🟢
NIP-22: Event created_at Limits🟢
NIP-26: Delegated Event Signing🟢
NIP-28: Public Chat🟢
NIP-40: Expiration Timestamp🟢
NIP-42: Authentication of clients to relays🟢
NIP-45: Counting results🔴
NIP-50: Keywords filter🟢

Extra Features

WoT (Web of Trust)

If you want to enable the WoT feature, you need to set the following environment variables:

RESTful API

You can see the API documentation at /api endpoint. Example

TOP verb

TOP verb accepts a subscription id and filters as specified in NIP 01 for the verb REQ.

["TOP",<subscription_id>,<filters JSON>...]

And return the top N event IDs with the highest score (Scoring is determined by relay).

["TOP",<subscription_id>,<event id array>]

Example:

["TOP","test",{"search":"nostr bitcoin","kinds":[30023],"limit":10}]

["TOP","test",["2359f4bdfe0bd2353aa7702dc1af23279197694823b8b4916b904a9940334192","622a875c9f9a4696eb4050fa5b0bba3a9b0531ec4a27398245af7369e6d40da8","d8989c65d26511b2e3ea42b0ebfcaf0ea885cb958419df4ddb334cb72556f950","ffcb0c9e0ace0b5d3928f30395bc9832763f8b583f2b1beb696f7c199f9f94d2","287147867bd00299553fa91e110d40206eea19a9142a4283832ee67e1407e6f2","ffaea8bc3b08db32af97f1ff595e68eee8a2f7b0a4a66dc2eff330f450855f6c","cddbc6cd4a0589d4a593e99a3a94426c85c6867b47d7eb751ce419c27f079b76","f2291ac6d206e898965b9e4ba6bbe5bb10118e6a74bd9f9f13597813979a254b","a101a2a44938dbb0a611bc00bd7ed4cb44d682fea4c14618bd1148567cd6fcc3","21990a723b491b6c594438a2ecf5d5e4898212635f59e82f1c736d994a86e907"]]

Quick Start

Dockerfile

Build image

./scripts/build.sh

Create .env file based on example.env file

DATABASE_URL=postgresql://username:password@host:port/database

Run container

./scripts/run.sh

Local Development

First of all, you need to have a PostgreSQL database running.

Clone the repository and install dependencies

git clone https://github.com/CodyTseng/nostr-relay-nestjs.git
cd nostr-relay-nestjs
npm install

Create .env file based on example.env file

DATABASE_URL=postgresql://username:password@host:port/database

Execute migration scripts

npm run migration:run

Start the server

npm run start

Metrics

You can view some simple relay metrics on /metrics endpoint.

<img alt="Metrics snapshot" src="https://github.com/CodyTseng/resources/raw/master/nostr-relay-nestjs/img/metrics-snapshot.png" width="520">

TODO

Architecture

<picture> <source media="(prefers-color-scheme: dark)" srcset="https://github.com/CodyTseng/resources/raw/master/nostr-relay-nestjs/img/structure-dark.png"> <source media="(prefers-color-scheme: light)" srcset="https://github.com/CodyTseng/resources/raw/master/nostr-relay-nestjs/img/structure-light.png"> <img alt="Architecture Diagram" src="https://github.com/CodyTseng/resources/raw/master/nostr-relay-nestjs/img/structure-light.png" height="600"> </picture>

Donate

If you like this project, you can buy me a coffee :) ⚡️ codytseng@getalby.com ⚡️

License

This project is MIT licensed.

FOSSA Status