Shipped defaults live in defaults/*.toml. config.example.toml is an override skeleton. Create a local config.toml only if you want overrides; EDControlRoom auto-loads it when present, and otherwise falls back to shipped defaults plus auto-detection.
When you do create config.toml, keep it minimal:
- Set
paths.journal_dirandpaths.bindings_fileonly if auto-detection is not enough on this machine. - Leave
runtime.platformunset unless you want to make the backend choice explicit in a shared config. When omitted, it defaults to the host OS.
- Make sure Terminal has macOS Accessibility permission, and Screen Recording permission if you plan to use capture-based diagnostics.
- Start Elite Dangerous through CrossOver.
- Install Python 3.12 and
uv. - Run
uv sync. - Start Elite Dangerous.
- Install Python 3.12.
- Create a virtual environment:
python -m venv .venv- Activate it:
.venv\Scripts\activate- Install runtime deps:
pip install -r requirements.txt- Start Elite Dangerous.
- Install Python 3.12 and
uv. - Install
xdotoolif you want synthetic key input support. - Start Elite Dangerous through Steam/Proton.
On Linux, prefer explicit paths.journal_dir and paths.bindings_file only when the built-in Steam Proton probing for app ID 359320 is not enough on this machine.
Minimal example:
[paths]
journal_dir = ""
bindings_file = ""
[tts]
title_mode = "custom"
title = "captain"Linux input is currently implemented through xdotool, so treat it as X11-oriented and verify it locally before relying on routines. Wayland behavior is unverified.
Control Room is the primary operator surface for current routine work, so start there first after installation.
With uv:
uv run python3 control_room.pyIf your Windows shell does not provide python3, use uv run python ... instead.
Without uv:
python control_room.pyFor day-to-day usage, haul behavior, replay/history, and interrupt semantics, see ../operators/control-room.md.
If you want a reusable two-station haul setup in a text file, edit ignored repo-root haul.toml and use haul load in Control Room. See the example in ../operators/control-room.md.
If you want a reusable destination, run home set <system> once in Control Room. If the current system is already known, bare home set also works. Either form writes control_room.home_system into config so later you can route with plain home.
Use these checks only when you need to troubleshoot input, journal detection, or game integration.
With uv:
uv run python3 tools/watch_journal.py
uv run python3 tools/ship_controls.py --action SetSpeedZero --delay-seconds 3If your Windows shell does not provide python3, use uv run python ... instead.
Without uv:
python tools/watch_journal.py
python tools/ship_controls.py --action SetSpeedZero --delay-seconds 3tools/watch_journal.pytails the Elite journal and prints events as they arrive. Run it only while the game is open, otherwise nothing new will appear.tools/ship_controls.py --action SetSpeedZero --delay-seconds 3waits three seconds, then presses the key currently bound to Elite'sSetSpeedZeroaction. Expect your throttle-zero keybind to fire in game.
If journal or bindings auto-detection still looks wrong after that, add explicit paths.journal_dir and paths.bindings_file overrides in config.toml.
uv run python3 tools/run_routine.py --routine jump --delay-seconds 5
uv run python3 tools/run_routine.py --routine dock --delay-seconds 5 --log-events
uv run python3 tools/run_routine.py --routine haul_loophaul_loop is the current two-way haul routine and matches the Control Room haul path.
Windows equivalents:
uv run python tools/run_routine.py --routine jump --delay-seconds 5
python tools/run_routine.py --routine jump --delay-seconds 5Linux equivalent:
uv run python3 tools/run_routine.py --routine jump --delay-seconds 5For current supported manual validation flows, see ../operators/manual-journal-routine-testing.md.
For .binds backup, restore, or shipped preset apply, see ../operators/bindings-files.md.