A fast, modern web IPTV player for your own Xtream Codes subscription. Self-host it on a VPS, a home server, or just run it locally on your Mac/PC.
Streamly is a full-featured IPTV front-end that works with any Xtream Codes-compatible IPTV provider. You bring your own subscription; Streamly is the player.
It lives in a browser tab but feels closer to a streaming app — Netflix-style shelves, a custom HLS player, TV remote navigation, EPG guide, parental controls, and more.
No ads. No tracking by default. Fully open source.
| 📺 Live TV | Channels grouped by category, EPG guide, region filter |
| 🎬 Movies | Poster grid, ratings, plot, cast, sortable & searchable |
| 🍿 Series | Full seasons & episodes with artwork and auto-resume |
| 🔍 Global search | Channels, movies, and series — ⌘K to open |
| ❤️ Favorites & Continue Watching | Persisted locally per account |
| 📡 Three-tier EPG | Provider → provider full-schedule → iptv-org public XMLTV fallback |
| 🎥 Custom HLS player | Quality selector, PiP, fullscreen, keyboard & TV remote shortcuts |
| 📱 Responsive | iPhone/iPad, desktop, and Samsung/LG TV browsers |
| 🛰️ Built-in proxy | Solves CORS, mixed-content, and HLS manifest rewriting |
| 🛡️ Parental controls | Hide adult categories with optional PIN |
| 🎨 Dark, modern UI | 2026 glassmorphism, soft gradients, skeleton loaders |
Home — Continue Watching shelf + library stats

Live TV — Netflix-style category shelves with EPG "now playing" data

Movies — discovery shelves (Continue Watching, Top Rated) + poster grid

Series — Top Rated and Newly Added shelves

Series detail — poster, plot, cast, and episode list

Settings — TV pairing via PIN (sign in once on desktop, link the TV with a 6-digit code)

git clone https://github.com/kvnpyy/streamly.git
cd streamly
npm install
cp .env.example .env # fill in AUTH_SECRET and STREAM_SESSION_SECRET at minimum
npm run dev # http://localhost:3000Open http://localhost:3000, enter your Xtream Codes credentials, and start watching.
npm install
cp .env.example .env # edit .env — see Environment section below
npm run build
npm start # or: pm2 start npm -- startThen put Nginx or Cloudflare in front for HTTPS.
A ready-made systemd service is in scripts/systemd/stream.service.
A scripted Ubuntu bootstrap (installs Node, sets up the service, etc.) is in
scripts/vps-bootstrap.sh.
A Dockerfile and docker-compose.yml are included.
# 1. Copy and fill in required env vars
cp .env.example .env
# 2. Build and start
docker compose up -d
# App is now at http://localhost:3000Or build the image manually:
docker build -t streamly .
docker run -d -p 3000:3000 \
-v streamly_data:/app/data \
-e AUTH_SECRET=your_secret \
-e STREAM_SESSION_SECRET=your_secret \
streamlyCopy .env.example and fill in at minimum:
| Variable | Required | Description |
|---|---|---|
AUTH_SECRET |
✅ | NextAuth session signing key (openssl rand -base64 32) |
STREAM_SESSION_SECRET |
✅ | Encrypts HttpOnly IPTV session cookies (32+ chars) |
DATABASE_URL |
— | SQLite path (default: file:./data/stream.db) |
RESEND_API_KEY |
production | Email for sign-up verification & password reset |
EMAIL_FROM |
production | Sender address Resend accepts |
TMDB_API_TOKEN |
optional | TMDB free read token — enables artwork on channel cards |
NEXT_PUBLIC_GA_MEASUREMENT_ID |
optional | GA4 measurement ID — leave unset to disable analytics |
See .env.example for the full list with comments.
src/
app/
api/
xtream/ Xtream Codes JSON proxy
stream/ HLS + VOD media proxy (manifest rewriting + Range)
img/ Poster/logo proxy with caching
external-epg/ Public XMLTV fallback (epg.pw / iptv-org)
artwork/ TMDB artwork proxy (server-side cached)
app/ Authenticated shell
live/ Live TV (Netflix-style shelves + list + EPG guide)
movies/ Movies grid + detail
series/ Series grid + seasons/episodes detail
favorites/ Saved items
search/ Global search
settings/ Account + data management
login/ Login / register
components/
Player.tsx Custom HLS-aware video player overlay
TvLiveBrowse TV browser shelf layout with spatial D-pad navigation
WebLiveBrowse Web/mobile shelf layout
MediaCard Poster card with initials fallback
LiveChannelTile Live channel row with EPG
TvCategoryView Full-screen "See all" overlay for TV
lib/
xtream.ts Typed Xtream Codes API client
hooks.ts useChannelEPG — three-tier EPG chain
channel-meta.ts Heuristic channel name → country/network/flag parser
external-epg.ts Server-side iptv-org XMLTV download + fuzzy matcher
epg-local-cache localStorage-backed EPG cache (30 min TTL)
store/
auth.ts Credentials + account (Zustand, persisted)
preferences.ts Favorites, recents, parental lock (Zustand, persisted)
player.ts Player overlay state
Stack: Next.js 16 · React 19 · Tailwind CSS v4 · HLS.js · Zustand · TanStack Query · Drizzle ORM · SQLite · Framer Motion
Live channels get "now playing" data from a three-tier fallback chain:
- Provider short EPG —
get_short_epgfrom your Xtream panel - Provider full schedule —
get_simple_data_table(catches panels that omitepg_channel_id) - Public XMLTV fallback — epg.pw (iptv-org data) when the provider has no data and the channel name implies a country code
Results are cached in localStorage for 30 minutes so subsequent page opens are instant.
| Action | Key |
|---|---|
| Open search | ⌘K / Ctrl+K |
| Play / pause | Space or K |
| Seek ±10 s | ← → |
| Flip channel (Live TV) | ↑ ↓ |
| Mute | M |
| Fullscreen | F |
| Picture-in-picture | P |
| Close player | Esc / Back button |
Streamly has a dedicated TV layout (detected automatically) optimised for:
- Samsung Internet (Tizen)
- LG webOS browser
- Amazon Fire TV Silk browser
Features: spatial D-pad navigation, large touch targets, hardware Back button exits fullscreen/player, region-filtered shelves.
PRs and issues welcome. Run npm run dev to get started. Please run
npm run predeploy (lint + build) before opening a PR.
MIT — see LICENSE.
Streamly is a player. It does not provide, host, or distribute any IPTV content. You are responsible for using it only with content you have the right to access.