Skip to main content

Configuration Reference

Default config file location:

  • Linux/macOS: ~/.config/alchemist/config.toml
  • Linux/macOS with XDG: $XDG_CONFIG_HOME/alchemist/config.toml
  • Windows: %APPDATA%\Alchemist\config.toml
  • Override: ALCHEMIST_CONFIG_PATH

[appearance]

FieldTypeDefaultDescription
active_theme_idstringoptionalSaved web UI color theme/profile identifier

[updates]

FieldTypeDefaultDescription
channelstring"stable"Release channel checked by the About dialog and background update task. Valid values: stable, rc, nightly
auto_checkbooltrueCheck the configured channel in the background while the server is running
check_interval_hoursint24Update-check cache interval. Must be between 1 and 168 hours

Only direct Linux/macOS binary installs are eligible for in-app replacement. Docker, Homebrew, AUR, Windows, and source builds return package-manager or manual update guidance instead.

[transcode]

FieldTypeDefaultDescription
size_reduction_thresholdfloat0.3Minimum predicted size reduction required before a transcode is worth doing
min_bpp_thresholdfloat0.1Minimum bits-per-pixel threshold used by the planner to decide whether a file is already efficiently compressed
min_file_size_mbint50Skip files smaller than this size
concurrent_jobsint1Max jobs Alchemist may run at once before engine-mode overrides
threadsint0CPU thread count per job; 0 means automatic
quality_profilestring"balanced"Quality/speed tradeoff preset
output_codecstring"av1"Target codec: av1, hevc, or h264
allow_fallbackbooltrueAllow codec fallback when the requested codec is unavailable
hdr_modestring"preserve"Preserve HDR metadata or tonemap to SDR
tonemap_algorithmstring"hable"HDR tonemapping algorithm
tonemap_peakfloat1000.0Tonemap peak luminance target
tonemap_desatfloat0.2Tonemap desaturation factor
subtitle_modestring"copy"Subtitle handling: copy, burn, extract, or none

[transcode.stream_rules]

FieldTypeDefaultDescription
strip_audio_by_titlelist[]Remove audio tracks whose title contains any configured case-insensitive substring
keep_audio_languageslist[]Keep only audio tracks with matching ISO 639-2 language tags; untagged tracks are kept
keep_only_default_audioboolfalseKeep only the default audio track after other filters run

[hardware]

FieldTypeDefaultDescription
preferred_vendorstringautoPin hardware selection to nvidia, intel, amd, apple, or cpu
device_pathstringoptionalExplicit render node such as /dev/dri/renderD128 on Linux
allow_cpu_fallbackbooltrueAllow fallback to CPU when no supported GPU path succeeds
cpu_presetstring"medium"CPU encoder speed/quality preset
allow_cpu_encodingbooltrueAllow software encoding at all

[scanner]

FieldTypeDefaultDescription
directorieslist[]Library directories to scan
watch_enabledboolfalseEnable realtime watch behavior for configured directories
extra_watch_dirslist[]Extra watch objects with path and is_recursive

[notifications]

FieldTypeDefaultDescription
enabledboolfalseMaster switch for notifications
allow_local_notificationsboolfalseAllow notification targets to point at local/private network addresses. Off by default for SSRF safety
daily_summary_time_localstring"09:00"Global local-time send window for daily summary notifications
quiet_hours_enabledboolfalseSuppress non-critical notifications inside the configured local-time quiet-hours window
quiet_hours_start_localstring"22:00"Quiet-hours start time in HH:MM local time
quiet_hours_end_localstring"08:00"Quiet-hours end time in HH:MM local time
targetslist[]Notification target objects with name, target_type, config_json, events, and enabled

Supported target_type values and required config_json keys:

TargetRequired config_json
discord_webhookwebhook_url
discord_botbot_token, channel_id
gotifyserver_url, app_token
ntfyserver_url, topic; optional access_token
webhookurl; optional auth_token
telegrambot_token, chat_id
emailsmtp_host, from_address, to_addresses

Supported target events: encode.queued, encode.started, encode.completed, encode.failed, scan.completed, engine.idle, disk.space_low, and daily.summary. disk.space_low fires when the disk-space guardrail holds jobs (see min_free_space_gb).

