A modern streaming platform built with Next.js 16, featuring movies, TV shows, live TV, and cross-device sync. Deployed on Cloudflare's edge network for maximum performance.
- Movies & TV Shows - Browse trending content, search, and watch with multiple video providers
- Live TV - IPTV support with DLHD integration
- Cross-Device Sync - Sync watchlist, continue watching, and preferences across devices
- Continue Watching - Resume playback from where you left off
- Admin Dashboard - Real-time analytics, user metrics, and live activity monitoring
- Privacy-First - Anonymous tracking, no PII collected, GDPR-compliant
Flyx runs entirely on Cloudflare's edge network using:
- Cloudflare Pages - Next.js app via
@opennextjs/cloudflare - Cloudflare Workers - Analytics, sync, and stream proxy
- Cloudflare D1 - SQLite database at the edge
- Cloudflare account (free tier works)
- Wrangler CLI installed
- TMDB API key
# Install Wrangler globally
npm install -g wrangler
# Login to Cloudflare
wrangler logingit clone https://github.com/Vynx-Velvet/flyx-main.git
cd flyx-main
npm installcp .env.example .env.localEdit .env.local with your configuration:
# Required - TMDB API
TMDB_API_KEY=your_tmdb_bearer_token
NEXT_PUBLIC_TMDB_API_KEY=your_tmdb_api_key
# Cloudflare Worker URLs (update after deploying workers)
NEXT_PUBLIC_CF_SYNC_URL=https://flyx-sync.YOUR-SUBDOMAIN.workers.dev
NEXT_PUBLIC_CF_ANALYTICS_WORKER_URL=https://flyx-analytics.YOUR-SUBDOMAIN.workers.dev
NEXT_PUBLIC_CF_PROXY_URL=https://media-proxy.YOUR-SUBDOMAIN.workers.devCreate the required D1 databases:
# Admin database (for main app)
wrangler d1 create flyx-admin-db
# Analytics database (for analytics worker)
cd cf-analytics-worker
wrangler d1 create flyx-analytics-db
cd ..
# Sync database (for sync worker)
cd cf-sync-worker
wrangler d1 create flyx-sync-db
cd ..Important: Copy the database_id from each command output and update the respective wrangler.toml files.
# Initialize admin database schema
npm run d1:init
# Initialize analytics worker schema
cd cf-analytics-worker
wrangler d1 execute flyx-analytics-db --file=schema.sql
cd ..
# Initialize sync worker schema
cd cf-sync-worker
wrangler d1 execute flyx-sync-db --file=schema.sql
cd ..# Set secrets for main app
wrangler secret put TMDB_API_KEY
wrangler secret put JWT_SECRET
# Set secrets for media proxy (if using RPI proxy)
cd cloudflare-proxy
wrangler secret put RPI_PROXY_URL
wrangler secret put RPI_PROXY_KEY
cd ..# Deploy all workers and the main app
npm run deploy:allOr deploy individually:
# Deploy workers first
npm run deploy:analytics-worker
npm run deploy:sync-worker
npm run deploy:media-proxy
# Then deploy the main app
npm run deploy:cloudflare| Script | Description |
|---|---|
npm run build:cloudflare |
Build Next.js app for Cloudflare Pages |
npm run deploy:cloudflare |
Build and deploy main app to Cloudflare Pages |
npm run deploy:analytics-worker |
Deploy analytics worker |
npm run deploy:sync-worker |
Deploy sync worker |
npm run deploy:media-proxy |
Deploy media proxy worker |
npm run deploy:workers |
Deploy all three workers |
npm run deploy:all |
Deploy workers + main app (full deployment) |
npm run preview:cloudflare |
Preview Cloudflare build locally |
Flyx uses three D1 databases:
| Database | Purpose | Used By |
|---|---|---|
flyx-admin-db |
Admin users, feedback, bot detection, daily metrics | Main App |
flyx-analytics-db |
Page views, watch sessions, presence tracking | Analytics Worker |
flyx-sync-db |
Watch progress, watchlist, user preferences | Sync Worker |
After creating databases, update the database_id in each wrangler.toml:
Root wrangler.toml:
[[d1_databases]]
binding = "DB"
database_name = "flyx-admin-db"
database_id = "YOUR-ADMIN-DB-ID"cf-analytics-worker/wrangler.toml:
[[d1_databases]]
binding = "DB"
database_name = "flyx-analytics-db"
database_id = "YOUR-ANALYTICS-DB-ID"cf-sync-worker/wrangler.toml:
[[d1_databases]]
binding = "DB"
database_name = "flyx-sync-db"
database_id = "YOUR-SYNC-DB-ID"# Initialize admin database
npm run d1:init
# Initialize locally (for development)
npm run d1:init:local
# Query database directly
wrangler d1 execute flyx-admin-db --command="SELECT * FROM admin_users"| Variable | Description |
|---|---|
TMDB_API_KEY |
TMDB Bearer token (Read Access Token) |
NEXT_PUBLIC_TMDB_API_KEY |
TMDB API key (v3 auth) |
| Variable | Description |
|---|---|
NEXT_PUBLIC_CF_SYNC_URL |
Sync Worker URL for cross-device sync |
NEXT_PUBLIC_CF_ANALYTICS_WORKER_URL |
Analytics Worker URL |
NEXT_PUBLIC_CF_PROXY_URL |
Media proxy worker URL |
| Variable | Description |
|---|---|
JWT_SECRET |
Secret for admin JWT tokens |
RPI_PROXY_URL |
RPI proxy URL for DLHD streams |
RPI_PROXY_KEY |
RPI proxy authentication key |
# Start Next.js dev server
npm run dev
# Preview Cloudflare build locally
npm run preview:cloudflare
# Run workers locally
cd cf-analytics-worker && npm run dev
cd cf-sync-worker && npm run dev
cd cloudflare-proxy && npm run devAccess at /admin after deployment.
Default credentials: vynx / defaultPassword
# Create new admin
npm run admin:create <username> <password>
# Reset password
npm run admin:reset-password <username> <new-password>
# List all admins
npm run admin:list
# Delete admin
npm run admin:delete <username>┌──────────────────────────────────────────────────────────────┐
│ Cloudflare Edge Network │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Cloudflare Pages (Next.js) │ │
│ │ via @opennextjs/cloudflare │ │
│ │ │ │ │
│ │ D1: flyx-admin-db │ │
│ └────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────┐ ┌──────────────┐ ┌───────────────────┐ │
│ │ Sync Worker │ │ Analytics │ │ Media Proxy │ │
│ │ │ │ Worker │ │ Worker │ │
│ │ D1: sync-db │ │ D1: analytics│ │ │ │
│ └─────────────┘ └──────────────┘ └───────────────────┘ │
└──────────────────────────────────────────────────────────────┘
- Free tier: 100k requests/day, 5GB D1 storage, unlimited Pages bandwidth
- Global edge: <50ms latency worldwide with 300+ edge locations
- No cold starts: Always warm, instant responses
- SQLite at edge: D1 is SQLite, simple and fast
- Automatic SSL: Free SSL certificates
- Preview deployments: Automatic previews for PRs
flyx-main/
├── app/ # Next.js App Router
│ ├── (routes)/ # Page routes
│ ├── admin/ # Admin panel
│ ├── api/ # API routes
│ ├── components/ # React components
│ ├── lib/ # Utilities & services
│ │ ├── db/ # D1 database utilities
│ │ ├── analytics/ # Analytics client
│ │ └── sync/ # Sync client
│ └── types/ # TypeScript types
├── cf-analytics-worker/ # Analytics Worker + D1
├── cf-sync-worker/ # Sync Worker + D1
├── cloudflare-proxy/ # Stream proxy worker
├── scripts/ # CLI scripts
│ ├── init-d1-admin.sql # D1 schema initialization
│ └── create-admin.js # Admin user creation
├── wrangler.toml # Main app Cloudflare config
└── open-next.config.ts # OpenNext configuration
# Clear build cache and rebuild
rm -rf .open-next .next
npm run build:cloudflare# Check database exists
wrangler d1 list
# Check tables
wrangler d1 execute flyx-admin-db --command="SELECT name FROM sqlite_master WHERE type='table'"
# Re-initialize schema
npm run d1:init# Check worker status
wrangler deployments list
# View worker logs
cd cf-analytics-worker && wrangler tail- Verify secrets are set:
wrangler secret list - Check
wrangler.tomlhas correct[vars]section - Redeploy after adding secrets
# Run all tests
npm test
# Run specific test suites
npm run test:livetv
npm run test:livetv:api
# Type checking
npm run type-check- Movie & TV Data - TMDB
- IPTV Help - MoldyTaint/Cinephage
- Cloudflare Adapter - @opennextjs/cloudflare
MIT License - see LICENSE