A Nostr-powered podcast platform for single creator accounts that combines decentralized publishing with Podcasting 2.0 standards.
- Creator-only publishing with hardcoded npub authentication
- Upload audio files to Blossom servers or reference external URLs
- Rich episode metadata: title, description, cover art, transcripts, chapters
- Podcasting 2.0 value tags for Lightning payments and funding
- Episode editing and management through intuitive Studio interface
- Automatic Podcasting 2.0-compliant RSS feed at /rss.xml
- Build-time RSS generation using scripts/build-rss.ts
- Lightning value splits with modern lnaddressmethod (no keysend fallback)
- iTunes and standard RSS 2.0 support with health monitoring
- RSS feed pulls episodes from Nostr relays at build time
- Clean, responsive audio player with progress tracking
- Chronological episode listing with rich metadata
- Episode search by title, description, and tags
- Mobile-optimized interface
- Creator social feed for updates and announcements
- Episode comments system with full threading (NIP-22)
- Fan engagement through Nostr protocol:
- Threaded comments and replies on episodes
- Lightning zaps (NIP-57) with WebLN and NWC support
- Social reactions and reposts
 
- Zap leaderboards and episode popularity metrics
- Real-time comment updates and notifications
- Standard Nostr authentication (NIP-07, NIP-46)
- Addressable podcast episodes (kind 30054)
- Comments system using NIP-22
- Value-for-value Lightning integration
- Node.js 18+
- NPM or compatible package manager
# Clone the repository
git clone https://github.com/your-username/podstr.git
cd podstr
# Install dependencies
npm install
# Copy environment configuration
cp .env.example .env
# Configure your podcast settings in .env
# Set your creator npub and podcast metadata# Start development server
npm run dev
# Run tests
npm test
# Build for production
npm run build
# Generate RSS feed
npx tsx scripts/build-rss.tsEdit .env to customize your podcast:
# Creator Configuration
VITE_CREATOR_NPUB=npub1...
# Podcast Metadata  
VITE_PODCAST_TITLE=Your Podcast Name
VITE_PODCAST_DESCRIPTION=Your podcast description
VITE_PODCAST_AUTHOR=Your Name
VITE_PODCAST_EMAIL=[email protected]
VITE_PODCAST_IMAGE=https://your-image-url.jpg
# Podcasting 2.0 Value
VITE_PODCAST_VALUE_RECIPIENTS=[{"name":"Host","type":"lightning-address","address":"[email protected]","split":100}]- Frontend: React 18, TypeScript, TailwindCSS 3.x
- UI Components: shadcn/ui (48+ components) with Radix primitives
- Build Tool: Vite with hot module replacement
- Nostr: Nostrify framework for Deno and web
- State Management: TanStack Query for data fetching and caching
- Routing: React Router with BrowserRouter
- Audio: HTML5 audio with persistent playback state
- Lightning: WebLN and Nostr Wallet Connect (NWC) integration
- File Upload: Blossom server integration for media storage
src/
├── components/          # Reusable UI components
│   ├── ui/             # shadcn/ui components (48+ available)
│   ├── auth/           # Authentication components (LoginArea, AccountSwitcher)
│   ├── audio/          # Audio player components (PersistentAudioPlayer)
│   ├── podcast/        # Podcast-specific components (EpisodeCard, etc.)
│   ├── social/         # Social interaction components (PostActions, NoteComposer)
│   ├── comments/       # Threading comment system (CommentsSection)
│   └── studio/         # Creator studio components (EpisodeManagement, etc.)
├── hooks/              # Custom React hooks (useNostr, useZaps, etc.)
├── lib/                # Utility functions and configurations
├── pages/              # Route components (Index, Episodes, Studio, etc.)
├── contexts/           # React context providers (AppContext, NWCContext)
└── types/              # TypeScript type definitions
scripts/
├── build-rss.ts        # Build-time RSS feed generation
├── validate-rss.ts     # RSS feed validation
└── test-rss-endpoint.ts # RSS endpoint testing
dist/
├── rss.xml             # Generated Podcasting 2.0 RSS feed
├── rss-health.json     # RSS health and status monitoring
└── 404.html            # GitHub Pages compatibility
- Episodes: kind 30054(Addressable/editable podcast episodes)
- Metadata: kind 30078(Podcast configuration)
- Comments: kind 1111(NIP-22 episode comments)
- Social: kind 1(Creator updates and announcements)
Deploy to Vercel, Netlify, or GitHub Pages:
npm run build
# Deploy dist/ folder to your hosting provider- Build-time: RSS generated automatically during npm run build
- Manual: Run npx tsx scripts/build-rss.tsto regenerate
- Periodic: Set up cron jobs using updated RSS_CRON_SETUP.mdguide
- Webhooks: Trigger builds when new episodes are published
- Health monitoring: Check /rss-health.jsonfor feed status
Ensure production environment has all required variables from .env
- Fork the repository
- Create a feature branch: git checkout -b feature/amazing-feature
- Commit changes: git commit -m 'Add amazing feature'
- Push to branch: git push origin feature/amazing-feature
- Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Nostr Protocol - Decentralized social networking foundation
- Podcasting 2.0 - Modern podcast standards and value integration
- shadcn/ui - Beautiful, accessible UI components
- Nostrify - Nostr development framework
Vibed with MKStack ⚡
Built for creators who want to own their content, engage directly with their audience, and participate in the value-for-value economy through Bitcoin Lightning payments.