1. Go to this page and download the library: Download innis/nostr-relay library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
innis / nostr-relay example snippets
use Innis\Nostr\Core\Domain\ValueObject\Protocol\Nip11Info;
use Innis\Nostr\Core\Infrastructure\Crypto\NativeRandomBytesGenerator;
use Innis\Nostr\Relay\Application\Service\InMemoryAuthenticationRegistry;
use Innis\Nostr\Relay\Application\Service\RelayPolicy;
use Innis\Nostr\Relay\Domain\ValueObject\RateLimitConfig;
use Innis\Nostr\Relay\Domain\ValueObject\RelayPolicyConfig;
use Innis\Nostr\Relay\Infrastructure\EventStore\InMemoryEventStore;
use Innis\Nostr\Relay\Infrastructure\Http\StaticNip11InfoProvider;
use Innis\Nostr\Relay\Infrastructure\RateLimiting\StaticRateLimitPolicy;
use Innis\Nostr\Relay\Infrastructure\Server\RelayServerFactory;
use function Amp\trapSignal;
$authenticationRegistry = new InMemoryAuthenticationRegistry(new NativeRandomBytesGenerator());
$logger = new \Psr\Log\NullLogger();
$policyConfig = RelayPolicyConfig::tryFromArray([
'tenants' => ['your-hex-pubkey'],
'guest' => [
'read' => [
['kinds' => [0, 1, 6, 7, 30023], 'from' => 'tenants'],
],
'write' => [
['kinds' => [7, 9735]],
],
],
]) ?? throw new RuntimeException('Invalid relay policy configuration');
$policy = new RelayPolicy($authenticationRegistry, $logger, $policyConfig);
$rateLimitPolicy = new StaticRateLimitPolicy(new RateLimitConfig(
eventsPerMinute: 60,
subscriptionsPerMinute: 20,
));
$config = new MyRelayConfig();
$nip11InfoProvider = new StaticNip11InfoProvider(Nip11Info::fromArray($config->getRelayUrl(), [
'name' => 'My Nostr Relay',
'pubkey' => 'your-hex-pubkey',
'supported_nips' => [1, 9, 11, 40, 42, 45],
]));
$factory = new RelayServerFactory(
eventStore: new InMemoryEventStore(), // swap for a durable store in a deployment
policy: $policy,
config: $config,
rateLimitPolicy: $rateLimitPolicy,
authenticationRegistry: $authenticationRegistry,
logger: $logger,
nip11InfoProvider: $nip11InfoProvider,
);
use Amp\Http\Server\DefaultErrorHandler;
use Amp\Http\Server\SocketHttpServer;
use Amp\Socket\InternetAddress;
use function Amp\trapSignal;
$httpServer = SocketHttpServer::createForDirectAccess($logger);
$httpServer->expose(new InternetAddress('127.0.0.1', 8080));
$relay = $factory->create($httpServer);
$httpServer->start($relay->getRequestHandler(), new DefaultErrorHandler());
trapSignal([SIGINT, SIGTERM]); // start() is non-blocking; keep the event loop alive until interrupted
$httpServer->stop();
use Innis\Nostr\Relay\Domain\ValueObject\PolicyRejection;
public function allowEventSubmission(RelayClient $client, Event $event): ?PolicyRejection
{
if ($this->isSpam($event)) {
return PolicyRejection::blocked('event rejected by content filter');
}
if (!$this->isAuthenticated($client)) {
return PolicyRejection::authRequired('authentication