Skip to content

Configuration

Quadstronaut edited this page Jul 28, 2026 · 1 revision

Configuration

Runtime configuration lives in projects/ed-autojump/config.toml. The file is TOML; section headers match the Config dataclass sections in projects/ed-core/src/ed_core/config.py. Any key not present in a file falls back to the code default shown below.

Run from projects/ed-autojump/ so the CLI finds config.toml at its default relative path, or pass --config <path> explicitly.


Merge order (later wins)

The loader layers four sources, each overriding the last:

defaults  ->  config.toml  ->  config.local.toml  ->  .env / ED_AUTOJUMP_* env vars
  • config.toml — the committed, tracked config. The live file already sets [menu_nav].enabled, the calibrated [vision] region, and other machine values.
  • config.local.toml — sits next to config.toml, gitignored. The non-committed place for machine-local overrides — e.g. the operator's [overlay] cv_debug = true. Same TOML shape as config.toml.
  • .env — a KEY=VALUE file next to the config, loaded before env-var overrides. Real environment variables win over .env values. This is where the launcher VISION toggle persists ED_AUTOJUMP_OVERLAY_CV_DEBUG=1.
  • ED_AUTOJUMP_<SECTION>_<KEY> env vars — override a single scalar key. The section and key are upper-cased (ED_AUTOJUMP_VISION_ENABLED, ED_AUTOJUMP_MENU_NAV_KEY_DELAY_MS). Scalar fields only (str/int/float/ bool); tuple/dict fields (regions, profile maps, class overrides) are deliberately env-unreachable — use a TOML layer for those. Booleans accept 1/true/yes/on and 0/false/no/off (anything else raises rather than guessing a behavior).

[ship]

Describes the expected ship for pre-flight sanity checking.

Key Default Description
expected_ship "mandalay" Ship type name (Frontier internal ID)
expected_max_jump_range_ly 31.288 Expected unladen jump range
expected_fuel_capacity_t 32.0 Expected fuel tank capacity in tonnes
required_modules ["int_fuelscoop_*", "int_detailedsurfacescanner_tiny"] Modules the pre-flight expects fitted
required_modules_v2 ["int_dockingcomputer_advanced"] Additional modules for the docking flow

[routing]

Route planning and fuel-safety settings.

Key Default Description
mode "external_spansh" Routing mode; currently only external_spansh is wired
destination "Beagle Point" Target system for Spansh auto-plot (overridable with --destination)
efficiency 60 Spansh routing efficiency (%)
range_margin 0.97 Fraction of jump range to use in route calculations
fuel_safety_threshold 0.20 Minimum fuel fraction before triggering the scoop (also controlled per-step by refuel_below in arrival.toml)
danger_classes white-dwarf / neutron / black-hole / Wolf-Rayet set Star classes the route filter refuses to jump to

The danger-class set (white dwarfs D*, neutron stars N, black holes H, Wolf-Rayets W*, plus AeBe/TTS) has a code default and is overridable as a TOML list. target_next_route checks every hop's FSDTarget.StarClass against it and fails closed if a dangerous star is the next jump — the bot aborts rather than engaging the FSD.


[exploration]

Controls which exploration actions are active.

Key Default Description
honk true Fire the discovery scanner on arrival / startup
fss "off" FSS mode: "off", "keyboard_sweep", or "cv_assisted" — the latter two are framework stubs
dss "off" DSS mode: "off", "high_value_only", or "all" — framework stubs
dss_max_distance_ls 50000.0 DSS body-distance cap (Ls)
dss_per_system_cap 4 Max DSS targets per system
dss_tier_threshold 1 Minimum body tier to DSS
body_tour_enabled false Opt-in in-system body tour (SC-assist orbit each unexplored body between the star orbit and target_next_route). Off = byte-identical to the plain jump loop
body_tour_dwell_s 2.0 Post-AutoScan pacing loiter (sleeper, not a gate)
body_tour_max_bodies 5 Max bodies toured per system
body_tour_max_rows 8 Max nav-list rows scanned
body_tour_orbit_timeout_s 120.0 Per-body backstop (never a success gate)
body_tour_min_bodies 0 Only tour a system whose honk BodyCount >= this (0 = every system)
nav_panel_ocr_enabled false OCR the NAVIGATION panel and pick bodies/target by NAME instead of a blind row walk. Off until a per-ship calibration frame validates the region
nav_panel_region [505, 435, 410, 330] Nav-panel body-name column crop [x, y, w, h] @1920×1080
nav_panel_region_by_ship {} Per-ship nav-panel region override (cockpit geometry shifts per hull); empty = single-ship

