Skip to content

kvnpyy/streamly

Repository files navigation

Streamly — Self-Hosted IPTV Player

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.

Next.js React Tailwind License


What is this?

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.


Features

📺 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

Screenshots

Home — Continue Watching shelf + library stats Home

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

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

Series — Top Rated and Newly Added shelves Series

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

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


Self-hosting — quick start

Option A: run locally (Mac / Linux / Windows WSL)

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:3000

Open http://localhost:3000, enter your Xtream Codes credentials, and start watching.

Option B: production build (VPS / home server)

npm install
cp .env.example .env        # edit .env — see Environment section below
npm run build
npm start                   # or: pm2 start npm -- start

Then 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.

Option C: Docker / Docker Compose

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:3000

Or 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 \
  streamly

Environment variables

Copy .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.


Architecture

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


EPG (Electronic Program Guide)

Live channels get "now playing" data from a three-tier fallback chain:

  1. Provider short EPGget_short_epg from your Xtream panel
  2. Provider full scheduleget_simple_data_table (catches panels that omit epg_channel_id)
  3. Public XMLTV fallbackepg.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.


Keyboard shortcuts

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

TV browser support

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.


Contributing

PRs and issues welcome. Run npm run dev to get started. Please run npm run predeploy (lint + build) before opening a PR.


License

MIT — see LICENSE.


Disclaimer

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.

About

Self-hosted IPTV player for Xtream Codes — Live TV, Movies, Series, EPG, TV browser support. Built with Next.js 16, React 19, Tailwind v4.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages