Community

Apps

Nostr Relay Tray

Nostr Relay Tray turns relay hosting into a desktop surface: start a local Nostr relay, store events in SQLite, filter what gets accepted, inspect event counts, export JSONL data and, when you choose, expose the relay through a public proxy.

Nostr Relay Tray icon
Apps The product layer Clients, signers, publishing tools, wallets and protocol utilities.
Back to Nostr
Apps

Apps shelf

Apps pages collect clients, signers, tools, developer libraries and product research without turning the app into the whole network.

Apps All Apps pages App routeProduct profiles, categories, tools and source links Browse appsClose shelf

App orientation

App categories

App profiles

0xchatadvanced-nostr-searchAegisAlbyAlby GoAlby HubAlby HubAlby SDKAmberAmberAmethystAmethystApp and product researchApplication-specific dataBlossomBlossom spec NIP-B7BookstrBorisBouquetCalendar by FormstrChachiNostr Apps DirectoryCoracleCoracleCorny ChatCreatrDamusDamusDeveloper stack researchDittoDittodiVineDocstrDTANEmojitoFlotillaFlycatFormstrFountainFreeFromFundstrfutrGIF BuddyGittrgo-nostrGossipGossipGrimoireGroups NIP-29HablaHablaHello Nostr — ResourcesHighlighterHiveTalkhomebrew-nostrHORNET StorageHugo2NostrHyperNoteIrisIrisJumblekanbanstrKeys BandListrLNBits NostrmarketLumeLumilumiLUMINAMapstrMarmot Protocolmatrix-nostr-bridgeMeetstrMemestrMindsmonstrmostardMostronaknak — Nostr Army KnifeNalgorithmNarrnashboardNDKNegentropyngitNofluxNosNos Socialnos2xnosbinnosclNostorg Feature MatrixNostr App ManagerNostr Apps Directory GuideNostr clients feature listNostr Compass — ProjectsNostr Developer GuideNostr Development KitNostr Events MonitorNostr MCP ServerNostr NestsNostr PlaygroundNostr Service ProvidersNostr Writernostr-post-checkernostr-protocol/nostrnostr-rubynostr-sdknostr-sdk-ffinostr-sdk-flutternostr-to-rssnostr-toolsNostr.bandnostr.buildnostr.co.uk ClientsNostr.how — Clientsnostr.hsNostrabilityNostrAppsNostrApps category — AudioNostrApps category — CareerNostrApps category — CommunityNostrApps category — CurationNostrApps category — Direct MessageNostrApps category — DiscoveryNostrApps category — File SharingNostrApps category — Group ChatNostrApps category — MeatspaceNostrApps category — OnboardingNostrApps category — SignersNostrApps category — Toolsnostrchecknostrdbnostrdb-rsNostreeNostreonNostriaNostridNostrium / read.nostr.comNostrmoNostrubenoStrudelnoStrudelNostterNosturNosturNotedeckNpub.proNpub.worldnsec.appnsiteNsiteNstart.meObsidian Nostr WriterOlasOpenvibeOracoloOstrich WorkOwn Your PostsP2P BandPazPeridotPhoenixPlebeian MarketPostizPostr / write.nostr.comPrimalPrimalPrimal Article Editor / Reads authoringPrimal Studiopynostrpython-nostrRecommended Application HandlersRelay Toolsrsslayrust-nostrrust-nostr docsSatelliteSatellite EarthSatlantisSatShootShakespeareShopstrSlidestrSnortSnortStemstrswift-nostr-clientTreasuresWavlakeWavlakeWikifreediaWikistrYakiHonneYakiHonneYakiHonne mobile/web app directoryYondar

App pages

Deep dives

Field guides

Awesome Nostr branches

Research and library

Source inventory

