-
Notifications
You must be signed in to change notification settings - Fork 2
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/.envstill 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.

| 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) |
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 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.
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
SxxExxmarker 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.
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/deu → deu, 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.
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).
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 |
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> |
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).
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.
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 |
| 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 |
0min–5min
|
| Adaptive Auto-Sync | sync_adaptive_enabled |
0 |
0 / 1
|
| ↳ Pause after | sync_adaptive_pause_after |
4w |
2w–8w (weeks without a new episode) |
| ↳ Retry after (value) | sync_adaptive_retry_value |
2 |
2–12
|
| ↳ 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.
| 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.
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.
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.
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 |
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).
| 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 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.
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.
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.
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.
🇬🇧 English
Users
- Installation
- Getting Started
- Migration from AniWorld
- Configuration
- Web UI
- Download System
- Download History
- AutoSync
- Calendar
- Library
- Authentication
- Notifications
- Integrations
- SyncPlay
- Anime4K Upscaling
- Encoding
- Modules
- Theme Packs
- Backup
- Docker
- Supported Sites
Developers
🇩🇪 Deutsch
Benutzer
- Installation
- Erste Schritte
- Umzug von AniWorld
- Konfiguration
- Web-UI
- Download-System
- Download-Verlauf
- AutoSync
- Kalender
- Bibliothek
- Authentifizierung
- Benachrichtigungen
- Integrationen
- SyncPlay
- Anime4K-Upscaling
- Encoding
- Module
- Theme-Pakete
- Backup
- Docker
- Unterstützte Seiten
Entwickler