Curator is a minimal Nostr client focused on browsing, inspecting, and curating Nostr events by kind and relay. It is built with React, Vite, TailwindCSS, shadcn/ui, and Nostrify, and provides a clean starting point for experimenting with Nostr relays, kinds, and client-side curation logic.
This repository is a concrete application, not a generic framework. It ships with a ready-to-run Nostr client UI and opinionated defaults for relays and configuration.
-
Relay selection
RelaySelectorcomponent with a configurable list of popular relays- Support for custom relay URLs with basic validation and normalization
- Persists relay choices via
AppContextand local storage
-
Nostr client plumbing
useNostranduseNostrPublishhooks wired to@nostrify/react- Automatic
clienttag injection using the deployed hostname - Configurable publish mode (current relay vs all write relays)
-
Authentication and identity
- Nostr login via
@nostrify/react/login useCurrentUserand related hooks for working with the logged-in user
- Nostr login via
-
App shell and layout
- React Router–based routing in
AppRouter - Dark/light/system theme support via
AppContextand Tailwind - shadcn/ui components for buttons, popovers, commands, tooltips, etc.
- React Router–based routing in
-
Optional AI helpers
useShakespearehook and patterns indocs/AI_CHAT.mdfor AI chat- Designed for AI-assisted features, but not required to run the app
As you extend Curator, you can add pages and components that focus on specific Nostr kinds (e.g. metadata, notes, relays, classifieds) and use the existing hooks/contexts to query and display them.
- React 18.x – modern React with hooks and Suspense
- Vite – fast dev server and build tool
- TypeScript – type-safe frontend development
- TailwindCSS 3.x – utility-first styling
- shadcn/ui – accessible UI primitives built on Radix UI
- Nostrify – Nostr protocol integration via
@nostrify/react - React Router – client-side routing
- TanStack Query – data fetching, caching, and subscriptions
npm installCopy the example env file and adjust as needed:
cp .env.example .envKey variable:
VITE_POPULAR_RELAYS– JSON array of popular relays used by theRelaySelectorcomponent. Example (see.env.example):
VITE_POPULAR_RELAYS='[
{ "name": "Swarm Hivetalk", "url": "wss://swarm.hivetalk.org" },
{ "name": "Beeswax Hivetalk", "url": "wss://beeswax.hivetalk.org" }
]'If VITE_POPULAR_RELAYS is not set or is invalid, Curator falls back to a built-in default list.
npm run devThen open the printed URL in your browser.
-
App.tsx- Wires up all top-level providers:
QueryClientProvider,NostrProvider,NostrLoginProvider,AppProvider,NWCProvider,UnheadProvider, and UI providers likeTooltipProviderandToaster. - Defines default relay metadata (NIP-65–style list) and theme.
- Wires up all top-level providers:
-
AppRouter.tsx- Defines the page routes for Curator.
- Extend this file when adding new pages for browsing specific kinds.
-
Contexts (
src/contexts/)AppContext– global app configuration (theme, relay metadata, publish mode).NWCContext– Nostr Wallet Connect context for Lightning wallets.
-
Hooks (
src/hooks/)useNostr– low-level Nostr querying and subscriptions.useNostrPublish– publishing events with automaticclienttagging.useCurrentUser/useAuthor– identity and profiles.useLocalStorage– persisted configuration.useZaps,useWallet,useNWC,useShakespeare– optional advanced features.
-
Components (
src/components/)RelaySelector– dropdown + command palette for choosing relays.NostrProvider/NostrSync– wrap the app with Nostr connections and sync logic.auth/,dm/, and other folders – building blocks for authentication, messaging, and more.
For more detailed patterns (e.g. AI chat, comments, infinite scroll, DMs), see the docs in docs/.
The project includes a basic testing setup:
- Vitest with
jsdomenvironment - React Testing Library +
jest-dom TestApphelper to mount components with all required providers
Run tests with:
npm testCurator is a standard React/Vite application and can be deployed to any modern static hosting provider (e.g. Vercel, Netlify, Cloudflare Pages, static S3/CloudFront).
Typical Vite deployment steps:
npm run buildThen configure your host to serve the dist/ directory as a static site.
Make sure to configure your production environment variables (such as VITE_POPULAR_RELAYS) in your hosting provider's dashboard.
Curator was originally scaffolded from the MKStack starter but is now its own focused application.
- Source code: https://github.com/bitkarrot/curator
Open source – build, fork, and extend Curator to explore and curate the Nostr ecosystem.