M3U Editor

Manage IPTV playlists, EPG guides and Xtream output in one place

  • sparkison/m3u-editor:0.13.6
  • port 6153
  • Media
M3U Editor screenshot 1M3U Editor screenshot 2M3U Editor screenshot 3M3U Editor screenshot 4M3U Editor screenshot 5M3U Editor screenshot 6

Web App

/
http://localhost:6153/

A full-featured IPTV editor, like xTeVe or Threadfin. It handles playlists, EPG data and Xtream API output. This uses upstream's own all-in-one image: PostgreSQL, Redis and the m3u-proxy stream proxy all run inside the one container.

Features

  • Works with m3u, m3u8, m3u+ and Xtream Codes API sources
  • EPG from XMLTV files, XMLTV URLs and Schedules Direct
  • Xtream API output and series management with .strm file sync
  • Post processing with custom scripts, webhooks and email
  • Built-in stream proxy with Redis pooling for smoother playback
  • Sign in with your own OIDC provider, if you want

How to use

  1. Open M3U Editor from your dashboard.
  2. Sign in with user name admin and password admin.
  3. Change the admin password right away.
  4. Add a playlist from your IPTV provider.
  5. Add an EPG source to get a TV guide.
  6. Copy your output playlist or Xtream link into Plex, Jellyfin, Emby or any IPTV player.

Before you install

APP_URL starts as http://localhost:6153. Change localhost to your ZimaOS IP, like http://192.168.1.20:6153, so playlist and EPG links work on other devices. PG_PASSWORD and DB_PASSWORD are filled in with a random password; if you change one, change the other to the same value (letters and numbers only) before the first start, because it is locked in then. The first start takes about two minutes. Sign in with admin / admin and change the password. OIDC sign-in and the stream proxy settings are in the Variables tab; add them in the app settings.

The settings in the first table are already in the app settings. To use any other one, open the app settings, add the variable with your value, save, and the app restarts with it. A setting you leave out uses its default.

In the app settings

VariableDefault valueDescription
TZ$TZYour time zone. It is filled in from your ZimaOS time zone. Leave it unless you need another.
APP_URLhttp://localhost:6153The address used in your playlist, EPG and Xtream links, like http://192.168.1.20:6153. Change localhost to your ZimaOS IP so players on other devices can use the links.
ENABLE_POSTGREStrueRuns the PostgreSQL database built into the image. Keep it at true.
DB_CONNECTIONpgsqlTells the app to use that database. Keep it at pgsql.
PG_DATABASEm3ueThe name of the built-in database. Must match DB_DATABASE.
PG_USERm3ueThe user of the built-in database. Must match DB_USERNAME.
PG_PASSWORDchange-mePre-filled with a random password for the built-in database. You can replace it before the first start (letters and numbers only). Must match DB_PASSWORD. It is locked in on the first start.
DB_HOSTlocalhostThe database runs inside the same container. Keep it at localhost.
DB_PORT5432The database port inside the container. Keep it at 5432.
DB_DATABASEm3ueMust match PG_DATABASE.
DB_USERNAMEm3ueMust match PG_USER.
DB_PASSWORDchange-meMust match PG_PASSWORD.

Sign in with OIDC

VariableDefault valueDescription
OIDC_ENABLEDfalseSet to true to sign in with your own OIDC provider (Authentik, Authelia, Keycloak, Pocket ID...).
OIDC_ISSUER_URL—Your provider's address, without /.well-known/openid-configuration.
OIDC_CLIENT_ID—The client ID from your provider.
OIDC_CLIENT_SECRET—The client secret from your provider.
OIDC_SCOPESopenid,profile,emailThe scopes to ask for, separated by commas.
OIDC_AUTO_CREATE_USERStrueSet to false so only existing users can sign in with OIDC.
OIDC_AUTO_REDIRECTfalseSet to true to skip the login form and go straight to your provider.
OIDC_BUTTON_LABELLogin with SSOThe text on the sign-in button.
OIDC_HIDE_LOGIN_FORMfalseSet to true to hide the user name and password form.

