'handleNostrLoggedIn', 'nostrLoggedOut' => 'handleNostrLoggedOut', ]; public function mount(): void { if (NostrAuth::check()) { $this->currentPubkey = NostrAuth::pubkey(); $this->currentPleb = EinundzwanzigPleb::query() ->with([ 'paymentEvents' => fn ($query) => $query->where('year', date('Y')), 'profile', ]) ->where('pubkey', $this->currentPubkey)->first(); if ($this->currentPleb) { if ($this->currentPleb->nip05_handle) { $this->nip05Handle = $this->currentPleb->nip05_handle; // Get all NIP-05 handles for current pubkey $this->nip05VerifiedHandles = $this->getNip05HandlesForPubkey($this->currentPubkey); if (count($this->nip05VerifiedHandles) > 0) { $this->nip05Verified = true; $this->nip05VerifiedHandle = $this->nip05VerifiedHandles[0]; // Check if verified handle differs from database handle if (! in_array($this->nip05Handle, $this->nip05VerifiedHandles, true)) { $this->nip05HandleMismatch = true; } } } // Check if current year is paid $paymentEvent = $this->currentPleb->paymentEvents->first(); if ($paymentEvent && $paymentEvent->paid) { $this->currentYearIsPaid = true; } } } } public function updatedNip05Handle(): void { $this->nip05Handle = strtolower($this->nip05Handle); } public function saveNip05Handle(): void { $this->validate([ 'nip05Handle' => 'required|string|max:255|regex:/^[a-z0-9_-]+$/|unique:einundzwanzig_plebs,nip05_handle', ]); $nip05Handle = strtolower($this->nip05Handle); $this->currentPleb->update([ 'nip05_handle' => $nip05Handle, ]); Flux::toast('NIP-05 Handle gespeichert.'); } public function copyRelayUrl(): void { $relayUrl = 'wss://nostr.einundzwanzig.space'; $this->js("navigator.clipboard.writeText('{$relayUrl}')"); Flux::toast('Relay-Adresse in die Zwischenablage kopiert!'); } public function copyWatchtowerUrl(): void { $watchtowerUrl = '03a09f56bba3d2c200cc55eda2f1f069564a97c1fb74345e1560e2868a8ab3d7d0@62.171.139.240:9911'; $this->js("navigator.clipboard.writeText('{$watchtowerUrl}')"); Flux::toast('Watchtower-Adresse in die Zwischenablage kopiert!'); } public function copyBlossomUrl(): void { $blossomUrl = 'https://blossom.einundzwanzig.space'; $this->js("navigator.clipboard.writeText('{$blossomUrl}')"); Flux::toast('Blossom-Adresse in die Zwischenablage kopiert!'); } public function handleNostrLoggedIn($signedEvent = null): void { NostrAuth::loginWithSignedEvent($signedEvent); $this->mount(); } public function handleNostrLoggedOut(): void { $this->currentPleb = null; $this->currentPubkey = null; $this->currentYearIsPaid = false; $this->nip05Handle = ''; $this->nip05Verified = false; $this->nip05VerifiedHandle = null; $this->nip05HandleMismatch = false; $this->nip05VerifiedHandles = []; } } ?>
@php($isActiveMember = $currentPleb && $currentPleb->association_status->value > 1 && $currentYearIsPaid)

Vorteile deiner Mitgliedschaft

Diese Dienste betreiben wir exklusiv für aktive Vereinsmitglieder. Klicke bei jedem Dienst auf „Anleitung anzeigen", um die Einrichtung Schritt für Schritt zu sehen.

@if($isActiveMember) Mitgliedschaft aktiv Alle vier Dienste unten sind für dich freigeschaltet. @else Dienste gesperrt Aktiviere deine Mitgliedschaft, um Relay, NIP-05, Watchtower und den Blossom-Medienserver zu nutzen. Mitgliedschaft aktivieren @endif

Nostr Relay

@if($isActiveMember) Aktiv @else Mitglieder @endif

Exklusive Schreib-Rechte auf dem Premium Outbox-Relay von Einundzwanzig.

@if($isActiveMember)
wss://nostr.einundzwanzig.space

Ein Outbox-Relay ist wie ein Postbote für deine Nostr-Nachrichten: Es speichert und verteilt deine Posts.

Gehe in deinem Nostr-Client zu den Einstellungen (meist „Settings" oder „Relays") und füge die Adresse oben als Outbox-Relay hinzu.

Tipp: Du kannst auf mehreren Relays gleichzeitig veröffentlichen – so sind deine Inhalte auch über unser Relay erreichbar.

@endif

NIP-05 Verifizierung

@if($isActiveMember) Aktiv @else Mitglieder @endif

Verifiziere deine Identität mit einem menschenlesbaren Nostr-Namen.

@if($isActiveMember)
Dein NIP-05 Handle @einundzwanzig.space Speichern @if($nip05Verified) Du hast {{ count($nip05VerifiedHandles) }} aktive Handles für deinen Pubkey. @if($nip05HandleMismatch) Die Synchronisation zu {{ $nip05Handle }}@einundzwanzig.space läuft automatisch im Hintergrund. @endif

Deine aktivierten Handles:

    @foreach($nip05VerifiedHandles as $handle)
  • {{ $handle }}@einundzwanzig.space OK
  • @endforeach
@elseif($nip05Handle) Dein Handle {{ $nip05Handle }}@einundzwanzig.space ist gespeichert, aber noch nicht aktiv. Der Vorstand schaltet es bald frei. @endif

NIP-05 funktioniert wie eine E-Mail-Adresse (z.B. name@einundzwanzig.space) und zeigt in Clients ein Häkchen – das macht dein Profil vertrauenswürdiger und leichter teilbar.

Regeln für dein Handle: Nur Kleinbuchstaben (a–z), Zahlen (0–9) sowie „-" und „_". Großbuchstaben werden automatisch kleingeschrieben.

@endif

Lightning Watchtower

@if($isActiveMember) Aktiv @else Mitglieder @endif

Schütze deine Lightning Channel – auch wenn deine Node offline ist.

@if($isActiveMember)
03a09f56bba3d2c200cc55eda2f1f069564a97c1fb74345e1560e2868a8ab3d7d0@62.171.139.240:9911

Ein Watchtower überwacht deine Channel und springt ein, falls deine Node offline ist – so verhinderst du den Verlust deiner Sats bei unfairen Channel-Schließungen.

Füge die URI oben in deiner Lightning-Node-Konfiguration hinzu:

  • LND: Doku
  • Core Lightning: watchtower-client-Plugin mit der URI
  • Eclair: URI in der eclair.conf ergänzen

Wichtig: Der Watchtower überwacht passiv. Er hat keinen Zugriff auf deine privaten Schlüssel oder dein Guthaben.

@endif

Blossom Medienserver

NEU @if($isActiveMember) Aktiv @else Mitglieder @endif

Dein eigener Speicher für Bilder & Videos auf Nostr – betrieben vom Verein.

@if($isActiveMember)
https://blossom.einundzwanzig.space

Wenn du auf Nostr ein Bild oder Video postest, muss diese Datei irgendwo gespeichert werden. Bisher landet sie oft auf fremden Gratis-Servern, die jederzeit verschwinden können. Mit unserem Blossom-Server liegen deine Medien stattdessen sicher auf einem Server des Vereins – schnell, zuverlässig und nur für Mitglieder.

So nutzt du ihn:

  1. Öffne deinen Nostr-Client (z.B. Amethyst, Primal, nostrudel, Nostur).
  2. Gehe zu den Einstellungen → „Medienserver" (manchmal „Media Servers", „File Storage" oder „Blossom").
  3. Füge die Adresse oben hinzu und setze sie als Standard.
  4. Fertig! Deine hochgeladenen Bilder & Videos landen ab jetzt auf dem Vereinsserver.

Sicher: Die Anmeldung passiert automatisch über deinen Nostr-Schlüssel – nur Vereinsmitglieder können hochladen, und deine privaten Schlüssel verlassen niemals dein Gerät.

@endif