Skip to content

elite-dangerous-surface-map

Audience: Agent

Purpose

3D surface map for Elite Dangerous bodies using OpenGlobus, with commander state, journal-driven galaxy/body updates (via popup journal reader), and external data (SPANSH, EDSM, etc.) through the shared API cache proxy.

Tech stack

  • UI: Quasar 2, Vue 3, TypeScript (ui/)
  • Scripts: npm run dev / npm run build in elite-dangerous-surface-map/ui/
  • Docker: repository root has docker-compose.yaml (see DEPLOYMENT.md).

Key dependencies

Package Role
@howfe/elite-dangerous-event-types Journal/status typing and guards
@howfe/inter-frame-messenger Listen for events from journal reader popup
@openglobus/og Globe / map
axios HTTP (some loaders)

Integration points

Concern Location (under ui/src/)
Open journal popup + subscribe composables/useJournalReader.tshttps://edjr.howfe.org
Feed journal into map / stores logic/readGalaxyDataFromEvents.tsonEliteEvent
Commander / status composables/useCommanderState.tsonStatus
Cached third-party APIs logic/externalDataLoaders/fetchWithCache.tshttps://api-cache.howfe.org (required pattern for community APIs — do not call SPANSH/EDSM/etc. directly; see ARCHITECTURE.md)
Map UI entry pages/MapPage.vue, components/surface-map/

useJournalReader is a singleton (module-level ifm + callback arrays). Multiple imports share the same instance.

Extension points

  • New journal-driven behavior: register in readGalaxyDataFromEvents() with is* guards from event-types.
  • New API sources: add loaders under logic/externalDataLoaders/; use fetchWithCache for consistent caching.
  • Settings: App.vue + useSettings — keys like feed-elite-events, journal-path (URL params) may interact with features.

Pitfalls / checks

  • Hardcoded URLs in useJournalReader.ts and fetchWithCache.ts — break when self-hosting.
  • Popup blockerswindow.open may be blocked; user must allow popups.
  • CORS / mixed content — map and APIs must load in a browser context compatible with your deployment.