A configurable Bitcoin community website built on Nostr, powered by React and TailwindCSS. Create beautiful, decentralized community sites that individual Bitcoin groups can customize and deploy.
- NIP-52 Calendar Events: Display upcoming Bitcoin community events
- Multi-relay Support: Query events from multiple Nostr relays
- Event Details: Rich event information with dates, locations, and descriptions
- RSVP Functionality: Allow users to RSVP to events (configurable)
- Multi-Author Support: Display posts from organizer + additional contributors
- NIP-23 Long-form Content: Full blog posts with rich formatting
- Individual Post Pages: Dedicated pages for each blog post with SEO optimization
- Comments & Reactions: NIP-22 threaded comments and NIP-25 emoji reactions
- Dynamic Routing: SEO-friendly URLs using Nostr naddr identifiers
- NIP-72 Communities: Full-featured community discussion pages with Chorus extensions
- Advanced Moderation: Complete moderation system with approve/remove/pin/ban capabilities
- Auto-Approval Workflow: Approved members' posts skip moderation queue per NIP.md spec
- Threaded Discussions: NIP-22 compliant comment threading with moderation on all levels
- Member Management: Join/leave requests, approved/declined/banned member lists
- Moderator Tools: Comprehensive moderation interface for community management
- Smart Filtering: Management interface shows only content needing attention
- NIP-07 Browser Extension: Seamless login with Alby, nos2x, etc.
- Multi-Account Support: Switch between different Nostr accounts
- Profile Management: Edit profile information directly in the app
- Environment-Based Config: Fully customizable via
.envfile - Dynamic Feature Boxes: Configure homepage content boxes
- Responsive Design: Mobile-first, works on all devices
- Light/Dark Mode: Automatic theme switching support
- Vite Build System: Fast development and optimized production builds
- TypeScript: Full type safety throughout the application
- Component Library: shadcn/ui components for consistent design
- Real-time Updates: Live content updates via Nostr subscriptions
- Frontend: React 18.x with TypeScript
- Styling: TailwindCSS 3.x + shadcn/ui components
- Build Tool: Vite for fast development and production builds
- Nostr Integration: @nostrify/react for protocol interactions
- State Management: TanStack Query for data fetching and caching
- Routing: React Router with dynamic route generation
- Forms: React Hook Form with validation
- Testing: Vitest + React Testing Library
- Node.js 18+ and npm
- A Nostr keypair (npub for your community organizer)
- Optional: NIP-72 community ID for social features
-
Clone the repository
git clone <repository-url> cd meetupsites
-
Install dependencies
npm install
-
Configure your community
Create a
.envfile in the project root and add your community details:# Required: Your meetup organizer's npub VITE_MEETUP_NPUB=npub1your_organizer_pubkey_here # Required: Site branding VITE_SITE_TITLE=Your Bitcoin Meetup VITE_SITE_DESCRIPTION=Join our Bitcoin community gatherings # Optional: Enable features as needed VITE_ENABLE_BLOG=true VITE_ENABLE_EVENTS=true VITE_ENABLE_RSVP=true
-
Start development server
npm run dev
-
Build for production
npm run build
| Variable | Description | Example |
|---|---|---|
VITE_MEETUP_NPUB |
Organizer's Nostr public key | npub1abc123... |
VITE_SITE_TITLE |
Your community name | Denver Bitcoin Community |
VITE_SITE_DESCRIPTION |
Short description | Join 200+ Bitcoiners in Denver |
| Variable | Default | Description |
|---|---|---|
VITE_ENABLE_BLOG |
true |
Show blog page with long-form posts |
VITE_ENABLE_EVENTS |
true |
Show events page with NIP-52 calendar |
VITE_ENABLE_RSVP |
true |
Allow RSVPs to events |
VITE_ENABLE_SOCIAL |
false |
Enable organizer's social notes |
# Add additional blog authors (comma-separated npubs)
VITE_BLOG_AUTHORS=npub1author1...,npub1author2...,npub1author3...# Use a specific Nostr long-form post as your About page
VITE_ABOUT_NADDR=naddr1your_about_post_address_here# Enable NIP-72 community discussion page
VITE_COMMUNITY_ID=34550:pubkey:community_identifier# Customize the 3 feature boxes on your homepage
VITE_FEATURE_BOX_1_TITLE=Events
VITE_FEATURE_BOX_1_DESCRIPTION=Stay updated with our upcoming Bitcoin community events
VITE_FEATURE_BOX_2_TITLE=Blog
VITE_FEATURE_BOX_2_DESCRIPTION=Read insights from our community
VITE_FEATURE_BOX_3_TITLE=RSVP
VITE_FEATURE_BOX_3_DESCRIPTION=Reserve your spot at our next event# Override default relays (comma-separated)
VITE_DEFAULT_RELAYS=wss://relay.damus.io,wss://relay.nostr.bandsrc/
βββ components/ # Reusable UI components
β βββ ui/ # shadcn/ui component library (48+ components)
β βββ auth/ # Authentication components (LoginArea, LoginDialog)
β βββ community/ # NIP-72 community features with full moderation
β βββ comments/ # NIP-22 commenting system with threading
βββ hooks/ # Custom React hooks
β βββ useNostr.ts # Core Nostr integration
β βββ useAuthor.ts # Profile data fetching
β βββ useBlogPosts.ts # Multi-author blog queries
β βββ useReactions.ts # NIP-25 reaction system
β βββ useCommunity*.ts # Community management with auto-approval
β βββ useZaps.ts # Lightning zap functionality
β βββ useWallet.ts # WebLN + NWC wallet integration
βββ pages/ # Route components
β βββ Index.tsx # Homepage
β βββ Blog.tsx # Blog listing page
β βββ BlogPost.tsx # Individual blog post pages
β βββ Events.tsx # Events listing page
β βββ Social.tsx # Community social page
β βββ About.tsx # About page (if configured)
βββ lib/ # Utility functions
β βββ config.ts # Environment configuration
β βββ community.ts # NIP-72 utilities with NIP-22 tag creation
β βββ utils.ts # General utilities
βββ contexts/ # React context providers
npm run dev- Start development servernpm run build- Build for productionnpm run preview- Preview production buildnpm run test- Run tests and lintingnpm run lint- Run ESLintnpm run type-check- Run TypeScript checks
- New Pages: Add to
src/pages/and updateAppRouter.tsx - New Components: Follow shadcn/ui patterns in
src/components/ - New Hooks: Add custom hooks to
src/hooks/ - Configuration: Add new options to
src/lib/config.ts
The project includes comprehensive testing:
- Unit Tests: Component and utility function tests
- Integration Tests: Full user workflows
- Type Safety: TypeScript compilation validation
- Code Quality: ESLint and Prettier checks
This project implements several Nostr Improvement Proposals (NIPs) with full compliance:
- NIP-01: Basic protocol flow and event structure
- NIP-07: Browser extension authentication
- NIP-09: Event deletion for post authors
- NIP-19: Bech32-encoded identifiers (npub, naddr, note, nevent)
- NIP-22: Threaded comments with proper NIP-22 tag structure
- NIP-23: Long-form content for blog posts
- NIP-25: Reactions (likes, dislikes, emoji reactions)
- NIP-52: Calendar events for meetup scheduling
- NIP-72: Moderated communities with complete implementation
- Chorus NIP-72 Extensions: Enhanced community management per NIP.md:
- Kind 34551: Approved members list with auto-approval workflow
- Kind 34552: Declined members list
- Kind 34553: Banned members list
- Kind 34554: Pinned posts list
- Kind 4550: Post approval events
- Kind 4551: Post removal events
- Kind 4552: Join request events
- Kind 4553: Leave request events
- Kind 1111: NIP-22 compliant threaded community discussions
The application connects to multiple Nostr relays by default:
relay.damus.io- General purpose relayrelay.nostr.band- Content aggregation relayrelay.primal.net- Popular client relay
Users can customize relay configuration via environment variables.
Deploy your Bitcoin community site for free using GitHub Pages:
-
Fork this repository to your GitHub account
-
Edit the
.envfile directly on GitHub:- Navigate to the
.envfile in your forked repository - Click the pencil icon to edit
- Update with your community configuration:
# Required: Your community organizer's npub VITE_MEETUP_NPUB=npub1your_organizer_pubkey_here # Required: Site branding VITE_SITE_TITLE=Your Bitcoin Community VITE_SITE_DESCRIPTION=Join our Bitcoin community gatherings # Optional: Enable features as needed VITE_ENABLE_BLOG=true VITE_ENABLE_EVENTS=true VITE_ENABLE_RSVP=true
- Click "Commit changes" to save
- Navigate to the
- Go to your repository on GitHub
- Click "Settings" tab
- Scroll to "Pages" in the left sidebar
- Configure Source:
- Source: Deploy from a branch
- Branch:
main - Folder:
/ (root)
- Click "Save"
GitHub will automatically build and deploy your site whenever you make changes to the main branch.
Your site will be available at: https://YOUR_USERNAME.github.io/bitcoincommunitysites/
To use your own domain:
-
Configure DNS at your domain provider:
- Add a CNAME record pointing to
YOUR_USERNAME.github.io
- Add a CNAME record pointing to
-
Update GitHub Pages settings:
- Go to Settings > Pages
- In the "Custom domain" field, enter your domain (e.g.,
yourmeetup.com) - Click "Save"
- Enable "Enforce HTTPS" (recommended)
GitHub will automatically create the CNAME file in your repository.
The app builds to static files and works with any static hosting provider:
- Netlify: Connect your Git repo for automatic deployments
- Vercel: Zero-config deployment with Git integration
- IPFS: Decentralized hosting via InterPlanetary File System
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "run", "preview"]Make sure to set your production environment variables:
- Set
VITE_MEETUP_NPUBto your actual organizer npub - Configure
VITE_SITE_TITLEandVITE_SITE_DESCRIPTION - Enable desired features (
VITE_ENABLE_*) - Set custom relay configuration if needed
We welcome contributions! Please see our contributing guidelines:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Run tests (
npm test) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow TypeScript best practices
- Use existing component patterns
- Add tests for new features
- Update documentation as needed
- Follow the existing code style
This project is licensed under the MIT License - see the LICENSE file for details.
- Nostr Protocol: Built on the decentralized Nostr protocol
- shadcn/ui: Beautiful, accessible UI components
- MKStack: Powered by the MKStack framework
- Bitcoin Community: Inspired by Bitcoin communities worldwide
- Documentation: Check this README and inline code comments
- Issues: Report bugs via GitHub Issues
- Community: Join the discussion on Nostr using the community features
Vibed with MKStack π
Building the decentralized future, one community at a time.