Skip to content

Configuration

Domekologe edited this page Aug 4, 2026 · 14 revisions

Configuration

🌐 English · Deutsch

All settings are managed in the WebUI and stored in the SQLite database (app_settings table). A .env file is no longer required.

Migration: If a legacy ~/.mediaforge/.env still exists, its values are imported into the database once on first start (existing DB values are never overwritten) and the file is then renamed to .env.imported. It is not read again after that, so it can never silently override what you set in the WebUI. Your original values stay readable in the renamed file; delete it whenever you like.

Values in that file that have no WebUI equivalent (see the table at the end of this page) cannot be imported. They are listed in the startup log — set them as real environment variables if you still need them.

On startup the app additionally exports all stored DB settings into the process environment (MEDIAFORGE_*), so both paths behave identically internally. Environment variables remain useful for initial configuration via Docker — values saved from the UI take precedence.

Screenshot: settings page Screenshot: settings page

General settings (Settings page, admin only)

Setting DB key Env variable Default Description
Download path download_path MEDIAFORGE_DOWNLOAD_PATH ~/Downloads Base folder for all downloads
Language separation lang_separation MEDIAFORGE_LANG_SEPARATION 0 One subfolder per language (german-dub, english-sub, …)
Disable English Sub disable_english_sub MEDIAFORGE_DISABLE_ENGLISH_SUB 0 Hides English Sub (relevant for "All Languages" sync)
FilmPalast subfolder filmpalast_movie_subfolder FILMPALAST_MOVIE_SUBFOLDER 0 Put movies into their own subfolder
Default language download_language MEDIAFORGE_LANGUAGE German Dub Preselection for downloads
Default provider download_provider MEDIAFORGE_PROVIDER VOE Preselection for downloads
Naming template naming_template MEDIAFORGE_NAMING_TEMPLATE see below File naming scheme
AniWorld absolute episode numbers aniworld_absolute_episodes MEDIAFORGE_ANIWORLD_ABSOLUTE_EPISODES 0 Names AniWorld files after the show's continuous count instead of the season-relative one — see below
Web base URL web_base_url MEDIAFORGE_WEB_BASE_URL empty Public URL behind a reverse proxy (enables secure cookies for https://)
Media statistics media_stats_enabled MEDIAFORGE_MEDIA_STATS_ENABLED 0 Adds a Media category to the statistics page (movie/series/episode counts from the library)
Debug mode debug_mode MEDIAFORGE_DEBUG_MODE 0 Verbose logging — takes effect live, no restart (on and off). When the app is started with --debug the toggle is locked on and greyed out (with a note).
Web Console web_console MEDIAFORGE_WEB_CONSOLE 0 Shows a read-only, SSH-style console of the live application/FFmpeg output directly in the settings page (admin only)

Naming template

Default:

{title} ({year}) [imdbid-{imdbid}]/Season {season}/{title} S{season}E{episode}.mkv

Available placeholders: {title}, {year}, {imdbid}, {season}, {episode}. The scheme is Jellyfin/Plex-compatible (folder per series, Season XX subfolders, SxxExx file names).

AniWorld: absolute episode numbers

AniWorld splits long-running shows (One Piece, Detective Conan, …) into site-side seasons, while the show itself keeps one continuous count. The site puts that absolute number at the end of the episode title:

Folge 2 | Das Versprechen - A Promise Between Men! Luffy and the Whale Vow to Meet Again! [Episode 063]

Without the option, {episode} is the season-relative number and the file becomes S02E002. With it on, the number from the [Episode NNN] marker is used instead and the file becomes S02E063.

The season is deliberately left alone. Only {episode} changes; the episode stays in the season AniWorld lists it in.

Details:

  • AniWorld only. s.to, MegaKino, FilmPalast and hanime have no such marker and are unaffected.
  • Episodes without a marker keep their season-relative number, so a season can end up mixed if AniWorld only tags part of it.
  • Movies/specials (/filme) are never renumbered.
  • Affects new downloads only. Files already on disk are not renamed, so switching the option on mid-library leaves two numbering schemes side by side — but nothing is downloaded twice because of it: an episode counts as present under either name. The "already downloaded" badge in the download dialog, auto-sync's skip check and the language-upgrade file cleanup all check both, so a complete show stays complete the moment the setting is flipped. New downloads use the new name from then on.
  • Auto-sync episode filters keep using the numbers AniWorld shows in its list (Staffel 2 / Folge 1), not the absolute ones.

Presets: Set Jellyfin Defaults / Set Defaults

Two buttons under Settings → Downloads → Presets. Both write the same five settings in one request, so whichever was pressed last fully describes the state — a preset can never leave a half-applied mix behind. Neither renames anything already on disk.

Before anything is written, a dialog shows what will change and offers one choice: set the folder and file structure as well, or keep your own. The naming template is the one preset field that is a matter of taste rather than of correctness — someone may want the Jellyfin numbering without giving up a layout they have built a library around. Unticked, the naming template is simply left out of the request and the other four settings still apply. When the current template already matches the preset there is nothing to decide and the choice is not shown.

Setting Set Defaults Set Jellyfin Defaults
naming_template {title} ({year}) [imdbid-{imdbid}]/Season {season}/{title} S{season}E{episode}.mkv {title}/{title} - S{season}E{episode} - ({language}).mkv
aniworld_absolute_episodes 0 1
lang_separation 0 0
disable_english_sub 0 0
movie_subfolder 0 1

Why the Jellyfin set looks like that:

  • No season subfolder — one folder per series instead.
  • Absolute episode numbers on, so the number in the file name is the one the episode is known by outside AniWorld.
  • No language folders. They split one series across several library entries — the language goes into the file name instead, so two language versions of the same episode can sit side by side in one folder.
  • Caveat on the language suffix. Jellyfin reads whatever follows the SxxExx marker as the episode title, so it shows (German Dub) there. A Jellyfin NFO overrides it with the real title — set a TMDB key under Settings → Integrations if you want proper episode titles.
  • Movie subfolders on — what Jellyfin's movie scanner expects.

Switching language separation off is refused-with-a-warning territory if auto-sync jobs still use a language fallback group; the warning from the save is shown as a toast.

Subtitles (Settings → Downloads)

Downloads the subtitles a source offers and muxes them into the finished file as switchable tracks. On by default; details in Download System.

Setting DB key Env variable Default Description
Download subtitles dl_subtitles MEDIAFORGE_DL_SUBTITLES 1 Asks yt-dlp for every subtitle rendition the source offers and muxes them into the .mkv as soft-sub tracks converted to SubRip (-c:s srt), tagged with their ISO 639-2/B language code. Auto-generated/ASR captions are never fetched; language codes are normalised (de/de-DE/ger/deudeu, unknown → und, duplicates collapsed) and at most 12 tracks are kept. Runs after any upscale pass; a failed mux only logs a warning and keeps the video unchanged. Covers the stream's own renditions plus the hoster's out-of-band player config; the external OpenSubtitles lookup below is separate and off by default

Only sources that serve real subtitle tracks are affected. The German Sub / English Sub language options are something different — they pick a video variant with the subtitles burned into the picture, which cannot be switched off.

OpenSubtitles (Settings → Integrations → Third Party)

An optional external subtitle lookup, run as the last step of the subtitle chain and only for the languages the finished file is still missing. Off by default; details in Download System.

An API key from opensubtitles.com → Consumers and a user login are required — downloads are bound to an account. Admin only: Test connection on the card verifies key and login without downloading anything.

Setting DB key Default Description
Enable OpenSubtitles opensubtitles_enabled 0 Master toggle. Off means the lookup never runs
API key opensubtitles_api_key Consumer API key from opensubtitles.com. Stored encrypted
Username opensubtitles_username Your opensubtitles.com account
Password opensubtitles_password Password of that account. Stored encrypted
Languages opensubtitles_languages de,en Comma-separated OpenSubtitles/ISO 639-1 codes to look for. A language the file already has is skipped
Hearing impaired opensubtitles_hearing_impaired exclude include, exclude or only — how SDH/HI subtitles are treated

Secrets never leave the server: the settings API only reports whether a key/password is stored (has_api_key, has_password), and saving with the field left empty keeps the stored value. API: GET/PUT /api/settings/opensubtitles and POST /api/settings/opensubtitles/test (admin only).

Duplicate handling (Settings → Downloads)

Two opt-in checks that only apply when the episode already exists on disk. Both default to off; details in Download System.

Setting DB key Env variable Default Description
Replace with better quality dl_quality_upgrade MEDIAFORGE_DL_QUALITY_UPGRADE 0 Probes the hoster stream with ffprobe and re-downloads only when it is better than the file on disk (height higher by more than 32 px, or same height with a bitrate at least 20 % higher). Unknown resolution/bitrate counts as not better. The old file is replaced outright — extra audio tracks it may have had are not preserved
Merge additional languages into the existing file dl_audio_track_merge MEDIAFORGE_DL_AUDIO_TRACK_MERGE 0 Finds the same episode in the sibling language folders and muxes the new audio track into that file (ffmpeg -c copy) instead of writing a second, near-duplicate file. Useful with language separation or {language} in the naming template

Start Page (Settings → Start Page)

Two levels. Every user configures their own home page; an admin additionally sets what an account starts with. A user's choice only overrides the parts they actually changed — see Web UI.

Setting DB key Scope Default Description
New home page new_home_enabled instance 0 The opt-in home page this tab configures. Only the DEFAULT: an account that picked a layout for itself (new_home in its UI preferences: empty = follow this, 0 = classic, 1 = new) keeps its own
Layout banner answered new_home_promo_done account empty 1 once the account dismissed the "Try the new home page" banner or switched over once. Set by the banner, never by an admin
Row order home_rows_order instance new,popular,movies,watchlist,upcoming,continue,library Order for accounts that never changed it
Hidden rows home_rows_hidden instance empty Rows a new account does not see — and does not pay for: a hidden row is never collected
Cards per row home_cards_per_row instance 30 One of 10/20/30/40/60
Sources off by default home_default_sources_off instance empty Chips that start switched off (this is a starting point, not a restriction — disable a source under Sources to actually take it away)
Types off by default home_default_types_off instance adult Same for the type chips
Personal layout home_feed_layout account (user_ui_prefs) empty o:<order>;h:<hidden>;n:<cards> — only the parts the user changed
Personal filters home_feed_filters account (user_ui_prefs) empty s:<sources off>;t:<types off>

Sources (start page & search)

The five built-in sources — AniWorld (anime), SerienStream (series), FilmPalast (movies), MegaKino (movies & series) and hanime (adult / 18+, off by default) — can be reordered and toggled from the settings page. All options are stored globally in the database and are admin only. They have no environment variable (DB only).

Order & sections (Settings → Sources)

Under Settings → Sources → Source order you decide how the sources appear on the start page — either by dragging the rows or using the up/down arrows. For AniWorld and SerienStream you can additionally:

  • toggle the New and Popular sections on or off independently, and
  • choose whether New or Popular is shown first.

If both sections of a source are turned off, its whole block is hidden on the start page. MegaKino (New/Popular × Movies/Series) and hanime (New/Trending) can be reordered and toggled the same way.

Enable / disable sources (Settings → Sources)

The Sources tab lets you switch each source on or off. A disabled source is no longer loaded or shown on the start page. The option "Also hide disabled sources from search results" additionally removes disabled sources from the search.

Setting DB key Default Description
Source order home_source_order aniworld,sto,filmpalast,megakino,hanime Order of the source blocks on the start page
Section order (AniWorld) home_section_order_aniworld new,popular Whether New or Popular is shown first
Section order (SerienStream) home_section_order_sto new,popular Whether New or Popular is shown first
Section order (MegaKino) home_section_order_megakino new_movies,popular_movies,new_series,popular_series Order of MegaKino's four sections
Section order (hanime) home_section_order_hanime new,trending Order of hanime's sections
Show New (AniWorld) source_show_new_aniworld 1 Show/hide the "New Anime" section
Show Popular (AniWorld) source_show_popular_aniworld 1 Show/hide the "Popular Anime" section
Show New (SerienStream) source_show_new_sto 1 Show/hide the "New Series" section
Show Popular (SerienStream) source_show_popular_sto 1 Show/hide the "Popular Series" section
Show New Movies (MegaKino) source_show_new_movies_megakino 1 Show/hide MegaKino's "New Movies" section
Show Popular Movies (MegaKino) source_show_popular_movies_megakino 1 Show/hide MegaKino's "Popular Movies" section
Show New Series (MegaKino) source_show_new_series_megakino 1 Show/hide MegaKino's "New Series" section
Show Popular Series (MegaKino) source_show_popular_series_megakino 1 Show/hide MegaKino's "Popular Series" section
Show New (hanime) source_show_new_hanime 1 Show/hide hanime's "New" section
Show Trending (hanime) source_show_trending_hanime 1 Show/hide hanime's "Trending" section
AniWorld enabled source_enabled_aniworld 1 Show/load AniWorld on the start page
SerienStream enabled source_enabled_sto 1 Show/load SerienStream on the start page
FilmPalast enabled source_enabled_filmpalast 1 Show/load FilmPalast on the start page
MegaKino enabled source_enabled_megakino 1 Show/load MegaKino on the start page
hanime enabled source_enabled_hanime 0 Show/load hanime (18+) — off by default, enabling needs an age confirmation
Hide disabled from search sources_hide_in_search 0 Also skip disabled sources in search results

AutoSync settings

Setting DB key Default Values
Sync interval sync_schedule 0 (off) 1min, 30min, 1h, 2h, 4h, 8h, 12h, 16h, 24h
Schedule mode sync_mode interval interval or weekly
Weekdays (weekly) sync_days 0,1,2,3,4,5,6 Comma list, 0=Mon … 6=Sun
Times (weekly) sync_times 06:00 Comma list HH:MM, one or more
Sync language sync_language German Dub All languages + All Languages
Sync provider sync_provider VOE Active providers
Path unavailable action sync_path_unavailable_action skip skip or hold
Error retries sync_error_retries 0 0–10
Retry delay sync_error_retry_time 5min 0min5min
Adaptive Auto-Sync sync_adaptive_enabled 0 0 / 1
↳ Pause after sync_adaptive_pause_after 4w 2w8w (weeks without a new episode)
↳ Retry after (value) sync_adaptive_retry_value 2 212
↳ Retry after (unit) sync_adaptive_retry_unit days days, weeks, months

In weekly mode, sync_days + sync_times replace the fixed interval; a job then runs on the selected weekdays at each configured time (caught up if the app was off at that time). How it all works: AutoSync.

Download history

Setting DB key Default Values
Retention history_retention_days 30 0 (unlimited), 7, 30, 90, 180, 365 (days)

History entries older than the selected period are deleted automatically (cleanup runs roughly hourly in the background). Details: Download History.

Custom paths (additional download targets)

Named extra paths (e.g. a NAS mount) can be created under Settings. Downloads and AutoSync jobs can then pick a custom path per job. Paths in use by queue entries or sync jobs cannot be deleted.

Which of these paths a newly set up AutoSync starts on is chosen under Settings → Auto-Sync → Default Path. The list offers the global Download path (default) first, then every custom path. Editing an existing job always keeps that job's own path, so changing this never moves jobs that already run. If the chosen path is deleted, the setting falls back to the download path.

DNS settings

If your ISP's DNS blocks the streaming sites, an alternative resolver can be selected — takes effect immediately, no restart:

Mode Server
system Operating system DNS (default)
cloudflare 1.1.1.1 (DoH)
google 8.8.8.8 (DoH)
quad9 9.9.9.9 (DoH)
custom Your own server IP

The switch works on two levels: the app's HTTP requests use DNS-over-HTTPS (niquests), and socket.getaddrinfo is patched so subprocesses like FFmpeg use the chosen server too. A built-in DNS test checks all source sites (aniworld.to, serienstream.to, filmpalast.to, megakino.to, hanime.tv). It verifies not only reachability but that the real site answers: resolved IPs are labelled with their CDN provider (e.g. Cloudflare), and an ISP/CUII block page is flagged as such instead of counting as reachable. The same check powers UpTime monitoring.

Syncplay

Configure a Syncplay server for the Watch Together feature in the player (Web UI → Playback & streaming). The server runs a real Syncplay client per viewer, so playback syncs with desktop mpv/VLC users too.

Setting DB key Env variable Default Description
Server address syncplay_server MEDIAFORGE_SYNCPLAY_SERVER empty Hostname of the Syncplay server (feature is hidden when empty)
Port syncplay_port MEDIAFORGE_SYNCPLAY_PORT 8999 Syncplay server port
Use TLS syncplay_tls MEDIAFORGE_SYNCPLAY_TLS 0 Connect over TLS
Server password syncplay_password MEDIAFORGE_SYNCPLAY_PASSWORD empty Optional server password

Automatic updates (self-update)

Under Settings → Updates the app can update itself and switch release channel. The 24 h update check only shows a notice; this is the actual install side.

Setting DB key Default Description
Auto-update auto_update_enabled 0 Install an available update automatically
Weekdays auto_update_days 0,1,2,3,4,5,6 Comma list, 0=Mon … 6=Sun
Time auto_update_time 03:00 HH:MM — when the scheduled install runs

When enabled, an available update is installed automatically at the selected time on the chosen weekdays; the app restarts itself and any running downloads resume afterwards.

Release channel (stable ↔ dev): you can switch between the stable release and the dev channel (latest commits from the models branch — may be unstable). Switching installs the selected version right away.

Which installs can self-update: pip (release & dev) and pipx installs support self-update and channel switching. Docker, frozen (PyInstaller) and unknown installs cannot self-update — the UI shows a hint instead (update Docker via your image/compose, see Docker).

Watchdog (stuck downloads)

Setting DB key / env Default Description
Hard timeout watchdog_hang_timeout / MEDIAFORGE_HANG_TIMEOUT 0 (off) Absolute ceiling for a single episode download. Off by default — a long download is not a hang, that is what the stall timeout is for
Stall timeout watchdog_stall_timeout / MEDIAFORGE_STALL_TIMEOUT 3600 s Abort when no progress for this long

Telemetry

Telemetry is opt-in and consent-gated: a first-run dialog asks for consent, and nothing is sent without it. Consent is staged:

  • Stage 1 — crash reports, system info and an anonymous install ID
  • Stage 2 — feature usage flags (which features are used at all)
  • Stage 3 — feature detail statistics

The install ID is a random UUID with no link to you or your system; it can be regenerated at any time via "Reset identity" — which also discards the device credential below, so the reset really is a clean break.

Since 1.4.2 each installation registers once with the server and receives its own device secret, and every telemetry request is signed with it (HMAC-SHA256 over the request, with a timestamp and a one-time nonce). The secret is stored encrypted and is never shown in the interface. Before this, the install ID alone was enough to request an export or a deletion, so anyone who happened to see it — in a screenshot or a support log — could act on your data. Nothing changes about what is transmitted; only who is allowed to ask for it.

What is fetched regardless of telemetry

MediaForge polls the Dev Infos feed from the same server every five minutes, and on startup, whether or not telemetry is switched on. This is the changelog and status notice you see in the sidebar and as a banner on the home page. It is a plain GET: it carries no install ID and no other identifier, and nothing about your library, your settings or your downloads. It is deliberately not switchable — the feed is how a breaking change or an outage reaches you.

Worth knowing because it looks confusing from the outside: with telemetry off you will still see connections to the telemetry server in a firewall log. Those are this feed (and, only while you have the page open, the Module Store catalog) — not telemetry.

Library scanning

MediaForge no longer rescans the whole media library on every start. A full scan of a large library takes minutes and almost always produces the same result, and while MediaForge runs the file watcher already picks up changes live.

Instead a location is rescanned once its cached scan is older than the configured interval — set under Settings → Library and Statistics → "Automatic library rescan" (off, 6 h, 12 h, 24 h, 2 days, 7 days; 24 h by default). The check runs at startup and every 15 minutes afterwards, so it also catches files that appeared while MediaForge was closed, or changes on a network share whose events never reach the watcher.

Two things happen regardless of the interval: locations that have never been scanned (a fresh install, or a newly added custom path) are always read in, so the Library page is never empty, and the refresh button on the Library page rescans on demand.

Scan intensity (same settings block) sets how many ffprobe workers run in parallel. Files whose name already says 1080p cost nothing; the rest have to be opened. The default derives from your CPU count; raise it on fast local NVMe storage to finish a large first scan in one pass — it will keep the drive busy while it runs — and lower it for a network share, where extra workers mostly multiply timeouts. Whatever the setting, a scan stops after two minutes of probing and picks up where it left off a few minutes later, so it always returns.

A location that is unreachable at scan time — a NAS that is offline, say — keeps its previous scan instead of being cached as empty, and is retried at the next check.

Scanning is also bounded now. Files whose name does not reveal a resolution have to be opened with ffprobe; on a large library on a slow or flaky network share that used to be tens of thousands of calls and looked like the scan had hung. A scan now probes at most a few thousand files and spends at most two minutes doing so — the rest is resolved by the next scan, and results (including "nothing to learn from this file") are remembered, so every pass makes progress. Concurrent scans are also serialised: a scan requested while another is running is skipped rather than piling on.

Environment-variable-only options

Some options exist only as environment variables (mostly relevant for Docker):

Variable Description
MEDIAFORGE_WEB_ADMIN_USER / MEDIAFORGE_WEB_ADMIN_PASS Auto-create the admin account on first start
MEDIAFORGE_HTTPS 1 = force secure cookies (behind a TLS proxy)
MEDIAFORGE_TRUSTED_PROXIES Number of reverse proxies in front of MediaForge (usually 1, default 0 = off). Only with this set are X-Forwarded-For/-Proto honoured: the login rate limit then counts per real client instead of bucketing everyone behind the proxy together, and HTTPS is detected without MEDIAFORGE_HTTPS. Leave at 0 when MediaForge is reachable directly — otherwise any client could forge its own address.
MEDIAFORGE_REDIS_URL Redis storage for the login rate limit (in-memory otherwise)
MEDIAFORGE_VAPID_PRIVATE_KEY / MEDIAFORGE_VAPID_PUBLIC_KEY / MEDIAFORGE_VAPID_CLAIMS_EMAIL Custom Web Push keys (auto-generated otherwise)
MEDIAFORGE_INSTALL_FOLDER Location for auto-downloaded binaries (default ~/.mediaforge)
MEDIAFORGE_SHOW_TLS_WARNINGS 1 = show urllib3's InsecureRequestWarning again. Suppressed by default: MediaForge only skips certificate verification for an explicitly configured bare-IP mirror, and some security suites make the warning appear spuriously on every request.
MEDIAFORGE_CAPTCHA_DEBUG_LOG 1 = mirror the captcha browser's console/network errors into the app log (noisy, troubleshooting only)
MEDIAFORGE_WEB_AUTH 1 = require login even when no admin has been created yet
MEDIAFORGE_USER_AGENT User-Agent used for stream proxying (default Mozilla/5.0)
MEDIAFORGE_CONCURRENT_FRAGMENTS Parallel HLS/DASH fragments per download (default 8)
MEDIAFORGE_HANG_TIMEOUT / MEDIAFORGE_STALL_TIMEOUT Watchdog thresholds in seconds (default 0 = off / 3600)
MEDIAFORGE_BROWSER_PROFILE / MEDIAFORGE_NO_PERSISTENT_PROFILE Captcha browser profile path / disable the persistent profile
MEDIAFORGE_DISCORD_WEBHOOK Discord webhook fallback when none is configured in the WebUI
MEDIAFORGE_VIDEO_CODEC CLI re-encode codec: copy, h264, h265, av1 (the WebUI has its own encoding settings)
MEDIAFORGE_ANISKIP, MEDIAFORGE_USE_IINA, MEDIAFORGE_RANDOM_ANIME, MEDIAFORGE_USE_STO_SEARCH CLI-only behaviour flags
MEDIAFORGE_SYNCPLAY_HOST / MEDIAFORGE_SYNCPLAY_ROOM / MEDIAFORGE_SYNCPLAY_USERNAME / MEDIAFORGE_SYNCPLAY_PASSWORD Syncplay defaults for CLI runs
MEDIAFORGE_DOCKER Set by the official image; marks a containerised install
MEDIAFORGE_SYNC_MODE / MEDIAFORGE_SYNC_SCHEDULE / MEDIAFORGE_SYNC_TIMES / MEDIAFORGE_SYNC_DAYS Auto-Sync cadence: interval or weekly; interval in hours; times as 06:00,18:00; days as 0,1,2,3,4,5,6 (Mon–Sun). The WebUI writes the same keys.
MEDIAFORGE_SYNC_LANGUAGE / MEDIAFORGE_SYNC_PROVIDER Default language and hoster for jobs created without an explicit choice (e.g. German Dub / VOE)
MEDIAFORGE_SYNC_ERROR_RETRIES / MEDIAFORGE_SYNC_ERROR_RETRY_TIME How often a failed Auto-Sync job is retried and how long to wait in between (5min, 15min, 1h, …)
MEDIAFORGE_SYNC_PATH_UNAVAILABLE_ACTION What to do when a job's target path is gone: skip or pause
MEDIAFORGE_SYNC_ADAPTIVE_ENABLED / MEDIAFORGE_SYNC_ADAPTIVE_PAUSE_AFTER / MEDIAFORGE_SYNC_ADAPTIVE_RETRY_UNIT / MEDIAFORGE_SYNC_ADAPTIVE_RETRY_VALUE Adaptive Auto-Sync: jobs that found nothing new for _PAUSE_AFTER (e.g. 4w) drop to a wider re-check interval until something appears again
MEDIAFORGE_DOWNLOAD_WINDOW_ENABLED / MEDIAFORGE_DOWNLOAD_WINDOW_START / MEDIAFORGE_DOWNLOAD_WINDOW_END Only download inside a time window (e.g. 01:00 to 07:00); outside it the queue waits
MEDIAFORGE_DOWNLOAD_RATE_LIMIT Bandwidth cap in KiB/s for the download queue (0 = unlimited)
MEDIAFORGE_HISTORY_RETENTION_DAYS How long finished downloads stay in the history (default 30)
MEDIAFORGE_MOVIE_SUBFOLDER / MEGAKINO_MOVIE_SUBFOLDER Subfolder for films below the download root
MEDIAFORGE_CAPTCHA_TIMEOUT Seconds to wait for a captcha to be solved before the attempt is aborted
MEDIAFORGE_PERSISTENT_PROFILE / MEDIAFORGE_NO_ADBLOCK / MEDIAFORGE_SPOOF_WEBGL Captcha browser: keep the profile between runs, disable the ad blocker, spoof the WebGL fingerprint
MEDIAFORGE_NEW_HOME_ENABLED 1 = new start page layout
MEDIAFORGE_DEBUG_FORCED 1 = force debug logging regardless of the setting in the WebUI
MEDIAFORGE_CONFIG_DIR Data directory (database, secret key, image cache). Default ~/.mediaforge — set it to run a second instance or a test run against a scratch directory
MEGAKINO_BASE_URL / HANIME_BASE_URL / HANIME_API_BASE / HANIME_SEARCH_URL Base addresses of those two sites, for when a domain moves. HANIME_SEARCH_URL is the one that changes most often — its old host (search.htv-services.com) was shut down entirely. The image proxy derives its allowed poster hosts from this URL's domain, so pointing it at a new backend also permits that backend's CDN.

These are read from the real process environment (Docker -e, docker-compose environment:, a shell export, a systemd unit) — not from a .env file, which is no longer a configuration source. Legacy ANIWORLD_* names still work as a fallback for every variable above.

Everything else is stored in the database and belongs in the WebUI: a value set there wins over the environment, because the database is written back into the process environment on every start.

Other settings areas have dedicated pages: Authentication (SSO/OIDC), Notifications, Integrations (Jellyfin/Plex/Seerr/MediaScan/CineInfo), Encoding and Anime4K Upscaling.

Clone this wiki locally