[files]

FieldTypeDefaultDescription
delete_sourceboolfalseDelete the original file after a verified successful transcode
output_extensionstring"mkv"Output file extension
output_suffixstring"-alchemist"Suffix added to the output filename
replace_strategystring"keep"Replace behavior for output collisions
output_rootstringoptionalIf set, Alchemist mirrors the source library directory structure under this root path instead of writing outputs alongside the source files

[schedule]

FieldTypeDefaultDescription
windowslist[]Time window objects; each window has start_time, end_time, and days_of_week

days_of_week uses integers 0-6. The config validator requires at least one day in every window.

[quality]

FieldTypeDefaultDescription
enable_vmafboolfalseRun VMAF scoring after encode
min_vmaf_scorefloat90.0Minimum acceptable VMAF score
revert_on_low_qualitybooltrueRevert the transcode if quality falls below the threshold

[system]

FieldTypeDefaultDescription
monitoring_poll_intervalfloat2.0Poll interval for system monitoring and dashboard resource refresh
conversion_upload_limit_gbint8Maximum allowed upload size for the Convert workflow, in GiB. Must be >= 1. Uploads above this size are rejected before the file is written to disk
conversion_download_retention_hoursint1Hours to retain a completed Convert output after the user downloads it, before the cleanup pass removes the upload and output. Must be between 1 and 24
min_free_space_gbint10Disk-space guardrail. Before starting a job, the engine checks free space on that job's output filesystem; if it is below this many GiB, the engine holds queued jobs (they stay queued and retry) instead of starting an encode that could fill the disk mid-run. The hold and reason are shown in System Status. Set to 0 to disable. Fails open: if free space cannot be determined for a path, the job proceeds
enable_telemetryboolfalseOpt-in anonymous telemetry switch
log_retention_daysint30Log retention period in days
metrics_enabledboolfalseEnable the Prometheus /metrics endpoint
engine_modestring"balanced"Runtime engine mode: background, balanced, or throughput
https_onlyboolfalseAdd HSTS when Alchemist is served behind HTTPS. Do not enable for plain HTTP
trusted_proxieslist[]Explicit reverse proxy IPs whose forwarded headers are trusted. Empty preserves private-range proxy compatibility
arr_path_translationslist[]Optional path prefix mappings for ARR webhook ingestion, each entry { from, to }; longest matching from prefix wins

Example

[transcode]
size_reduction_threshold = 0.3
min_bpp_threshold = 0.1
min_file_size_mb = 50
concurrent_jobs = 1
threads = 0
quality_profile = "balanced"
output_codec = "av1"
allow_fallback = true
hdr_mode = "preserve"
tonemap_algorithm = "hable"
tonemap_peak = 1000.0
tonemap_desat = 0.2
subtitle_mode = "copy"

[transcode.stream_rules]
strip_audio_by_title = ["commentary", "description"]
keep_audio_languages = ["eng"]
keep_only_default_audio = false

[hardware]
preferred_vendor = "intel"
allow_cpu_fallback = true
cpu_preset = "medium"
allow_cpu_encoding = true

[scanner]
directories = ["/media/movies", "/media/tv"]
watch_enabled = true

[files]
delete_source = false
output_extension = "mkv"
output_suffix = "-alchemist"
replace_strategy = "keep"

[quality]
enable_vmaf = false
min_vmaf_score = 90.0
revert_on_low_quality = true

[notifications]
enabled = false
daily_summary_time_local = "09:00"
quiet_hours_enabled = false
quiet_hours_start_local = "22:00"
quiet_hours_end_local = "08:00"

[updates]
channel = "stable"
auto_check = true
check_interval_hours = 24

[system]
monitoring_poll_interval = 2.0
conversion_upload_limit_gb = 8
min_free_space_gb = 10
conversion_download_retention_hours = 1
enable_telemetry = false
log_retention_days = 30
metrics_enabled = false
engine_mode = "balanced"
arr_path_translations = [
{ from = "/container/media", to = "/mnt/media" }
]