Create a classic TV experience using your own media - IPTV backed by Plex/Jellyfin/Emby/NFO
Find a file
2026-04-02 10:35:17 -04:00
.github chore: upgrade versions of a various github actions 2026-03-19 15:52:57 -04:00
.husky chore: add commitlint setup and configuration 2024-07-08 13:19:33 -04:00
design feat(macos): add proper macOS wrapper app (#1290) 2025-07-29 22:01:25 -04:00
docker docs: big docs update part 1 2025-11-05 16:09:34 -05:00
docs docs: fix nvidia docker run line break (#1754) 2026-03-28 09:30:47 -04:00
docs-extras/includes docs: even more stuff 2025-11-05 16:47:52 -05:00
macos/Tunarr fix(macos): create tunarr data directory on first run if not exists 2026-01-06 10:48:51 -05:00
patches refactor: add media_source_id to relevant entities (#1106) 2025-02-28 15:53:29 -05:00
release chore: try pre-releases on release-please because release-it has too many bugs 2026-01-05 16:10:21 -05:00
scripts chore: add bump-version script 2026-01-20 16:45:06 -05:00
server fix: always set state = ok for newly minted groupings 2026-04-02 10:35:17 -04:00
shared fix(search): render "starts with" operator as < in filter string (#1762) 2026-03-30 11:58:05 -04:00
types fix: allow unsetting loudnorm config 2026-03-20 16:42:04 -04:00
web fix: improve user experience of channel overview on mobile (#1768) 2026-03-30 19:45:07 -04:00
.dockerignore Packaging v0: Build and run server in a docker container (#139) 2024-03-05 13:13:26 -05:00
.gitignore chore: ignore files generated from JetBrains IDEs (#1735) 2026-03-24 20:04:07 -04:00
.prettierignore fix: another fix for foreign keys migration; defer checking 2025-12-11 10:20:56 -05:00
.prettierrc fix: fix channel deletes when channel is associated with fillers (#889) 2024-10-18 12:31:05 -04:00
.release-it.json chore: configure release-it to actually make a github release 2026-01-06 13:19:16 -05:00
CHANGELOG.md chore: release 1.1.3 2026-01-20 16:04:19 +00:00
CLAUDE.md chore: minor updates to CLAUDE.md 2026-02-16 16:32:11 -05:00
commitlint.config.ts chore: add commitlint setup and configuration 2024-07-08 13:19:33 -04:00
CONTRIBUTING.md feat!: add support for Jellyfin media (#633) 2024-08-22 07:41:33 -04:00
Dockerfile chore: more changes and improvements around tunarr versioning 2026-01-05 20:47:50 -05:00
eslint.config.mjs fix: sort nested program queries by index 2026-01-16 12:49:39 -05:00
LICENSE dizqueTV license 2020-09-24 18:49:41 -04:00
mkdocs.yml docs: add music media source to side nav 2026-01-18 10:12:31 -05:00
package.json feat: add support for loudnorm audio filter 2026-02-15 08:20:31 -05:00
pnpm-lock.yaml chore: update hls.js to latest version 2026-03-19 15:44:22 -04:00
pnpm-workspace.yaml feat: add support for loudnorm audio filter 2026-02-15 08:20:31 -05:00
README.md chore: update README 2026-03-03 08:42:48 -05:00
release.config.mjs chore: add test release-it configurations 2026-01-03 11:28:45 -05:00
shell.nix build: simplify shell.nix shell hook 2026-03-17 11:41:32 -05:00
tsconfig.json docs: host multiple api versions 2026-01-09 15:04:30 -05:00
turbo.json chore: cleanup turbo tasks, consolidate some shared package versions 2025-09-30 21:02:20 -04:00
vitest.config.ts fix: ensure scaling happens on hw for vaapi when tonemap env var is false 2026-03-29 21:14:41 -04:00

Tunarr TV Guide

Tunarr

Create your own live TV channels from media on Plex, Jellyfin, Emby, or local files.

GitHub Release Docker Pulls GitHub Stars Discord License


What is Tunarr?

Tunarr lets you build custom live TV channels out of your existing media libraries — movies, TV episodes, music videos, or local files — and stream them as if they were real broadcast channels.

Tune in by adding Tunarr's spoofed HDHomeRun tuner to Plex, Jellyfin, or Emby, or grab the M3U URL for any IPTV player like Tivimate or UHF.

Features

Media Sources

  • Connect Plex, Jellyfin, Emby, or local file libraries
  • Advanced search, filter, and sort across all connected libraries

Channel Management

  • Drag-and-drop lineup editor
  • Filler content between programs (commercials, music videos, prerolls, branding)
  • Per-channel logos and automatic configuration backups

Scheduling

  • Time-slot and random-slot scheduling tools
  • Web-based TV guide for viewing channel lineups

Playback & Integration

  • Spoofed HDHR tuner for Plex, Jellyfin, and Emby
  • M3U/IPTV output for Dispatcharr, Threadfin, xTeVe, or any IPTV client
  • Stream channels directly in the browser
  • Per-channel audio language and subtitle preferences

Transcoding

  • Hardware-accelerated transcoding: Nvidia NVENC, VAAPI, Intel QuickSync, macOS VideoToolbox
  • Multiple transcode profiles, configurable per channel

Screenshots

Channel Management
Channel Management
Channel Configuration
Channel Configuration

Quick Start

The easiest way to run Tunarr is with Docker Compose. Create a docker-compose.yml:

services:
  tunarr:
    image: chrisbenincasa/tunarr:latest
    container_name: tunarr
    ports:
      - 8000:8000
    environment:
      - TZ=America/New_York
    volumes:
      - ./tunarr-data:/config/tunarr
    restart: unless-stopped

Then run:

docker compose up -d

Tunarr will be available at http://localhost:8000.

Other installation options:

Platform Method
Linux / macOS / Windows Standalone binaries
Unraid Community App Store
Proxmox LXC helper script
ARM (Raspberry Pi, etc.) Docker image (linux/arm64)

For hardware-accelerated transcoding setup, see the transcoding docs.

Documentation

Development

pnpm i
pnpm turbo dev  # backend at :8000, frontend at :5173/web

See CONTRIBUTING.md for a full development guide.

Community

License

Tunarr is released under the Zlib License.