Deep Research: Clients, apps and product surfacesDeep Research: Developer stack and toolingResearch Map: nostrapps.comResearch Source: 0xchatResearch Source: 0xchat — NostrApps pageResearch Source: advanced-nostr-searchResearch Source: Aegis — NostrApps pageResearch Source: AlbyResearch Source: Alby — NostrApps pageResearch Source: Alby GoResearch Source: Alby HubResearch Source: Alby Hub GitHubResearch Source: Alby SDKResearch Source: AmberResearch Source: Amber — NostrApps pageResearch Source: AmethystResearch Source: Amethyst GitHubResearch Source: Awesome Nostr ResourcesResearch Source: BookstrResearch Source: BorisResearch Source: Boris — NostrApps pageResearch Source: BouquetResearch Source: Bouquet — NostrApps pageResearch Source: Calendar by FormstrResearch Source: ChachiResearch Source: Chachi — NostrApps pageResearch Source: CoracleResearch Source: Coracle — NostrApps pageResearch Source: Corny ChatResearch Source: DamusResearch Source: Damus — NostrApps pageResearch Source: DittoResearch Source: Ditto — NostrApps pageResearch Source: DocstrResearch Source: DTANResearch Source: DTAN — NostrApps pageResearch Source: EmojitoResearch Source: Emojito — NostrApps pageResearch Source: Flotilla — NostrApps pageResearch Source: FlycatResearch Source: FormstrResearch Source: Formstr — NostrApps pageResearch Source: FountainResearch Source: FreeFromResearch Source: FreeFrom — NostrApps pageResearch Source: FundstrResearch Source: futrResearch Source: futr — NostrApps pageResearch Source: GIF BuddyResearch Source: GIF Buddy — NostrApps pageResearch Source: GittrResearch Source: go-nostr GitHubResearch Source: GossipResearch Source: Gossip — NostrApps pageResearch Source: GrimoireResearch Source: Grimoire — NostrApps pageResearch Source: HablaResearch Source: Habla — NostrApps pageResearch Source: Hello Nostr — ResourcesResearch Source: HighlighterResearch Source: HiveTalkResearch Source: HORNET Storage — NostrCompassResearch Source: IrisResearch Source: Iris — NostrApps pageResearch Source: JumbleResearch Source: Jumble — NostrApps pageResearch Source: Keys BandResearch Source: Keys Band — NostrApps pageResearch Source: ListrResearch Source: LNBits NostrmarketResearch Source: LumeResearch Source: LumilumiResearch Source: LUMINAResearch Source: MapstrResearch Source: Marmot ProtocolResearch Source: MeetstrResearch Source: MemestrResearch Source: MindsResearch Source: monstr GitHubResearch Source: mostardResearch Source: MostroResearch Source: my.nostr.comResearch Source: nak — Nostr Army KnifeResearch Source: nak GitHubResearch Source: NalgorithmResearch Source: Narr — NostrApps pageResearch Source: nashboardResearch Source: NDK GitHubResearch Source: NDK NPMResearch Source: NegentropyResearch Source: Noflux — NostrApps pageResearch Source: Nos SocialResearch Source: Nos Social — NostrApps pageResearch Source: nos2xResearch Source: nos2x — NostrApps pageResearch Source: nosbinResearch Source: noscl GitHubResearch Source: Nostorg Feature MatrixResearch Source: Nostr App ManagerResearch Source: Nostr Book — KindsResearch Source: Nostr DesignResearch Source: Nostr Developer GuideResearch Source: Nostr NestsResearch Source: Nostr Nests — NostrApps pageResearch Source: Nostr PlaygroundResearch Source: nostr-post-checkerResearch Source: nostr-protocol/nostr GitHubResearch Source: nostr-sdk crates.ioResearch Source: nostr-sdk-ffi GitHubResearch Source: nostr-tools GitHubResearch Source: nostr-tools NPMResearch Source: Nostr.BandResearch Source: nostr.buildResearch Source: nostr.co.uk ClientsResearch Source: Nostr.howResearch Source: Nostr.how — ClientsResearch Source: Nostr.how — ProtocolResearch Source: Nostr.how — What is Nostr?Research Source: Nostr.orgResearch Source: NostrabilityResearch Source: NostrAppsResearch Source: NostrApps category — AudioResearch Source: NostrApps category — CareerResearch Source: NostrApps category — CommunityResearch Source: NostrApps category — CurationResearch Source: NostrApps category — Direct MessageResearch Source: NostrApps category — DiscoveryResearch Source: NostrApps category — File SharingResearch Source: NostrApps category — Group ChatResearch Source: NostrApps category — MeatspaceResearch Source: NostrApps category — OnboardingResearch Source: NostrApps category — SignersResearch Source: NostrApps category — ToolsResearch Source: nostrcheckResearch Source: nostrdb GitHubResearch Source: NostreeResearch Source: Nostree — NostrApps pageResearch Source: NostriaResearch Source: Nostria — NostrApps pageResearch Source: NostridResearch Source: Nostrmo — NostrApps pageResearch Source: Nostrmo GitHubResearch Source: NostrubeResearch Source: noStrudelResearch Source: noStrudel — NostrApps pageResearch Source: NostterResearch Source: NosturResearch Source: Nostur — NostrApps pageResearch Source: NotedeckResearch Source: Npub.proResearch Source: Npub.worldResearch Source: nsec.appResearch Source: NsiteResearch Source: Nstart.meResearch Source: Nstart.me — NostrApps pageResearch Source: Obsidian Nostr Writer — NostrApps pageResearch Source: OlasResearch Source: Olas — NostrApps pageResearch Source: OpenvibeResearch Source: OracoloResearch Source: Oracolo — NostrApps pageResearch Source: Ostrich WorkResearch Source: P2P BandResearch Source: PazResearch Source: PeridotResearch Source: Peridot — NostrApps pageResearch Source: PhoenixResearch Source: Phoenix — NostrApps pageResearch Source: Plebeian MarketResearch Source: Plebeian Market — NostrApps pageResearch Source: PrimalResearch Source: Primal — NostrApps pageResearch Source: Primal Article Editor / Reads authoringResearch Source: Primal StudioResearch Source: pynostr GitHubResearch Source: python-nostr GitHubResearch Source: Registry of KindsResearch Source: Relay Tools — NostrApps pageResearch Source: rsslayResearch Source: rust-nostr docsResearch Source: rust-nostr GitHubResearch Source: SatelliteResearch Source: SatShootResearch Source: ShakespeareResearch Source: Shakespeare — NostrApps pageResearch Source: ShopstrResearch Source: Shopstr — NostrApps pageResearch Source: SlidestrResearch Source: SnortResearch Source: start.nostr.netResearch Source: StemstrResearch Source: TreasuresResearch Source: WavlakeResearch Source: WikifreediaResearch Source: Wikifreedia — NostrApps pageResearch Source: WikistrResearch Source: Wikistr — NostrApps pageResearch Source: YakiHonne mobile/web app directoryResearch Source: YondarResearch Source: Yondar — NostrApps page
Apps16 min readdesktop relay with SQLite, rules, WoT, PoW and proxy access