Stream proxy

VariableDefault valueDescription
M3U_PROXY_TOKEN—The token between the app and its built-in stream proxy. Leave it out and a new one is made on every start.
M3U_PROXY_LOG_LEVELERRORHow much the stream proxy logs: ERROR, WARNING, INFO or DEBUG.
HLS_GC_ENABLEDtrueSet to false to keep old HLS stream pieces instead of cleaning them up.
HLS_GC_AGE_THRESHOLD7200Delete HLS stream pieces older than this many seconds.

Features

VariableDefault valueDescription
NETWORK_BROADCAST_ENABLEDfalseSet to true to turn on Networks (your own pseudo-TV channels).
ALLOW_PRIVATE_WEBHOOK_URLSfalseSet to true so post-processing webhooks can call local addresses, like Jellyfin or Emby on your network.

Server

VariableDefault valueDescription
NGINX_READ_TIMEOUT900How many seconds a player may take to download a big playlist or EPG.

Logs

VariableDefault valueDescription
LOG_LEVELdebugHow much the app logs, like error, warning, info or debug.
docker-compose.yml
name: m3u-editor

services:
  m3u-editor:
    image: sparkison/m3u-editor:0.13.6
    container_name: m3u-editor
    restart: unless-stopped
    stop_grace_period: 60s
    network_mode: bridge
    environment:
      - TZ=$TZ
      - APP_URL=http://localhost:6153
      - ENABLE_POSTGRES=true
      - DB_CONNECTION=pgsql
      - PG_DATABASE=m3ue
      - PG_USER=m3ue
      - PG_PASSWORD=change-me
      - DB_HOST=localhost
      - DB_PORT=5432
      - DB_DATABASE=m3ue
      - DB_USERNAME=m3ue
      - DB_PASSWORD=change-me
    ports:
      - target: 36400
        published: "6153"
        protocol: tcp
    volumes:
      - type: bind
        source: /DATA/AppData/$AppID/config
        target: /var/www/config
        bind:
          create_host_path: true
      - type: bind
        source: /DATA/AppData/$AppID/pgdata
        target: /var/lib/postgresql/data
        bind:
          create_host_path: true
      - type: bind
        source: /DATA/AppData/$AppID/storage
        target: /var/www/html/storage/app/public
        bind:
          create_host_path: true
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1:36400/up"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 120s
    deploy:
      resources:
        limits:
          cpus: "2.00"
          memory: 3072M
        reservations:
          cpus: "0.25"
          memory: 512M
    labels:
      icon: https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/m3u-editor/icon.png
    x-casaos:
      id: com.icestore.m3u-editor
      envs:
        - container: TZ
          description:
            en_US: >-
              Your time zone. It is filled in from your ZimaOS time zone.
              Leave it unless you need another.
        - container: APP_URL
          description:
            en_US: >-
              The address used in your playlist, EPG and Xtream links, like
              http://192.168.1.20:6153. Change localhost to your ZimaOS IP so
              players on other devices can use the links.
        - container: ENABLE_POSTGRES
          description:
            en_US: Runs the PostgreSQL database built into the image. Keep it at true.
        - container: DB_CONNECTION
          description:
            en_US: Tells the app to use that database. Keep it at pgsql.
        - container: PG_DATABASE
          description:
            en_US: The name of the built-in database. Must match DB_DATABASE.
        - container: PG_USER
          description:
            en_US: The user of the built-in database. Must match DB_USERNAME.
        - container: PG_PASSWORD
          description:
            en_US: >-
              Pre-filled with a random password for the built-in database. You
              can replace it before the first start (letters and numbers only).
              Must match DB_PASSWORD. It is locked in on the first start.
        - container: DB_HOST
          description:
            en_US: The database runs inside the same container. Keep it at localhost.
        - container: DB_PORT
          description:
            en_US: The database port inside the container. Keep it at 5432.
        - container: DB_DATABASE
          description:
            en_US: Must match PG_DATABASE.
        - container: DB_USERNAME
          description:
            en_US: Must match PG_USER.
        - container: DB_PASSWORD
          description:
            en_US: Must match PG_PASSWORD.
      ports:
        - container: "36400"
          description:
            en_US: M3U Editor web app, playlists, EPG and Xtream API, published on host as 6153
      volumes:
        - container: /var/www/config
          description:
            en_US: App settings and config.
        - container: /var/lib/postgresql/data
          description:
            en_US: The built-in PostgreSQL database (playlists, channels, EPG, users).
        - container: /var/www/html/storage/app/public
          description:
            en_US: Uploaded logos and images.