The live config.toml currently sets body_tour_enabled = false with wider scan bounds (body_tour_max_bodies = 40, body_tour_max_rows = 60). Body touring is disabled pending an in-game fix — see the comment in config.toml.


[safety]

Safety thresholds and emergency behavior.

Key Default Description
hull_panic_threshold 0.70 Trip the panic switch if hull integrity falls below this fraction
heat_panic_threshold 1.00 Trip the panic switch if heat level reaches this value
heatsink_threshold 0.80 Heat-sink watchdog threshold
no_journal_timeout_s 90.0 Trip panic if no journal event arrives within this window
panic_hotkey "ctrl+alt+p" Global panic hotkey (requires the hotkey extra / keyboard lib)
legal_state_allowed ["Clean", "Allied"] Legal states the bot will fly under
engagement_debounce_timeout_s 30.0 Clear the debounce flag and retry if StartJump does not follow within this many seconds of pressing the FSD

[input]

Key dispatch behavior.

Key Default Description
backend "pydirectinput" Input backend (only pydirectinput, via the pydirectinput-rgx fork, is used)
key_delay_ms 75 Milliseconds between individual key events
pitch_up_default_s 2.0 Default pitch-hold duration for the pitch step

The class_pitch_overrides dict maps star-class codes to pitch-hold durations (used by the pitch_compass step). Defaults cover K/G/F/B/A/O/M/L/T/Y and the danger classes.


[binds]

Controls the bundled preset and automatic swap behavior.

Key Default Description
preset_name "ED-AFK" Name of the preset to install / swap
auto_swap_start_preset true Automatically activate the preset at run start
restore_on_exit true Restore the original StartPreset on clean exit

[hud]

EDHM (Elite Dangerous HUD Mod) detection and HUD override settings.

Key Default Description
edhm_detect true Detect EDHM installation
edhm_preset_to_offer "ED-AFK-CV.json" EDHM preset offered when EDHM is present
graphics_override_fallback true Write GraphicsConfigurationOverride.xml if EDHM is not detected

[eddn]

EDDN (Elite Dangerous Data Network) publisher settings.

Key Default Description
publish true Publish FSS discovery scan events to EDDN
software_name "ED-AFK / ed-autojump" Software name sent in EDDN headers
software_version "0.2.0" Software version string sent in EDDN headers
uploader_id "" EDDN uploader ID (empty = not sent)

[paths]

File system paths. All values support %ENVVAR% expansion.

Key Default Description
journal_dir %USERPROFILE%\Saved Games\Frontier Developments\Elite Dangerous Elite journal directory
binds_dir %LOCALAPPDATA%\Frontier Developments\Elite Dangerous\Options\Bindings Elite bindings directory
log_dir ./logs Bot log output directory
calibration_dir ./calibration Calibration output directory (annotated screenshots)

[launcher]

MinEdLauncher integration.

Key Default Description
mel_path "" Explicit path to MinEdLauncher.exe; empty = auto-detect
default_commander "CmdrOne" Commander used by --launch when --commander is not passed
default_auth "frontier" Auth method: "frontier" or "steam"
default_product "edo" Game edition: "edo" (Odyssey) or "edh4" (Horizons 4.0)
default_group "CmdrFour" Default private group to join after launch
autorun true Pass /autorun to MEL (skip update check)
autoquit true Pass /autoquit to MEL
skip_install_prompt true Pass /skipinstallprompt to MEL
dryrun_timeout_s 10.0 Timeout for the MEL /dryrun pre-flight auth check
launch_timeout_s 120.0 Max wait after MEL spawn for the main menu to appear
menu_audio_sustain_s 2.0 Seconds of continuous audio before treating it as menu music (not the intro cutscene)
post_fileheader_wait_s 10.0 Wait after Fileheader journal event before treating the menu as interactive

