A small, self-hosted dashboard for Elite Dangerous that an AI assistant can also talk to. It reads the game's journal files on your PC, shows what is going on right now (location, ship, cargo, Powerplay, carrier, materials, a star map), and exposes the same data as tools that Claude Code, any MCP client, or a shell script can call.
This project is vibe coded. I built it with an AI assistant while playing, to test things out in Elite and to have a dashboard I can interact with and call on with AI help. It is not polished software and does not try to be. Anyone is welcome to fork it, mess around with it, rip modules out, add their own, or take it somewhere else entirely. If you find a bug, open an issue with the journal lines around it. If you build a module, open a PR. Nothing fancy.
No accounts, no uploads, no dependencies: Python standard library, one web page, no build step.
The current desktop layout. Screenshots use the bundled sample journals; live market data and personal builds depend on your session.
Switch to the Engineering preset to bring build planning, the wishlist, recipes, and material farming together.
See the mobile layout
Cards stack vertically on narrow screens, keeping commander, location, and ship information readable.
| Module | Dashboard card(s) | AI tools |
|---|---|---|
| journal | Location, Ship, Cargo, Rares at this market, Live feed | get_commander_state |
| carrier | Fleet carrier: owned details or one pinned visitor carrier | get_followed_carrier, pin_fleet_carrier, unpin_fleet_carrier, refresh_followed_carrier |
| powerplay | Power, rank, merits, merits this session, cycle countdown | get_powerplay_status |
| merits | Merits per hour and per activity, worked out from the journal | get_merits_summary |
| combat | Where combat pays merits: contested systems with combat zones, acquisition, undermining, reinforcement | find_combat_systems |
| targets | Powerplay sell-target finder with jump counts, market freshness, and warnings about rares a station will not buy; power comparison | find_sell_targets, compare_powers, get_system_info |
| loop | Rare goods loop that ticks itself from your hold, sorted by distance, with the next stop | get_rares_loop, select_rares_loop |
| materials | Inventory as the game reports it, filterable; where-to-farm hints; a flat per-material wishlist for scripts | get_materials, set_wishlist, get_wishlist, material_sources |
| recipes | Engineering blueprints G1-G5 and experimental effects with materials per grade and which engineers offer them; searchable | list_recipes, get_recipe |
| wishlist | Engineering wishlist: pick a blueprint (from grade X to grade Y), experimental effect, tech broker unlock or material; have/need/short against live inventory; material trader plan for the shortfalls; nearest traders | get_engineering_wishlist, wishlist_add, wishlist_remove, wishlist_options, plan_material_trades, find_material_traders |
| farming | Where to farm: crystal shards, brain trees, Dav's Hope, Jameson, Guardian structures, HGE by state; nearest first, flagged when they cover a wishlist shortfall; map layer | find_farm_sites |
| build | Pin an EDSY or Coriolis build (or SLEF JSON) and measure your ship against it: modules to buy (with credits), blueprints and grades still to roll, effects, every material vs inventory, one click to track it on the wishlist | get_build_progress, pin_build, unpin_build, build_to_wishlist |
| history | Feeds the map | get_travel_history |
| map | Star map: starfield, visited systems coloured by star class, route trail, layers from other modules | get_system_coords |
| core | Header, live connection, layout | get_state, get_recent_events, list_modules, list_tools, health |
Everything updates live over Server-Sent Events the moment the game writes a journal line. Cards can be dragged, resized, hidden, saved as named layouts, or switched between presets (Powerplay, Rares run, Combat, Mining and trade, Engineering, Second screen).
You do not need to own a fleet carrier to use the Fleet carrier card. Choose a carrier from your journal visits and click Pin to follow its last reported system and services. The selection survives restarts. Your journal updates it when you dock, log in aboard, or ride a jump; Spansh reports are checked every five minutes while EliteLab runs. Refresh uses the same five-minute cache. Reports can lag behind movements, so the card shows the source, observation time and last check separately. Offline mode keeps saved observations. Unpin restores the owned-carrier view, if available. Fuel, balance and free capacity are owner-only information. If the card is hidden by your layout preset, enable Fleet carrier in the Layout menu.
Requires Python 3.10 or newer (python.org, tick "Add to PATH").
git clone https://github.com/MaverickArcane/EliteLab.git
cd EliteLab
"Start EliteLab.cmd"
That opens http://localhost:8766. The journal folder is found automatically at %USERPROFILE%\Saved Games\Frontier Developments\Elite Dangerous.
cp .env.example .env # set ELITELAB_JOURNAL_DIR
docker compose up -d --build
Journals are mounted read-only. Wishlists and the selected loop persist in a named volume.
./start.sh --journals "/path/to/Saved Games/Frontier Developments/Elite Dangerous"
With the lab running, open the repo folder in Claude Code. The .mcp.json in the repo registers the elitelab MCP server automatically. Then ask things like:
I want to work on getting materials for an FSD G5 Increased Range roll.
The assistant adds the blueprint to your engineering wishlist, reads your shortfalls, suggests material trader exchanges from your surplus, and tells you where to farm the rest. The Engineering wishlist card shows the same shortfalls going down as you collect.
Any agent with a shell can do the same without MCP:
python -m elitelab tools
python -m elitelab call get_materials only_short=true
python -m elitelab call find_sell_targets min=125 max=165
See docs/AI.md.
| Variable | Default | Meaning |
|---|---|---|
ELITELAB_HOST / ELITELAB_PORT |
127.0.0.1 / 8766 |
Bind address (0.0.0.0 in Docker) |
ELITELAB_JOURNAL_DIR |
Saved Games path, or /journals |
Where the game writes Journal.*.log |
ELITELAB_DATA_DIR |
./data |
Persistent files (wishlist, selected loop) |
ELITELAB_RECENT_JOURNALS |
3 |
Journal files replayed at startup |
ELITELAB_DISABLE |
Comma-separated module names to skip | |
ELITELAB_OFFLINE |
Set to 1 to never call Spansh or EDSM (tests use this) |
|
ELITELAB_URL |
http://127.0.0.1:8766 |
Where the MCP proxy finds the lab |
Bind to 0.0.0.0 to open the dashboard from a tablet on your LAN. There is no auth, so do not expose it to the internet.
game journal --> watcher --> event bus --> modules --> state store --> SSE --> browser cards
|
+--> routes = /api/* = MCP tools
A core (bus, store, services, HTTP, loader, journal watcher) and modules that declare what they require and provide. Modules talk only through the store and the bus. The loader sorts them by dependency and refuses to start on a missing one. Every route registered with a tool name is automatically an MCP tool.
- docs/ARCHITECTURE.md: how the pieces fit
- docs/MODULES.md: how to write a module
- docs/API.md: every endpoint and tool, generated from
/api/schema - docs/AI.md: MCP, shell and HTTP usage for assistants
- ROADMAP.md: what I want to do next
- CONTRIBUTING.md: how to help
python -m unittest discover -s tests -v
Runs offline against a synthetic journal in tests/fixtures/journals. CI runs the same on Linux and Windows, syntax-checks the front end, and builds the Docker image.
EliteLab is small and Powerplay-first. For more complete tools, see:
- EDMarketConnector (https://github.com/EDCD/EDMarketConnector): the standard journal uploader (Inara, EDDN, EDSM) with a plugin API.
- EDDiscovery (https://github.com/EDDiscovery/EDDiscovery): full logbook, 3D galaxy map, materials, carrier panel.
- Odyssey Materials Helper (https://github.com/jixxed/ed-odyssey-materials-helper): blueprint-level materials planning.
- Elite Observatory (https://github.com/Xjph/ObservatoryCore): exploration-focused journal watcher with plugins.
- AI bridges: EDGPT (https://glama.ai/mcp/servers/bnrkhmvp3c) and Elite Dangerous Local AI Tie-In MCP (https://github.com/GWLlosa/elite-dangerous-local-ai-tie-in-mcp).
Spansh (https://spansh.co.uk) for station and system search, EDSM (https://www.edsm.net) for coordinates, and Frontier's Player Journal manual for the format. Elite Dangerous is a trademark of Frontier Developments plc. This project is not affiliated with Frontier.
MIT. See LICENSE.