x-casaos:
  id: com.icestore.m3u-editor
  architectures:
    - amd64
    - arm64
  main: m3u-editor
  author: HSinghHira
  category: Media
  developer: sparkison
  icon: https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/m3u-editor/icon.png
  thumbnail: https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/m3u-editor/screenshot-1.png
  screenshot_link:
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/m3u-editor/screenshot-1.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/m3u-editor/screenshot-2.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/m3u-editor/screenshot-3.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/m3u-editor/screenshot-4.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/m3u-editor/screenshot-5.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/m3u-editor/screenshot-6.png
  title:
    en_US: M3U Editor
  tagline:
    en_US: Manage IPTV playlists, EPG guides and Xtream output in one place
  description:
    en_US: >-
      A full-featured IPTV editor, like xTeVe or Threadfin. It handles
      playlists, EPG data and Xtream API output. This uses upstream's own
      all-in-one image: PostgreSQL, Redis and the m3u-proxy stream proxy all
      run inside the one container.


      **Features**


      - Works with m3u, m3u8, m3u+ and Xtream Codes API sources

      - EPG from XMLTV files, XMLTV URLs and Schedules Direct

      - Xtream API output and series management with .strm file sync

      - Post processing with custom scripts, webhooks and email

      - Built-in stream proxy with Redis pooling for smoother playback

      - Sign in with your own OIDC provider, if you want


      **How to use?**


      1. Open M3U Editor from the Zima OS dashboard.

      2. Sign in with user name admin and password admin.

      3. Change the admin password right away.

      4. Add a playlist from your IPTV provider.

      5. Add an EPG source to get a TV guide.

      6. Copy your output playlist or Xtream link into Plex, Jellyfin, Emby
         or any IPTV player.
  tips:
    before_install:
      en_US: >-
        1. Open the app configuration before you install.


        2. Find APP_URL. It starts as http://localhost:6153. Change localhost
           to your ZimaOS IP, like http://192.168.1.20:6153, so your playlist
           links work on other devices.


        3. PG_PASSWORD and DB_PASSWORD are filled in with a random password.
           You can leave them. If you change one, change the other to the
           same value, using letters and numbers only.


        4. More settings, like OIDC sign-in, are listed on the M3U Editor
           page at https://icestore.hsinghhira.me/app/m3u-editor/ (Variables
           tab). You can add them now or later in the app settings.


        5. Start the installation.


        6. Wait about two minutes before you open the app.


        7. Open http://your-zimaos-ip:6153 and sign in with admin and admin.


        8. Change the admin password. Then add your playlist and EPG.
  index: /
  port_map: "6153"
  scheme: http
  is_uncontrolled: false
  version: "0.13.6"
  update_at: "2026-10-25"
  release_notes:
    en_US: |-
      - Uses upstream's all-in-one image, with PostgreSQL, Redis and m3u-proxy inside one container
      - sparkison/m3u-editor 0.13.6
      - Published on port 6153
  repo: "https://github.com/m3ue/m3u-editor"
  support: "https://github.com/m3ue/m3u-editor/issues"
  docs: "https://sparkison.github.io/m3u-editor-docs/docs/about/getting-started/"