Skip to content

Releases: EKirschmann/WarCounsel

v2.1.0

Choose a tag to compare

@github-actions github-actions released this 27 Jul 21:55

Mac and Linux. Neither has a native EQL client, so people play under
Wine — CrossOver, Whisky or osxEQL on a Mac; Lutris, Bottles or plain
Wine on Linux. From the host side a bottle is just a folder, so the
combat log is a normal file and the tailer reads it directly.

The game folder is found automatically across all of those layouts, and
start_companion.sh runs the app on both platforms. The overlay and
screen-OCR stay Windows-only; play windowed with the browser beside the
game. Everything else is the same build.

Untested on real hardware — verified against each bottle layout by
construction, then confirmed end to end on a real Ubuntu 25.10 box: the
probe found a bottle on a case-sensitive filesystem, the backend booted
and tailed a log, and the UI built and served. If yours is not found, an
issue with the path fixes it.

New Sebilis Expedition draws its map now. v2.0.1 left it unmapped
rather than guess, since its name suggests the Kunark dungeon but it is
an EQL-only Iksar city. It turns out to ship its own assets —
newsebexp.s3d and newsebexp.txt — so the 3D view works out of the
box, and the chart now ships with WarCounsel itself, so the 2D view
works with no setup. Every zone name in a 90MB log now resolves.

v2.0.1 - zones that never drew a map, and an overlay you choose

Choose a tag to compare

@github-actions github-actions released this 26 Jul 17:44

Zones that never drew a map. An audit of every "You have entered"
name in a real 90MB log found 9 of 38 resolved to nothing — the panel
just showed blank, with no error. Fixed: Temple of Cazic-Thule, the
Karana plains under their EQL names, and the Estate of Unrest — whose
alias pointed at a key that did not exist and so suppressed the direct
hit that would otherwise have worked. 8 of the 9 now resolve, in both
the 2D chart and the 3D view.

The ninth, New Sebilis Expedition, is deliberately left unmapped. It is
not the Kunark dungeon its name suggests but an EQL-only Iksar
underground city off The Northern Desert of Ro, so the obvious mapping
would have drawn a level 40-60 dungeon for a starting city. No map
beats the wrong map.

EQL's <Zone> Expedition wrapper is now stripped like a difficulty
suffix, so future instanced zones resolve without a code change, and an
unresolved zone logs itself once instead of failing silently.

The overlay shows what you choose. Every section switches off, and
every field inside one — keep the kill count, drop the coin; keep
cooldowns, drop the buffs you refreshed. Presets: Everything, Combat
focus, Meter only. Changes reach a running overlay in about half a
second. Timers are now depleting tracks coloured by kind, and an
expiring one washes the whole row red.

Settings no longer steals the caret. The panel re-focused the game
folder several times a second, so clicking anything else bounced you
back to the path field.

Advisor corrections. Pet weapons were ranked by damage/delay ratio;
pets keep their own attack delay, so ratio means nothing to them — a
weapon's damage counts only when it beats the pet's innate hit, while
procs apply either way. AA counsel now prefers General/Archetype ranks
(bought once, kept in every combo) and never spends points on
achievement-granted ones.

Zone names link to the wiki from the leveling chart and the hunting
picks. The gear-farm list links to a wiki search instead, because
those names are not gated against the zone table.

