A Windows system-tray app (WPF, .NET 8) that watches your EverQuest II chat log and alerts you when a group advertises needing a role/class/level one of your characters can fill — or when enough individual LFG players are around to start a new group.
See REQUIREMENTS.md for the full feature set.
- Roster is read from the
*_characters.inifiles in your EQ2 directory (all accounts, including EU). - Class and level come from the Daybreak Census API, cached locally in
%LOCALAPPDATA%\Eq2Lfg, with the class chat channel in*_uisettings.xmlas an offline fallback. Level-ups seen in the log update levels live. - The active chat log (
logs\<Server>\eq2log_<Name>.txt, most recently written) is tailed once per second. Requires in-game chat logging (/log) to be on. - Group ads ("need tank 2 dps CMM") are matched against your enabled characters by class, role, and level (zone abbreviations map to level bands via an editable zone table). Player posts ("52 Warlock LFG") feed a group-opportunity detector that alerts when enough compatible players are looking at once.
- Alerts: in-app list, Windows toast, and/or a chime — all optional, with a per-advertiser cooldown to tame repeat spam.
From a release (recommended): grab a zip from the
Releases page —
self-contained needs nothing installed; framework-dependent is smaller but
needs the .NET 8 Desktop Runtime.
Unzip anywhere and run Eq2Lfg.App.exe (Windows 10 1809+ or Windows 11).
Closing the window minimizes to the tray; use Exit on the tray icon's menu to
quit. Optional: to start it with Windows, put a shortcut to the exe in the
folder that opens when you run shell:startup.
From source:
git clone https://github.com/williajm/eq2_lfg.git
cd eq2_lfg
dotnet publish src/Eq2Lfg.App -c Release -o publish
then run publish\Eq2Lfg.App.exe (needs the
.NET 8 SDK).
Every release is built by the Release workflow
from the pushed v* tag — never on a developer machine. Three ways to check
what you downloaded, from quick to cryptographic:
-
Checksum: compare
Get-FileHash <zip>against the release'sSHA256SUMS.txt. -
Provenance: each zip has a signed build provenance attestation proving GitHub Actions built it from this repo at that tag's commit:
gh attestation verify Eq2Lfg-v1.0.0-win-x64-self-contained.zip -R williajm/eq2_lfg -
In the app: the status bar shows the version and short commit SHA the build was made from (e.g.
v1.0.0 (abc1234)).
Versioning is derived from git tags by MinVer:
tag v1.2.0 and the build is 1.2.0; untagged builds show a -alpha height
suffix so they can never be mistaken for a release.
git tag v1.0.0
git push origin v1.0.0
The workflow tests, publishes both zips, writes SHA256SUMS.txt, attaches
attestations, and creates the GitHub Release with generated notes.
- Turn on chat logging in EQ2: type
/login game. Without it the game never writes the chat log this app tails. - EQ2 directory: auto-detected on first launch. If detection fails, open Settings → EQ2 directory and click Detect or paste the install path.
- Characters: Settings → Available characters lists every character found across your accounts. Untick any account, server, or character you don't want matched.
- Alerts: pick your mix of Windows toasts, chime, and in-app highlights.
- Optional — Census service ID: with many characters, register a free service ID at census.daybreakgames.com and set it in Settings to lift the anonymous API rate limit (see below).
dotnet build Eq2Lfg.sln
dotnet test tests/Eq2Lfg.Core.Tests
- CI (
.github/workflows/ci.yml):dotnet format --verify-no-changes, build with warnings-as-errors, and unit tests on every push/PR. - CodeQL (
codeql.yml): C# security/quality analysis on pushes, PRs, and a weekly schedule. - SonarCloud (
sonarcloud.yml): skips until you finish the one-time setup — sign in at sonarcloud.io with GitHub, import this repo, and add aSONAR_TOKENrepository secret (free for public repos). - Branch protection: PRs into
mainmust pass thebuildandAnalyze (csharp)checks and be up to date withmain.
Anonymous Census API access allows ~10 lookups/minute. The app stays under it (stale-entry-only refreshes, not-found caching, backoff), but if you have many characters you can register a free service ID at census.daybreakgames.com and set it in Settings to lift the limit.
Settings live in %LOCALAPPDATA%\Eq2Lfg\settings.json and are all editable from
the app's Settings view: alert styles, cooldown, level tolerance, EQ2 directory,
the account → server → character availability tree, and the zone table
(zones.json, seeded for EoF-era Wuoshi).
