A native Apple TV application for watching live video streams from the Nostr protocol with integrated Lightning Network zap support.
nostrTV brings decentralized live streaming to your living room. The app connects to multiple Nostr relays to discover live streams (NIP-53) and allows users to watch them directly on Apple TV. Viewers can support streamers by sending Lightning zaps with optional comments, all from the comfort of their couch.
- Live Stream Discovery - Automatically discovers live streams from multiple Nostr relays
- Lightning Zaps - Send sats to streamers via Lightning Network with QR code support
- Live Chat - Real-time chat messages alongside the stream
- Zap Chyron - Scrolling banner displaying recent zaps and comments
- Nostr Login - Sign in with your Nostr identity via NIP-46 Bunker connection
- Profile Display - Shows streamer profiles with pictures and Lightning addresses
- Curated Feed - Admin-curated discover feed for quality content
- 10-foot UI - Optimized interface for TV viewing with Apple TV remote navigation
- Apple TV 4K (2nd generation or later)
- tvOS 18.0 or later
- Xcode 15.0 or later (for development)
-
Clone the repository:
git clone https://github.com/tkhumush/nostrTV.git cd nostrTV -
Open the project in Xcode:
open nostrTV.xcodeproj
-
Select your Apple TV device or simulator as the build target
-
Build and run (⌘R)
# Build the app
xcodebuild -project nostrTV.xcodeproj -scheme nostrTV \
-destination "platform=tvOS Simulator,name=Apple TV 4K (3rd generation)" build
# Run tests
xcodebuild -project nostrTV.xcodeproj -scheme nostrTV \
-destination "platform=tvOS Simulator,name=Apple TV 4K (3rd generation)" test
# Clean build
xcodebuild -project nostrTV.xcodeproj -scheme nostrTV clean- Launch the app to see the Discover tab with curated live streams
- Navigate using the Apple TV remote to browse available streams
- Select a stream to start watching
- Chat Toggle - Show/hide the live chat panel
- Streamer Profile - Click the streamer info to view their profile and follow
- Send Chat - Type a message and send to the live chat (requires login)
- Click on the streamer profile while watching
- Select a zap amount
- Scan the QR code with a Lightning wallet
- Your zap will appear in the chyron banner
- Go to Settings and select "Sign In"
- Choose NIP-46 Bunker login
- Scan the QR code with a compatible Nostr app (Amber, etc.)
- Approve the connection request
| Component | Description |
|---|---|
NostrSDKClient |
Manages WebSocket connections to Nostr relays and event handling |
StreamViewModel |
Central state management for stream discovery and display |
StreamActivityManager |
Handles combined chat and zap subscriptions per stream |
VideoPlayerView |
Custom video player with chat, zap chyron, and streamer info |
NostrAuthManager |
Manages user authentication via NIP-46 Bunker |
| Kind | Name | Purpose |
|---|---|---|
| 0 | Metadata | User profiles |
| 3 | Contacts | Follow lists |
| 30311 | Live Event | Stream metadata (NIP-53) |
| 1311 | Live Comment | Chat messages |
| 9735 | Zap Receipt | Lightning payment receipts |
wss://relay.snort.socialwss://relay.tunestr.iowss://relay.damus.iowss://relay.primal.net
- SwiftUI - Declarative UI framework
- AVKit - Hardware-accelerated video playback
- NostrSDK - Nostr protocol implementation
- CoreImage - QR code generation for Lightning invoices
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the 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 - The decentralized social protocol
- NIP-53 - Live Activities specification
- Lightning Network - Bitcoin's Layer 2 payment network
- Built with NostrSDK
nostrTV - Decentralized streaming for the big screen