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/core—useFileSystemAccess@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
postMessageorigins (see IPC.md). - User flow: user selects files in the UI; polling ~1s while “watching” is active.
Extension points¶
- Parent commands:
JournalWatcher/StatusWatcheralready listen forOpen*/Poll*/Stop*— a parent could send these if the parent’sInterFrameMessengerregisters the corresponding send types (surface map currently does not). - Copy:
App.vueand 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),openerisnull; messenger construction may need guards (TODO: Verify current behavior ifopeneris null).- Journal deduplication in
JournalWatcheruseseventHistoryof raw lines — very long sessions may grow memory unless trimmed.
Related docs¶
- IPC.md — protocol
- elite-dangerous-surface-map.md — consumer