Skip to main content
config.yml controls the application runtime, storage, reverse proxy behavior, and optional subsystems. Relative paths are resolved against the Tuliprox home directory.

Top-level fields

FieldTypeDescription
apiobjectHTTP server host, port, and web root
storage_dirstringDirectory for persisted playlists, databases, and metadata
mapping_pathstringPath to mapping.yml or a directory of mapping files
template_pathstringPath to template.yml or a directory of template files
process_parallelboolEnable parallel processing on multi-core systems
default_user_agentstringUser-agent sent to upstream providers
messagingobjectOptional Telegram, Discord, Pushover, or REST notifications
videoobjectExtensions, download config, and web search template
metadata_updateobjectMetadata resolve, probe, TMDB, and FFprobe settings
scheduleslistCron-based scheduled tasks
reverse_proxyobjectStream delivery, buffering, caching, and rate limiting
backup_dirstringLocation for Web UI configuration backups
update_on_bootboolStart a playlist update automatically at launch
logobjectLog level and sanitization settings
web_uiobjectWeb UI visibility, auth, and player settings
user_access_controlboolEnforce expiry, status, and max-connections per user
connect_timeout_secsintConnect-phase timeout for provider requests (0 = disabled)
custom_stream_response_pathstringDirectory of fallback .ts streams for error conditions
custom_stream_response_timeout_secsintCap playback duration of fallback streams
user_config_dirstringStorage for user-specific config such as bouquets
hdhomerunobjectHDHomeRun device emulation for Plex, Jellyfin, Emby
proxyobjectGlobal outgoing proxy for upstream requests
ipcheckobjectEndpoints for public IP detection
config_hot_reloadboolHot-reload mapping and api-proxy config on change
sleep_timer_minsintIdle sleep timer in minutes
accept_unsecure_ssl_certificatesboolAccept self-signed or invalid SSL certificates
disk_based_processingboolUse disk instead of memory during playlist processing
libraryobjectLocal media library integration

Core runtime

api

Configures the embedded HTTP server.
api:
  host: localhost
  port: 8901
  web_root: ./web
web_root is resolved relative to the Tuliprox home directory when it is not an absolute path.

storage_dir

Storage location for persisted playlists, databases, and metadata.
storage_dir: ./data

process_parallel

Enable parallel processing on multi-core systems. Be aware that multiple worker threads can also consume multiple provider connections simultaneously during updates.
process_parallel: true

mapping_path and template_path

Tuliprox loads mappings and templates from a single file or an entire directory.
  • If a path points to a directory, all *.yml files are loaded in alphanumeric order and merged.
  • Template names must remain globally unique.
  • Defaults: mapping.yml and template.yml in the home directory.
mapping_path: ./mappings/
template_path: ./templates/

Provider failover and rotation

Tuliprox supports provider failover and DNS-aware rotation. Providers can expose multiple URLs, and Tuliprox rotates to the next candidate on supported failure conditions.

provider:// scheme

Configurations can reference providers via provider://<provider_name>/.... Tuliprox resolves that to the current active provider URL or resolved IP.

Automatic failover triggers

Failover is triggered for the following HTTP status codes:
Triggers failoverDoes not trigger failover
Network timeouts401 Unauthorized
408 Request Timeout403 Forbidden
500, 502, 503, 504
404, 410, 429

proxy — provider DNS block

Each provider entry can include a dns block:
FieldDescription
enabledEnable DNS-based rotation
refresh_secsHow often to re-resolve DNS
prefersystem, ipv4, or ipv6
max_addrsMaximum resolved addresses to keep
schemesURL schemes to apply rotation to
keep_vhostPreserve the virtual host header
overridesStatic IP overrides per hostname
on_resolve_errorBehavior on DNS resolution failure
on_connect_errorBehavior on connection failure
Resolved IPs are persisted in provider_dns_resolved.json under storage_dir.
provider:
  - name: my_provider
    urls:
      - http://provider-a.example
      - http://provider-b.example
    dns:
      enabled: true
      refresh_secs: 300
      prefer: ipv4
      schemes: [http, https]
      keep_vhost: true
      max_addrs: 2
      on_resolve_error: keep_last_good
      on_connect_error: try_next_ip

messaging

Optional notification system supporting Telegram, Discord, Pushover, and REST webhooks.

notify_on events

