v1.15.0 - standalone .exe and a settings panel
Download
EQLCompanion.exe — one file, ~59 MB, nothing to install.
Windows will warn you that it does not recognise the publisher: the file is
unsigned (code-signing certificates cost hundreds a year, and this is a free
hobby project). Click More info → Run anyway.
INSTALL.md
walks through it, and shows how to verify the download yourself if you would
rather not take my word for it.
Prefer the source install? install_companion.bat as before — it adds screen-OCR
position tracking on top of everything here.
A standalone .exe — one 59 MB file, nothing to install. Plus a settings
panel, because a downloaded executable has no .env to edit.
Download and run
build_exe.batproducesdist\EQLCompanion.exe: no Python, no Node, no
pip. It finds your game through the Windows registry, opens a native
WebView2 window, and keeps its data in adatafolder beside itself
(or%LOCALAPPDATA%\EQLCompanionwhen that folder is read-only).
~4s first start; everything works except screen OCR — HUD, overlay,
Atlas 3D with textures, timers, alerts, and LLM counsel all included.- The build is now verified rather than theoretical, and finding out how
fixed five defects — four of which were bugs in the source install too:- Optional dependencies could abort startup.
ocr_systemcaught only
ImportError, but a half-present rapidocr raisesFileNotFoundError
when its model manifest is missing, killing the whole app over a
feature that build does not even ship. The guard is deliberately broad
now. - One bad texture cost the whole zone. A failure in the 3D texture
export aborted the entire payload; it degrades to an untextured view. - Helper windows:
/api/overlayran[sys.executable, "-m", ...],
which frozen would boot a second server. Flags now (--overlay). - No console in a windowed build:
sys.stdoutis None and uvicorn's
formatter calls.isatty()on it. Streams adopt a log file, and
pywebview's main-thread requirement moved uvicorn to a worker, so
closing the window shuts down through the normal lifespan. - Paths:
backend/paths.pysplits read-only bundled assets from
writable state, so nothing lands in a temp dir that is wiped on exit.
- Optional dependencies could abort startup.
Settings — the gear in the header
- Game folder with a Test button that reports what it actually found
("3 character log(s)") or what is wrong, and a one-click fill from
registry detection. Saving re-derives the paths and restarts the tailer;
no restart needed. - Advisor model, including an API key field. Providers the running build
cannot support are greyed out rather than silently falling back. - Keys live in
data/secrets.jsonand nowhere else. Never logged
(field names only), never returned to the browser (GET /api/settings
reports booleans), and explicitly gitignored. A key field omitted from a
save is left untouched, so saving a game folder cannot wipe it; an
explicit empty value clears it.
Also
requirements-lite.txtnow lists the LLM clients deliberately.
PyInstaller bundles only what the build machine has installed, so
omitting them produced an exe whose API key field could never work —
depending on who ran the build.- "MCP server not found" was logged on every wiki lookup; said once now.
- README and INSTALL.md cover both installs, including the SmartScreen
warning an unsigned binary raises and how to verify it yourself.