Nostr Relay Tray

Nostr Relay Tray turns relay hosting into a desktop surface: start a local Nostr relay, store events in SQLite, filter what gets accepted, inspect event counts, export JSONL data and, when you choose, expose the relay through a public proxy.

The quick readNostr Relay Tray is CodyTseng's MIT-licensed Electron app for people who want to run a Nostr relay from a desktop machine instead of treating relays as distant server folklore. It listens locally, stores events in SQLite, gives you event rules, Web of Trust and Proof of Work filters, and can publish a public address through a proxy when you deliberately turn that on.

A relay you can touch

Nostr Relay Tray is one of those apps that looks small until you remember what it is making visible. Most Nostr users talk about relays as if they are weather: sometimes helpful, sometimes unavailable, mostly outside your control. This project moves the relay onto your own desktop. You install an app, it sits in the system tray, and underneath that tray icon is a real Nostr relay rather than a bookmark to somebody else's infrastructure.

The project is maintained by CodyTseng on GitHub. The repository was created on January 27, 2024, is written primarily in TypeScript, is MIT-licensed, and describes itself as a Nostr relay for desktop across macOS, Windows and Linux. The latest release available from GitHub is v2.0.0, published on March 23, 2025, with downloadable builds for Apple Silicon and Intel macOS, Windows setup, Linux AppImage, Debian package and Snap. The README is upfront about one practical wrinkle: the app is unsigned, so users may need to approve it manually in system settings. On Apple Silicon, the README even gives the quarantine-removal command for the damaged-app warning.

That is not a minor packaging note. A relay is infrastructure, and infrastructure lives or dies by boring operational trust. Nostr Relay Tray lowers the barrier to starting a relay, but it still asks you to run software on your machine, open ports or use a proxy, store data, decide what gets accepted and deal with whatever arrives. The value is not that it removes responsibility. The value is that it gives a normal user a visible place to practice that responsibility.