[launcher.profiles] — maps commander names to MinEdLauncher .cred profile slugs (defaults CmdrOne→account1CmdrFour→account4):

[launcher.profiles]
CmdrOne      = "account1"
CmdrFour = "account4"

[menu_nav]

Main-menu keyboard navigation (used by --launch after MEL reaches the main menu).

Key Default Description
enabled false Enable menu navigation; must be true for --launch to drive menus
post_main_menu_buffer_s 3.0 Wait after detecting main menu before sending keys
key_delay_ms 250 Delay between arrow-key presses in the menu
load_game_timeout_s 180.0 Max wait for LoadGame journal event after navigation
dismiss_dialogs true Send Space+Escape after main-menu detect (clears update/EULA dialogs)
group_owner_commander "CmdrFour" Commander who owns the private group (skips select-group step for them)
calibration {} Per-commander press counts, populated by calibrate-menu

[menu_nav.calibration.<Commander>] — populated by calibrate-menu:

[menu_nav.calibration.CmdrOne]
continue_key = "space"
pg_nav_direction = "right"
pg_nav_count = 1
group_nav_direction = "down"
group_nav_count = 3

[vision]

Nav-compass alignment settings. Disabled by default until calibrated.

Key Default Description
enabled false Enable compass alignment; set true after calibrating
backend "yolo-onnx" Compass reader backend: "cyan", "yolo-onnx", "ultralytics", or "opencv" (see below)
capture_backend "gdi" Screen capture backend: "gdi" (default) or "dxcam"
model_onnx "" Path to a .onnx compass model; empty = vendored compass.onnx
model_pt "" Path to a .pt compass model; empty = vendored compass.pt
conf_threshold 0.25 Model detection confidence threshold
require_agreement false Require two backends to agree on the dot position
agree_tol 0.2 Agreement tolerance when require_agreement is on
region [0, 0, 0, 0] Screen rect [x, y, w, h] for the compass crop; (0,0,0,0) = uncalibrated (vision stays off)
compass_radius 0.0 Compass disc half-extent in pixels; 0 = derive from crop at read-time
align_tol 0.20 Alignment tolerance — dot within this fraction of centre = aligned
deadzone 0.08 Ignore offsets below this fraction (sub-dot noise suppression)
gain 2.0 Proportional gain for pitch/yaw corrections
min_press_s 0.10 Minimum key-press duration per correction
max_press_s 0.70 Maximum key-press duration per correction
search_press_s 0.2 Press duration used when searching for a lost target
settle_s 1.4 Wait after each key release (ship momentum decay time)
max_iters 40 Max correction iterations per orient_compass call
timeout_s 45.0 Abort alignment after this many seconds
align_samples 7 Reads per measurement; temporal-median spike rejection
widget_ring_alignment true Enable the widget-ring fine alignment pass after coarse orient
widget_crop [360, 200, 1200, 680] Screen rect for the HUD mouse widget (centred on 960,540 @1080p)
widget_ring_on_miss "required" What to do when the widget is not detected (see below)

align_tol note: the live knob is config.toml [vision] align_tol (both the dataclass default and the TOML now agree at 0.20; the operator loosened it 0.12 → 0.20 on 2026-07-11 so the coarse compass hands off to the widget ring sooner — the widget fine-pass owns jump-time precision). The invariant deadzone*sqrt(2) <= align_tol (0.113 ≤ 0.20) still holds.