Three parsing gaps, found by reading two other EQL tools. EQL prints
<mob> staggers. when a stun lands — about 14,000 times in a 90MB log,
and we parsed none of it. Abilities now carry a stagger count, credited
only when the staggered target matches the one we just hit (roughly half
of them are other players' strikes and stay uncredited). Mez application
is tracked, pairing with the fade we already had. And the trailing tags
beyond Critical — Slay Undead, Finishing Blow, Crippling Blow — are kept
as per-ability counts instead of being collapsed into a crit flag.

The hunting table now ships with the app. Previously fetched live
only; when that failed the location verifier silently switched off and
passed unchecked zone picks through. A packaged .exe with no network hit
that on every consult.

v2.0.0 — EQL Companion is now WarCounsel

Choose a tag to compare

@EKirschmann EKirschmann released this 25 Jul 18:31

Download

WarCounsel.exe — one file, nothing to install. A .sha256 is published beside it.

Windows will warn you it does not recognise the publisher (the file is unsigned): More infoRun anyway. Install guide.

Coming from EQL Companion? Drop WarCounsel.exe in the same folder as the old EQLCompanion.exe — it picks up your existing data folder, so sessions, settings and mined maps all carry over. Then delete the old exe and remake any desktop shortcut.


Renamed, in time for EverQuest Legends' launch on July 28.

"Companion" is the most crowded word in this corner of GitHub, and it
undersold what this actually is. War is the live combat half — DPS meter,
overlay, encounter breakdowns, the War Ledger, drop tracking. Counsel is
the advisor — wiki-grounded loadouts, gear recommendations, exaltation
tracking, one-click spell-set writing. Nothing else in this space does both,
and now the name says so.

What this means for you

  • The download is now WarCounsel.exe. Put it in the same folder as the
    old one and it picks up your existing data folder automatically — every
    session, setting and mined map survives. Then delete EQLCompanion.exe.
  • Any desktop shortcut needs remaking, since the filename changed. This
    is the one-off cost of the rename, and the reason it is happening before
    launch rather than after.
  • If your data lived in %LOCALAPPDATA% (the case when the .exe sits
    somewhere Windows will not let programs write), it stays exactly where it
    is. The app looks for the old folder and keeps using it rather than
    starting empty — nothing is moved, so nothing can be half-moved.
  • The old GitHub URL still works. GitHub redirects it, including clones
    and the update check.

Also in this release

  • A real icon. The executable had none, and no version resource either —
    Properties → Details was blank. It now carries an icon at seven sizes and
    reports its version, product name and description, which is what Windows,
    antivirus and support all read.
  • Build actions updated off the deprecated Node 20 runtime.

v1.16.0 - comparable group numbers, recovered heals, overlay tray + hotkeys

Choose a tag to compare

@EKirschmann EKirschmann released this 25 Jul 16:29

Download

EQLCompanion.exe — one file, ~42 MB, nothing to install. A .sha256 is published beside it.

Windows will warn you it does not recognise the publisher (the file is unsigned): More infoRun anyway. Install guide.

Upgrading? Replace the .exe — your data folder beside it is untouched.


Group numbers you can compare. An ally's pet used to fold into its
owner's damage row, while your own pet is shown apart from "You". So this
app's view of a groupmate was them plus their pet, while that groupmate's
own copy split the two — for any pet class the two readouts could never
agree. Since comparing figures with someone else running the same tool is a
main reason to have it open in a group, an ally's pet now gets its own row
and the numbers reconcile.

Heals that were never counted. Two forms were silently dropped: heals
logged without a trailing by <Spell> (common for direct heals), and
healers whose names are not player-shaped — mobs, with lowercase multi-word
names. On the 90MB log this project is developed against, other_heal went
from 26,730 to 45,638 events. Roughly nineteen thousand heals were
happening and never counted, most of them mobs healing themselves, which is
frequently the reason a fight is not ending. Unattributed heals still count;
they group under a "Direct heal" row instead of a spell name.

Third-person casts. "A froglok novice begins casting Inner Fire." is the
only warning before a mob lands something, and only your own casts were
parsed before. First person is "begin" and third is "begins", so the two
cannot collide. They appear in the ledger and per-encounter, so you can see
what is being cast at you and by whom. The vendored test fixture gained 14
events from this alone.

Overlay: a tray icon and global hotkeys. The overlay has no title bar
and is click-through most of the time, so once hidden — or dragged
off-screen — there was nothing left to click, and every control needed a
window that is never focused while you play.

Keys Does
Ctrl+Alt+O show / hide
Ctrl+Alt+C compact mode
Ctrl+Alt+↑ / ↓ opacity
Ctrl+Alt+X force interactive (no Scroll Lock needed)

The tray icon offers the same plus Reset position, the rescue for an
overlay dragged off the edge. Windows 11 tucks new tray icons into the ^
overflow until you drag one out.

Also

  • The release build now self-checks the overlay's own dependencies. The
    overlay is a child process the server smoke test never reaches and its
    tray fails soft, so a missing packaged import would have shipped silently
    — the way the spell-line table did in 1.15.1.

v1.15.2 - bundle the spell-line table into the .exe

Choose a tag to compare

@EKirschmann EKirschmann released this 25 Jul 06:23

Download

EQLCompanion.exe — one file, ~42 MB, nothing to install. A .sha256 is published beside it.

Windows will warn you it does not recognise the publisher (the file is unsigned): More infoRun anyway. Install guide.

If you took v1.15.1, please replace it — the buff-stacking check it advertised was silently inactive in that .exe. Your data folder is untouched.


Fixes v1.15.1's headline feature in the build most people actually download.

  • The spell-line table was never bundled into the .exe. PyInstaller's
    --collect-submodules gathers Python modules; a .json sitting beside
    them is not code and has to be declared. So backend/spell_lines.json was
    missing from the packaged build, and because a missing data file fails
    soft by design, the buff-slot stacking gate silently did nothing there.
    Source installs were unaffected. Now declared in both build_exe.bat and
    the release workflow.
  • The release build now asserts its own data arrived. The smoke test
    already proved the exe boots; it now also checks the spell-line count is
    non-zero, so a bundled file that goes missing fails the build instead of
    shipping a feature that quietly does nothing. GET /api/settings reports
    the counts under data.
  • Corrected the download size in the docs: a clean-runner build is ~42 MB,
    not the ~59 MB a developer machine produced.

v1.15.1 - buff-slot stacking gate

Choose a tag to compare

@EKirschmann EKirschmann released this 25 Jul 06:15

Download

EQLCompanion.exe — one file, ~59 MB, nothing to install. A .sha256 is published beside it.

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 infoRun anyway. INSTALL.md walks through it, and shows how to verify the download yourself.

Upgrading from 1.15.0? Replace the .exe; your data folder beside it is untouched.


The advisor now knows about buff slots. EverQuest buffs occupy effect
slots, and two spells in the same slot do not add — the second overwrites
the first. So a loadout holding both Center and Bravery (both ac-slot-1)
had quietly spent a gem on nothing, and the existing supersession check
could not see it: it reasons from effect ids and magnitudes, and slot
occupancy is not in that data.

  • _gate_stacking keeps the strongest spell per slot — curated lines run
    weakest to strongest, and the strongest is what you end up with whatever
    order you cast in. It runs across must_have + should_have together (they
    are one slot fill) and before the promote step, so a freed gem refills
    from the alternatives; the promote loop skips anything that would recreate
    the clash.
  • Prebuffs get the same gate. Long-duration buffs are the worst place to
    stack two of a slot, because the second cast silently throws away the
    first one's mana and remaining duration.
  • Data is rari/eqlfinest's hand-curated spell lines (CC0, from the same
    author as the routing data already used here), vendored as
    backend/spell_lines.json — 112 lines over 344 spells. Coverage is
    partial against the client's ~66,000 spell records, so a spell that is not
    in the table is never dropped: absence of data is not evidence that two
    buffs are compatible.

