Install
Releases
- Binary releases: GitHub Releases
- Docker image: GitHub Packages
Quickstart
A minimal config.yaml — one playlist, one EPG, one client:
server:
listen_addr: ":8080"
public_url: "http://localhost:8080"
url_generator:
secret: "change-me"
playlists:
- name: tv
sources: "https://provider.com/playlist.m3u8"
epgs:
- name: guide
sources: "https://provider.com/guide.xml"
clients:
- name: living-room
secret: "living-room-secret"
Start Majmun with majmun -config ./config.yaml, then point your TV or player at:
http://localhost:8080/living-room-secret/playlist.m3u8— the playlisthttp://localhost:8080/living-room-secret/epg.xml— the guide (.gzalso available)
Each client gets its own URLs based on its secret. From here, see Configuration for all options and
Examples for ready-to-use setups.
Docker Compose Example
services:
majmun:
image: ghcr.io/mazzz1y/majmun:latest
restart: always
command:
- -config
- /config
volumes:
- ./config:/config:ro
- majmun-cache:/cache
- majmun-state:/state
tmpfs:
- /tmp
ports:
- "8080:8080"
volumes:
majmun-cache:
majmun-state:
What each mount is for:
/config— your configuration file(s)./cache— disk cache for playlists, guides, and logos. Pointhttp_client.cache.pathat it (e.g.path: /cache)./state— schedules for generated channels; setplayout.state_dir: /statein your config. Without it, generated channels lose their live position on container recreation. Omit it if you don't use channels./tmpas tmpfs — when proxying is enabled, Majmun writes temporary video segments to/tmp. Keeping it in RAM avoids disk wear.
TLS
Majmun serves plain HTTP. If you expose it to the internet, put it behind a reverse proxy that terminates TLS
(Nginx, Caddy, Traefik) and set public_url to the https:// address.
No GPU drivers in the image
The Docker image ships with FFmpeg but no GPU drivers or hardware-acceleration libraries (VAAPI, NVENC, QSV). To use hardware acceleration, extend the image with the drivers for your hardware and pass the devices through to the container.