NostrApps summarizes the product as a system tray application for managing Nostr relays, and that is accurate. But the more interesting description is this: Nostr Relay Tray turns the relay from an invisible backend into a thing you can configure, inspect and stop. If you have only used Nostr through clients, this is a useful shift. It reminds you that a relay is not an ideology. It is a server that accepts, stores and serves signed events according to rules.

What runs under the tray icon

The app is built with Electron, Electron Vite, React, TypeScript, Tailwind-flavored UI components and Electron Builder. The relay side uses Fastify, a WebSocket server, @nostr-relay/core, @nostr-relay/common, @nostr-relay/validator, @nostr-relay/event-repository-sqlite, better-sqlite3, kysely, nostr-tools and ws. In other words, this is not a skin over a hosted service. It is a desktop shell around a local relay stack.

The relay service creates a SQLite database named nostr.db in Electron's user data path and wraps it with EventRepositorySqlite. It initializes the repository, starts a Fastify server, attaches a WebSocket server, validates incoming Nostr messages, hands valid messages to NostrRelay, and sends a Nostr NOTICE when validation fails. It listens on 0.0.0.0:4869, which means it is not just a loopback-only toy. On your local network, that detail matters. You should know whether your machine is reachable, what firewall rules apply and whether you meant to expose it.

The HTTP root endpoint returns relay information: name nostr-relay-tray, description a nostr relay for desktop, software URL pointing back to the GitHub repo, the app version and supported_nips containing NIP-01 and NIP-50. NIP-01 is the basic relay/client protocol. NIP-50 is search. That lines up with the README's full-text search claim and the source that initializes a search index by walking stored events and inserting them into search.

The settings are concrete rather than ornamental. You can set the maximum WebSocket payload in kilobytes, set the default filter limit, choose tray icon color, change appearance and enable start-at-login through the auto-launch package. The home screen shows total event count and event statistics by kind. That is the correct level of honesty for a local relay: not just "running" or "not running", but what kind of data it has accumulated.

The filtering is the product

A relay without a policy is just an open bucket. Nostr Relay Tray's most important feature is therefore not the tray icon. It is the event filtering system. The README explains a two-layer mechanism: first, block rules get a chance to reject matching events immediately. If an event is not blocked, it moves into the second layer, where allow rules, Web of Trust and Proof of Work can accept it. That order is easy to miss, but it changes how you should think about the app. A block rule is a hard stop. The second layer is a set of independent ways to decide what you are willing to store.

The code matches that description. GuardService runs a block guard first. If the event survives, and no other guards are active, it can be accepted. If guards are active, their results are checked. Allow rules are converted into filters. Block rules are converted into filters. The restriction guard can match event kind, author, tags and content, including negative forms of those fields. The rule editor exposes the same idea to the user: create a named rule, choose Block or Allow, add conditions for author, kind, tag or content, and enable it.

This matters because relay policy is where Nostr gets real. It is easy to say "censorship resistant" until you run a relay and discover spam, illegal content risk, storage growth, low-quality floods, repeated event kinds you do not care about, and the tension between openness and usefulness. Nostr Relay Tray gives a non-server-admin a way to build a policy without writing a custom relay from scratch. You can block known garbage, allow a narrow community, accept only certain event kinds or combine local rules with social trust.

Web of Trust and Proof of Work add two different philosophies. The WoT screen asks for a trust anchor in npub1... format, supports trust depth, refresh interval, immediate refresh, trusted pubkey count and checking whether a pubkey is in the trust set. The code uses @nostr-relay/wot-guard with default seed relays such as wss://relay.damus.io, wss://relay.nostr.band and wss://nos.lol. PoW uses @nostr-relay/pow-guard and a configurable minimum difficulty. WoT says "I trust a social neighborhood." PoW says "I accept events that paid a small computational cost." Neither is magic. Both are useful knobs.

Public access is a serious switch

The README advertises instant public access, and the source shows how that works. The proxy connector talks to wss://proxy.nostr-relay.app/register. When you connect, the app generates or loads a private key for proxy authentication, signs an auth event with nostr-tools, sends relay information as the event content, and receives a public address if the proxy accepts the registration. The renderer then shows connection status, lets you connect or disconnect, and gives you a copyable public address.

