Skip to content

elite-dangerous-remote-journal-reader

Audience: Agent

Purpose

Hosted web “journal reader” that runs in the user’s browser, reads local Status.json and journal *.log files via the File System Access API, and forwards EliteEvent / Status to the opener window (window.opener) using @howfe/inter-frame-messenger. “Remote” refers to deployment (public URL), not to server-side storage of journals.

Tech stack

  • Quasar 2, Vue 3, TypeScript (ui/)
  • @vueuse/coreuseFileSystemAccess
  • @howfe/inter-frame-messenger, @howfe/elite-dangerous-event-types

Layout

Path Role
ui/src/JournalWatcher.ts Tail journal file, parse lines, dedupe, send elite-event
ui/src/StatusWatcher.ts Parse Status.json, send on timestamp change
ui/src/components/JournalWatchButton.vue, StatusWatchButton.vue Wire InterFrameMessenger(window.opener, …)
docker-compose.yaml Example Traefik + image for edjr.howfe.org

Integration points

  • Opener: typically surface map; must use matching postMessage origins (see IPC.md).
  • User flow: user selects files in the UI; polling ~1s while “watching” is active.

Extension points

  • Parent commands: JournalWatcher / StatusWatcher already listen for Open* / Poll* / Stop* — a parent could send these if the parent’s InterFrameMessenger registers the corresponding send types (surface map currently does not).
  • Copy: App.vue and watch buttons contain user-facing paths for Windows Saved Games folder.

Pitfalls / checks

  • File System Access API — Chromium-style browsers; user must grant permission each visit (as stated in UI).
  • window.opener — if the page is opened without an opener (direct navigation), opener is null; messenger construction may need guards (TODO: Verify current behavior if opener is null).
  • Journal deduplication in JournalWatcher uses eventHistory of raw lines — very long sessions may grow memory unless trimmed.