widget_ring_on_miss — three modes (default is "required"):

  • "required" (default) — the mouse widget is mandatory. If it is not detected at launch, the preflight HALTS loudly and refuses to fly until the operator makes the widget visible and relaunches. Chosen after a live run flew a whole session compass-only (with align_tol loosened, a silent degrade left every FSD engage misaligned).
  • "degrade" — skip the fine pass and jump compass-only; if genuinely off-target the FSD charge aborts and autorecovery fixes it.
  • "fail_closed" — never jump on an unconfirmed fine-orient: the preflight warns and the required fine step fails per jump until the widget is detectable (flies but never jumps).

Backends:

  • "cyan" — validated for this machine; finds the cyan target dot; ring-centered, tolerates head-sway
  • "yolo-onnx" — light path using onnxruntime on the vendored compass.onnx
  • "ultralytics" — heavy path using full PyTorch runtime on compass.pt; opt-in only
  • "opencv" — colour-free shape detector; no model weights; also the always-on fallback

[cv]

Older CV pipeline (not the default path — used when the cv extra is installed and a legacy capture flow is active).

Key Default Description
capture_backend "dxcam-cpp" Screen capture backend for the CV pipeline: "dxcam-cpp" or "gdi"
require_sdr true Reject frames that appear to be HDR (non-SDR pixel values)
require_borderless_windowed true Reject captures that look like the wrong window mode
target_resolution (1920, 1080) Expected screen resolution; frames at other sizes are rejected
ocr_engine "tesseract" OCR backend for the legacy pipeline (the active nav-panel path uses WinRT OCR, no tesseract binary)

Note: [cv] is distinct from [vision]. [vision] controls nav-compass alignment (the active default path); [cv] controls the older capture/OCR pipeline installed with the cv extra.


[nav]

In-system navigation robustness.

Key Default Description
retarget_route_before_engage true Press TargetNextRouteSystem before each engage to lock the next route star deterministically
supercruise_assist false Enable SC-assist via blue-zone throttle (off until the docking/orbit flow lands)
sc_assist_throttle_action "SetSpeed75" Throttle action used to engage SC-assist in blue-zone mode

SC-assist note: Elite Dangerous has no keybind for Supercruise Assist. The bot uses throttle-mode: in ED's right panel / flight settings, set Supercruise Assist to engage on blue-zone throttle. Then sc_assist_throttle_action is pressed with a target locked to engage it.


[overlay]

EDMCOverlay in-game status overlay (cosmetic; fail-soft — a broken overlay never blocks a flight).

Key Default Description
enabled true Enable the overlay
console true Also mirror execution info to the launch terminal (stdout); independent sink from the in-game overlay
host "127.0.0.1" EDMCOverlay TCP server host
port 5010 EDMCOverlay TCP server port
exe_path "" Explicit path to EDMCOverlay.exe; empty = auto-detect
connect_timeout_s 30.0 Wait for an already-running server before attempting to launch it
launch_if_absent true Launch EDMCOverlay.exe if no server is found
launch_settle_s 2.0 Pause after launching EDMCOverlay before reconnecting
launch_connect_timeout_s 10.0 Timeout for post-launch connection
keepalive_s 4.0 Re-send overlay slots this often
x 20 Overlay X position (virtual 1280×1024 overlay coords)
y 40 Overlay Y position
color "yellow" Text colour
size "normal" Text size: "normal" or "large"
ttl 6 Slot TTL in seconds (must be > keepalive_s)
cv_debug false Draw a labeled box over every region a named CV/OCR grabber captures (white look / green hit / red miss). Opt-in
cv_debug_ttl_s 2.0 Flash duration for each CV-debug box

CV debug boxes (cv_debug) are DEFAULT OFF and opt-in. Turn them on via the launcher VISION toggle — which writes ED_AUTOJUMP_OVERLAY_CV_DEBUG=1 into projects/ed-autojump/.env (local, gitignored) — or set cv_debug = true in config.local.toml. A real env var of the same name wins over .env. Fail-soft: with no EDMCOverlay or the overlay disabled, no boxes are drawn. Their on-screen placement uses a screen→overlay transform tuned by calibrate-overlay.

Clone this wiki locally