powered by nostr-relay
- Fully Featured – A complete Nostr relay with all essential functionalities.
- Zero-Config Start – Instantly launch your own relay.
- Granular Control – Precisely manage which events to accept or reject.
- Instant Public Access – Open your relay to the world with a single click.
- Full-Text Search – Quickly find events with powerful search capabilities.
- Cross-Platform – Available on macOS, Windows, and Linux.
Download the latest release from the Releases page.
Note: Since the app is unsigned, you may need to manually allow it to run in your system settings.
If you encounter the error: "nostr-relay-tray is damaged and can't be opened. You should move it to the Bin.", run the following command in your terminal:
sudo xattr -rd com.apple.quarantine /Applications/nostr-relay-tray.appThen, try launching the app again.
You can also compile the app from source.
Note: Node.js >= 20 is required.
# Clone this repository
git clone https://github.com/CodyTseng/nostr-relay-tray.git
# Go into the repository
cd nostr-relay-tray
# Install dependencies
npm install
# Build the app
npm run build:mac
# or npm run build:win
# or npm run build:linuxThe executable file will be in the dist folder.
Your events and settings are stored in two SQLite databases, nostr.db and app.db:
| Platform | Location |
|---|---|
| Linux | $XDG_DATA_HOME/nostr-relay-tray (usually ~/.local/share/nostr-relay-tray) |
| macOS | ~/Library/Application Support/nostr-relay-tray |
| Windows | %LOCALAPPDATA%\nostr-relay-tray |
You can find the exact path, and open it, under Settings → Data location.
Versions before 2.1 kept these files alongside the browser cache, in ~/.config/nostr-relay-tray
on Linux and in the roaming %APPDATA% on Windows. They are moved automatically the first time
you launch a newer version; the old folder is left behind with a DATA-MOVED.txt note and can be
deleted once you are happy everything came across. If the new location happens to be on a
different disk the move is skipped and the app keeps using the old folder, so nothing is ever
copied across filesystems at startup.
Caches, cookies and other regenerable browser state live separately, in
$XDG_CACHE_HOME/nostr-relay-tray (usually ~/.cache/nostr-relay-tray) on Linux.
Note:
npm run devuses a separatenostr-relay-tray-devdirectory and starts empty, so development never touches your real database.
nostr-relay-tray provides a flexible event filtering mechanism, allowing you to precisely control which events are accepted. The mechanism works in two layers:
Incoming Event
│
▼
┌───────────────┐
│ Block Rules │ ❌ If blocked, event is rejected.
└───────────────┘
│ (not blocked)
▼
┌─────────────────────────────────────────┐
│ Only one needs to pass │
├─────────────┬─────────────┬─────────────┤
│ Allow Rules │ WoT │ PoW │
└─────────────┴─────────────┴─────────────┘
│
▼
Event Accepted ✅
- If block rules exist, any matching event is immediately rejected.
- If no block rules are defined, this layer is skipped, and the event proceeds to the second layer.
This layer consists of three independent filters:
- Allow Rules: Accepts events that meet predefined conditions.
- Web of Trust (WoT): Accepts events from trusted users or relays.
- Proof of Work (PoW): Accepts events that meet a certain computational difficulty.
Filtering logic:
- If at least one filter is enabled, the event must pass at least one.
- If all filters are disabled, the event is automatically accepted.
If you like this project, you can buy me a coffee :)
lightning: ⚡️ [email protected] ⚡️
bitcoin: bc1qx8kvutghdhejx7vuvatmvw2ghypdungu0qm7ds
The ostrich element within the icon is sourced from nostr_icons. Special thanks to satscoffee for providing such a beautiful ostrich.
MIT



