Multiplatform Elite Dangerous command-and-routine tooling focused on a shared runtime across macOS, Windows, and Linux. The active runtime is live-validated on macOS with Elite running through CrossOver by myself, @NicholasClooney, and the Windows path is now also live-validated by community member CMDR VRYAE. Linux remains unvalidated.
The current operator surface is control_room.py. The project is not a hands-off flight bot; it is a live runtime and routine stack built around journal parsing, bindings lookup, synthetic input, and early workflow automation.
See docs/STATUS.md for the maintained status, validation notes, and next recommended work.
- Start Here
- Control Room Highlights
- Haul Workflow
- Current Surface
- Primary Entrypoints
- Platform Validation
- Galaxy Map Binding Requirement
- Bindings Utility
- Repo Layout
- Docs Map
- Development
- run
uv sync - run
uv run python3 control_room.py - Important Note:
- after you fire off a ship-affecting command, make sure to switch back to Elite Dangerous; EDControlRoom works by sending keyboard input to the game window
- those commands wait
5seconds by default, so you have time to switch back to Elite before the first key press - if you are remotely connected to the shell and do not need that safety pause, use
instantin Control Room to toggle the delay off or back on
Once you have control room up and running:
- use
haulto haul from A <-> B as the main end-to-end workflow - for setup details, platform-specific notes, and more commands, continue to docs/getting-started/quickstart.md
- use docs/operators/control-room.md for day-to-day operation
- use docs/operators/bindings-files.md for
.bindsbackup / restore / preset apply
control_room.pyis the primary operator surfacehaulis the strongest current operator flow and runs the active two-way haul loopreplay/Ctrl-Rreopens recent commands, including haul setups- one saved default haul setup persists across restarts
- Control Room mirrors consumed journal events into
artifacts/control-room.log - after you fire off a ship-affecting command, switch back to Elite while the default
5second launch delay runs instanttoggles that delay on or off for future commands when you are operating from a remote shell session or otherwise do not need the safety pause
Interrupt behavior during haul is haul-aware: the first Ctrl-C or Ctrl-D queues a stop after the current station-1 return sale and before the next buy. A second interrupt cancels immediately.
haul is the strongest current end-to-end routine and the clearest example of what the active runtime is for.
It is built to take the boring bits off the commander: from the moment you drop near a station, it handles the repeatable station-side work for you, including requesting docking, working through station services, buying or selling cargo, refuel and repair steps, setting the route for the next leg, leaving the station, clearing mass lock, and then priming the FSD automatically.
There is no auto-alignment. Instead, once the ship is clear and the drive is primed, EDControlRoom uses TTS to call the commander by title or name and say the ship is ready to jump, which is the cue for commanders to take over for alignment and the next jump.
That makes it directly useful for high-volume A-to-B cargo work such as community goal hauling loops, where the repetitive station-to-station trading cycle is the part worth automating and the commander can stay focused on the parts that still benefit from human attention.
Around that primary flow, the active routine surface also includes dock, undock, jump, buy, sell, and dest.
These are built to be manually exercised against a live Elite session, not left unattended.
What works today:
- shared journal parsing, bindings lookup, and platform input/runtime plumbing across supported targets
- live-validated operator paths on macOS via CrossOver and on Windows via community testing from CMDR VRYAE
- journal-driven
haul,jump,dock,undock,buy,sell, anddestflows - a live Control Room TUI with ship status, activity log, market panel, replay history, saved default haul setup, and repo-local journal-event logging
What is not done:
- the legacy CV-driven align loop is still not ported into the active runtime
uv run python3 control_room.pyuv run python3 run_routine.py --routine haul_loopThis is the two-way haul routine used by Control Room.uv run python3 diagnostics.pyuv run python3 ship_controls.py --action SetSpeedZero --delay-seconds 3uv run python3 bindings_files.pyLists, backs up, restores, and can replace the active.bindsfile from shipped presets.
- macOS: live-validated with Elite running through CrossOver by myself, @NicholasClooney
- Windows: live-validated by community member CMDR VRYAE
- Linux: runtime paths exist, but no live validation yet
The current galaxy-map automation depends on Elite having arrow-key secondary bindings on these four actions:
UI_Up->UpArrowUI_Down->DownArrowUI_Left->LeftArrowUI_Right->RightArrow
Keep your normal primary bindings as needed, but make sure those arrow-key
secondaries are present in the live .binds file. On the current Elite setup,
W/A/S/D pans the galaxy map view, while arrow-key UI_* bindings move the
map/menu cursor. Without those secondary arrow bindings, dest / galaxy-map
automation will not navigate the map menus correctly.
bindings_files.py is the operator helper for .binds file management.
Examples:
uv run python3 bindings_files.py
uv run python3 bindings_files.py backup
uv run python3 bindings_files.py restore
uv run python3 bindings_files.py apply-defaultSee docs/operators/bindings-files.md for the full command surface.
Note: apply-default is implemented and covered by unit tests, but it has not yet been live-validated against a real Elite session. If it does not behave as expected on your setup, please open an issue or report the exact command and resulting file state.
control_room.py,run_routine.py,diagnostics.py,ship_controls.py: active operator and validation entrypointsedap/: active runtime codetools/scratch/: exploratory probes and one-off validation helpersarchive/legacy-windows/: Windows-era behavior reference code, kept for historical context only
- docs/getting-started/quickstart.md Setup plus first commands.
- docs/operators/control-room.md Main operator workflow, haul behavior, replay/history, and interrupt semantics.
- docs/operators/bindings-files.md
.bindsbackup, restore, and shipped preset apply flows. - docs/operators/manual-journal-routine-testing.md Low-level routine validation outside Control Room.
- docs/diagnostics/cli-reference.md
- docs/diagnostics/bindings-reference.md
- docs/README.md
Use the repo uv environment for tests:
uv run python3 -m unittest discover -s testsFor commits, use Conventional Commits.
Examples:
feat: add config loaderrefactor: split platform adapters from autopilot logicdocs: update macos roadmapfix: validate missing journal path