That is a powerful idea. It means a desktop relay can be reachable without asking every user to understand NAT, TLS, reverse proxies and router configuration on the first day. For experimentation, workshops, small communities and people who simply want to feel how relay hosting works, this is exactly the kind of product move that makes the protocol less abstract.

It is also where you should slow down. The proxy key is generated by the app and stored in the app config; the source includes a comment saying it may need encryption. That key is not your personal Nostr posting key, but it is still a local secret used for proxy registration. More importantly, public access changes the threat model. A local relay used by your own clients is one thing. A public relay can receive traffic from strangers, fill storage, trigger moderation questions and expose your machine to operational mistakes.

So read the proxy switch as a real switch, not a toy. Turn it on when you know why you want a public address. Keep it off when you only need a local cache, a workshop demo or a private test relay. Nostr Relay Tray makes public access easy enough to try, but it cannot decide your policy, your risk tolerance or your data retention plan for you.

Data work, not just server work

The data section is one of the best signs that Nostr Relay Tray understands what a relay actually is. It includes export events, import events, delete events by filter and clear all events. The main service implements export as JSONL and import by reading JSONL line by line, validating each event and upserting it into the repository. That is unglamorous, and it is exactly what you want when the app is storing protocol data on your desktop.

Why does that matter? Because a personal relay is only useful if you can reason about what it remembers. You may want to back up events. You may want to move a dataset. You may want to clear the relay after a test. You may want to delete all events matching a filter instead of wiping everything. A good relay tool gives you those data-handling paths without forcing you into direct SQLite surgery.

The event statistics by kind also help. A relay full of text notes behaves differently from a relay full of metadata, reactions, relay lists or long-form events. If you are using the app as a personal archive, statistics show what kind of archive you are actually building. If you are using it as a community relay, the same counts can reveal whether the relay is drifting away from the community's purpose.

This is where Nostr Relay Tray earns its place next to more visible clients. Clients show you what Nostr feels like. Relay tools show you what Nostr costs. Disk space, filters, search indexes, payload limits, event limits, data export, validation and abuse handling are not glamorous, but they are the difference between a slogan and a working network.

How I would run it

Start locally. Install the release for your platform, read the unsigned-app warning, and launch it without turning on public proxy access. Point a Nostr client at ws://localhost:4869 or the reachable local-network address if that is what you intend. Publish a few harmless events, query them back and watch the event count change. Then open the root HTTP endpoint and confirm the relay info. You are not trying to win uptime awards yet. You are trying to understand the surface.

Next, make one rule that is easy to verify. For example, allow only a narrow event kind, block a content pattern or limit writes to a known author. Do not begin with a complicated ideology of moderation. Begin with one rule and prove that it behaves the way you think. Then test WoT separately. Give it a trust anchor, refresh the trusted set, and check a pubkey. Then test PoW separately by setting a minimum difficulty and seeing whether clients can still publish. Each control should teach you something observable.

After that, test the data tools. Export a small event set to JSONL, clear the relay, import it again and confirm the count returns. If delete-by-filter is part of your intended workflow, test it on a disposable dataset before you trust it on a real archive. Relay maintenance is not heroic. It is mostly remembering that data you cannot restore is data you do not really control.

Only then try the public proxy. Treat the returned public address as a public service, even if the project makes it feel casual. Watch whether strangers can write, whether your rules are strict enough, whether storage grows, and whether your machine and network can tolerate the traffic. Nostr Relay Tray is a generous tool because it lets a normal person touch relay operation. That generosity works best when you bring grown-up habits to the tray icon.

Sources worth opening

This article keeps claims close to the public project trail, release page and source code. Start here when you want to verify how the desktop relay actually works.

Back to the Crays Nostr page
Apps route visual cue 1
Apps route visual cue 2
Apps route visual cue 3
Apps route visual cue 4
Apps route visual cue 5

How to use this page

Find the product surface first.

Search clients, signers, product categories or developer tools when you need a specific app, source file or comparison clue.

AppsKeep exploring AppsApp routeProduct profiles, categories, signer guides and source links.Browse apps
Apps route visual cue 1
Apps route visual cue 2
Apps route visual cue 3
Apps route visual cue 4
Apps route visual cue 5

Bring something back

Ask, suggest, submit or nominate.

Use these links when something is missing, a source is stale, or a public Nostr builder belongs in the map.