"Nothing is happening" now says which nothing. The app reads the game's
own eqclient.ini to tell apart two states that look identical from the
outside — logging was never switched on (you need to type /log on) versus
logging is on but nothing has happened yet (just play). If the game is
running and its Log= setting is off, the hint is promoted to a banner
rather than sitting in the quiet advisory line, because in that state
nothing you do is being recorded at all. It fires even when an old log file
exists, which is the case that used to be silently misleading.

This is a read-only check, deliberately. Other companions set Log=1
themselves so the step disappears; this one will not write to a game file it
was not asked to write to.

Also

  • The MCP setup instructions pointed at a different project that happens to
    share the name everquest-legends-mcp. It has no tags and no eqlbuilds
    data, so following them left every spell/AA unlock level falling back to
    the wiki. Now points at ArtSabintsev's, the one actually in use.
  • Recorded that the loot-filter action codes are only half confirmed: 4=sell
    is provable from the log and 3=merge is agreed, but a dedicated editor for
    those files documents 1 and 2 the other way round. Only a display label is
    affected, and it is flagged rather than guessed at.
  • Repo now has a description and topics, and releases are built by CI on a
    clean runner rather than a laptop.

v1.15.0 - standalone .exe and a settings panel

Choose a tag to compare

@EKirschmann EKirschmann released this 25 Jul 04:29

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 infoRun 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.bat produces dist\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 a data folder beside itself
    (or %LOCALAPPDATA%\EQLCompanion when 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_system caught only
      ImportError, but a half-present rapidocr raises FileNotFoundError
      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/overlay ran [sys.executable, "-m", ...],
      which frozen would boot a second server. Flags now (--overlay).
    • No console in a windowed build: sys.stdout is 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.py splits read-only bundled assets from
      writable state, so nothing lands in a temp dir that is wiped on exit.

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.json and 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.txt now 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.