EventDescription
infoGeneral informational messages
statsPlaylist update statistics
errorError conditions
watchGroup watch notifications
Templates can be raw strings or file:// / http(s):// URIs. Handlebars variables available in templates: message, kind, timestamp, stats, watch, processing.
messaging:
  notify_on:
    - info
    - stats
    - error
  telegram:
    markdown: true
    bot_token: "<telegram bot token>"
    chat_ids:
      - "<chat id>"
      - "<chat id>:<thread id>"
messaging:
  notify_on:
    - info
    - error
  discord:
    webhook_url: "https://discord.com/api/webhooks/<id>/<token>"
messaging:
  notify_on:
    - info
    - error
  pushover:
    app_token: "<app token>"
    user_key: "<user key>"
messaging:
  notify_on:
    - info
    - error
  rest:
    url: "https://hooks.example.com/notify"
    method: POST
    headers:
      Authorization: "Bearer <token>"

video

Optional video-related behavior for the Web UI.
FieldDescription
extensionsFile extensions treated as video content
download.directoryDownload destination directory
download.organize_into_directoriesOrganize downloads into subdirectories
download.episode_patternRegex to extract episode identifiers from filenames
web_searchURL template for media searches — {} is replaced with the title
video:
  web_search: "https://www.imdb.com/search/title/?title={}"
  extensions: [mkv, mp4, avi]
  download:
    directory: /tmp
    organize_into_directories: true
    episode_pattern: '.*(?P<episode>[Ss]\d{1,2}(.*?)[Ee]\d{1,2}).*'

metadata_update

Controls how Tuliprox resolves metadata, probes streams, queries TMDB, and invokes FFprobe.
FieldDescription
cache_pathDirectory for metadata cache
retry_delayDelay between retries
worker_idle_timeoutHow long a worker waits before shutting down
max_queue_sizeMaximum pending metadata tasks
no_change_cache_ttl_secsTTL when no change is detected
probe_fairness_resolve_burstMax resolve burst for fairness
FieldDescription
log.queue_intervalHow often to log queue depth
log.progress_intervalHow often to log resolve progress
FieldDescription
resolve.max_retry_backoffMaximum backoff duration between retries
resolve.min_retry_baseMinimum base delay for first retry
resolve.max_attemptsMaximum number of resolve attempts
resolve.exhaustion_reset_gapGap before resetting exhausted state
FieldDescription
probe.cooldownMinimum time between probes of the same stream
probe.max_attemptsMaximum probe attempts
probe.retry_backoff_step_1Backoff after first failed probe
probe.retry_backoff_step_2Backoff after second failed probe
probe.retry_backoff_step_3Backoff after third failed probe
probe.retry_load_retry_delayDelay before retrying a load
probe.backoff_jitter_percentRandom jitter percentage on backoffs
probe.user_priorityPriority for probe tasks (same scale as user priority)
FieldDescription
tmdb.enabledEnable TMDB metadata enrichment
tmdb.api_keyYour TMDB API key
tmdb.rate_limit_msMilliseconds between TMDB requests
tmdb.cache_duration_daysHow long to cache TMDB results
tmdb.languageLanguage code for TMDB responses (e.g. en-US)
tmdb.cooldownMinimum time between TMDB queries for the same title
tmdb.match_thresholdMinimum similarity score to accept a TMDB match
FieldDescription
ffprobe.enabledEnable FFprobe stream analysis
ffprobe.timeoutTimeout for each FFprobe invocation
ffprobe.analyze_durationAnalysis duration for VOD streams
ffprobe.probe_sizeProbe size limit for VOD streams
ffprobe.live_analyze_durationAnalysis duration for live streams
ffprobe.live_probe_sizeProbe size limit for live streams
Duration fields accept s, m, h, d suffixes or plain seconds. Size fields accept B, KB, MB, GB, TB or plain bytes.
metadata_update:
  cache_path: metadata
  log:
    queue_interval: 30s
    progress_interval: 15s
  resolve:
    max_retry_backoff: 1h
    min_retry_base: 5s
    max_attempts: 3
    exhaustion_reset_gap: 1h
  probe:
    cooldown: 7d
    retry_load_retry_delay: 1m
    retry_backoff_step_1: 10m
    retry_backoff_step_2: 30m
    retry_backoff_step_3: 1h
    max_attempts: 3
    backoff_jitter_percent: 20
    user_priority: 127

schedules

See the Scheduled tasks page for the full reference. Quick example:
schedules:
  - schedule: "0  0  8  *  *  *  *"
    type: PlaylistUpdate
    targets:
      - m3u
  - schedule: "0  0  20  *  *  *  *"
    type: LibraryScan

