A comprehensive multi-media streaming platform that allows users to stream music, movies, books, and live TV from torrents and IPTV sources - without downloading content until playback.
- 🎵 Music Streaming - Stream FLAC, MP3, OGG, and more with full player controls
- 🎬 Video Streaming - Watch videos with seeking, fullscreen, and picture-in-picture
- 📚 Ebook Reader - Read PDFs and EPUBs with progress tracking
- 🔍 Deep Search - Search across file names, paths, and metadata
- ⬇️ Download - Download individual files or entire torrents
- 📺 Live TV - Stream from M3U playlists and Xtream Codes providers
- 📋 EPG Guide - Electronic Program Guide for live channels
- 🔄 Multiple Providers - Manage multiple IPTV sources
- 🎉 Watch Parties - Synchronized viewing with friends
- 💬 Real-time Chat - Chat while watching together
- 💳 Crypto Payments - Pay with cryptocurrency via CoinPayPortal
- 👨👩👧👦 Family Plans - Share with up to 10 family members
- 📱 PWA Support - Install as a native app on mobile and desktop
- 🌙 Dark Mode - Premium dark-mode-first design
- 🔒 Server-side Security - All sensitive operations server-side only
- Frontend: Next.js 16, React 19, TypeScript, Tailwind CSS
- Backend: Next.js API Routes (Server-side only)
- Database: Supabase (PostgreSQL with Full-Text Search)
- Torrent: WebTorrent (metadata-only fetching)
- Video: Video.js with HLS.js for M3U8 streaming
- Payments: CoinPayPortal (cryptocurrency)
- Testing: Vitest with TDD approach
- Deployment: DigitalOcean Droplet (with UDP support for DHT)
- Node.js v24+
- pnpm v9+
- Supabase account
git clone https://github.com/your-org/bittorrented.git
cd bittorrentedpnpm installcp .env.example .env.localEdit .env.local with your credentials:
# Supabase
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
SUPABASE_ANON_KEY=your-anon-key
# Metadata APIs
THETVDB_API_KEY=your-thetvdb-key
OMDB_API_KEY=your-omdb-key
# CoinPayPortal (for payments)
COINPAYPORTAL_MERCHANT_ID=your-merchant-id
COINPAYPORTAL_API_KEY=your-api-keypnpm devOpen http://localhost:3000 in your browser.
| Command | Description |
|---|---|
pnpm dev |
Start development server |
pnpm build |
Build for production |
pnpm start |
Start production server |
pnpm test |
Run tests in watch mode |
pnpm test:run |
Run tests once |
pnpm test:coverage |
Run tests with coverage |
pnpm lint |
Run ESLint |
pnpm typecheck |
Run TypeScript type checking |
bittorrented/
├── src/
│ ├── app/ # Next.js App Router
│ │ ├── api/ # API routes (server-side only)
│ │ ├── layout.tsx # Root layout
│ │ └── page.tsx # Home page
│ ├── components/ # React components
│ │ ├── layout/ # Layout components (sidebar, header)
│ │ ├── torrents/ # Torrent-related components
│ │ ├── players/ # Media player components
│ │ └── ui/ # UI primitives
│ ├── lib/ # Utility functions and services
│ │ ├── supabase/ # Supabase client (server-side only)
│ │ ├── torrent/ # Torrent services
│ │ ├── streaming/ # Streaming services
│ │ ├── magnet/ # Magnet URL parsing
│ │ └── indexer/ # File indexing
│ ├── hooks/ # React hooks
│ └── types/ # TypeScript types
├── public/ # Static assets
├── supabase/ # Supabase migrations
└── plans/ # Implementation plans
This project follows Test-Driven Development (TDD). Tests are written first, then implementation.
# Run tests in watch mode
pnpm test
# Run tests once
pnpm test:run
# Run tests with coverage
pnpm test:coverageWe use a DigitalOcean Droplet instead of App Platform because App Platform doesn't support UDP, which is required for DHT (Distributed Hash Table) peer discovery in BitTorrent.
Quick Start:
# 1. SSH into your Droplet
ssh root@YOUR_DROPLET_IP
# 2. Run the setup script
curl -fsSL https://raw.githubusercontent.com/profullstack/music-torrent/main/scripts/setup-droplet.sh | bash
# 3. Setup SSL
certbot --nginx -d yourdomain.com -d www.yourdomain.comWhat the setup script does:
- Installs Node.js 22, pnpm, FFmpeg, Nginx
- Clones the repository
- Creates a systemd service for auto-restart
- Configures Nginx as reverse proxy
GitHub Actions auto-deploy:
- Push to
mainbranch triggers automatic deployment - Required GitHub Secrets:
DROPLET_HOST- Droplet IP address or hostnameDROPLET_USER- SSH username (e.g.,ubuntu)DROPLET_SSH_KEY- Private SSH key for authenticationENV_FILE- Contents of.envfile for production
- Optional GitHub Secrets:
DROPLET_PORT- SSH port (defaults to22if not set)
See docs/deployment-droplet.md for detailed instructions.
- All Supabase calls are server-side only - No client-side database access
- Rate limiting - Prevents abuse of magnet ingestion and streaming
- Input validation - All user inputs are validated
- No content storage - Only metadata is stored, content is streamed on-demand
- Webhook verification - Payment webhooks are cryptographically verified
- Fork the repository
- Create a feature branch
- Write tests first (TDD)
- Implement the feature
- Ensure all tests pass
- Submit a pull request
MIT