reverse_proxy

This block controls stream delivery, buffering, caching, header forwarding, rate limiting, and resource retries. See the Streaming and Proxy page for the full reference.
The reverse_proxy block is covered in detail on the Streaming and Proxy page under Core Features.

backup_dir

Location for configuration backups written from the Web UI.
backup_dir: ./backups

update_on_boot

If true, Tuliprox starts a playlist update automatically when the application launches.
update_on_boot: true

log

FieldDescription
sanitize_sensitive_infoRedact credentials and tokens from log output
log_active_userInclude active username in log entries
log_levelLog verbosity — plain level or module-specific string
log_level accepts a plain level (debug, info, warn, error) or a comma-separated module filter:
log:
  log_level: hyper_util::client::legacy::connect=error,tuliprox=debug

web_ui

FieldDescription
enabledShow or hide the Web UI
user_ui_enabledEnable the end-user facing UI
content_security_policyOverride the default CSP header
pathURL path prefix for the Web UI
player_serverExternal player server URL
kick_secsSeconds before an idle Web UI session is kicked
combine_views_stats_streamsMerge view, stats, and stream data in the UI
authJWT authentication for the Web UI

auth sub-section

FieldDescription
enabledEnable JWT-based authentication
issuerJWT issuer claim value
secretJWT signing secret
token_ttl_minsToken time-to-live in minutes
userfilePath to the user credentials file
The userfile format is one username:password_hash entry per line. Generate password hashes with:
tuliprox --genpwd
web_ui:
  enabled: true
  user_ui_enabled: true
  auth:
    enabled: true
    issuer: tuliprox
    secret: "<jwt secret>"
    userfile: user.txt

Access control and stream fallback

user_access_control

When enabled, Tuliprox evaluates each user’s status, exp_date, and max_connections on every stream request.
user_access_control: true

connect_timeout_secs

Defines the connect-phase timeout for provider requests. Set to 0 to disable the timeout.
connect_timeout_secs: 10

custom_stream_response_path

Directory containing fallback transport streams served to clients when a stream cannot be delivered.
FilenameWhen served
channel_unavailable.tsChannel cannot be reached
user_connections_exhausted.tsUser has hit their max_connections limit
provider_connections_exhausted.tsProvider capacity exhausted
low_priority_preempted.tsStream preempted by a higher-priority user
user_account_expired.tsUser account has passed its exp_date
panel_api_provisioning.tsProvider account is being provisioned
custom_stream_response_timeout_secs caps the playback duration of those fallback streams.
custom_stream_response_path: ./fallback_streams
custom_stream_response_timeout_secs: 30

Other optional sections

Storage location for user-specific configuration such as bouquets.
user_config_dir: ./user_config
Enables HDHomeRun device emulation for integration with Plex, Jellyfin, Emby, and TVHeadend. Supports multiple virtual devices, optional lineup authentication, and SSDP plus SiliconDust discovery.
hdhomerun:
  enabled: true
Global outgoing proxy for all upstream provider requests. Supported schemes: http, https, socks5.
proxy:
  url: socks5://proxy.example:1080
Defines endpoints and optional regexes for public IP detection.
FieldDescription
urlGeneric IP check endpoint
url_ipv4IPv4-specific endpoint
url_ipv6IPv6-specific endpoint
pattern_ipv4Regex to extract IPv4 address from response
pattern_ipv6Regex to extract IPv6 address from response
ipcheck:
  url_ipv4: https://api4.ipify.org
  url_ipv6: https://api6.ipify.org
When enabled, Tuliprox watches mapping files and api-proxy.yml and reloads them automatically when changes are detected — no restart required.
config_hot_reload: true
Enables local media library integration with recursive directory scanning, movie vs. series classification, NFO reading and writing, TMDB enrichment, incremental scans, and stable virtual IDs.
FieldDescription
enabledEnable the library
scan_directoriesList of directories to scan
scan_directories[].enabledEnable this scan directory
scan_directories[].pathAbsolute path to scan
scan_directories[].content_typeauto, movie, or series
scan_directories[].recursiveScan subdirectories
supported_extensionsFile extensions to index
library:
  enabled: true
  scan_directories:
    - enabled: true
      path: "/projects/media"
      content_type: auto
      recursive: true
  supported_extensions: ["mp4", "mkv", "avi", "mov", "ts", "m4v", "webm"]

Build docs developers (and LLMs) love