Lightweight log triggers for EverQuest Legends — a modern, no-frills take on GINA.
Latest release · Discussions · eqlalerts.com · MIT License
Tails your eqlog_*.txt, matches simple search text (or regex), and fires:
- Text overlays (toasts)
- Countdown timers (with early-end text)
- Optional sound — pick from chime presets (Glass, Ping, Sosumi, …) per trigger
- Voice callouts — DBM-style male/female system voices speaking the trigger line
Legacy GINA binaries in GINA/ are reference only — this app does not wrap them.
| GINA | EQL Alerts |
|---|---|
| Full WPF ribbon UI, GimaLink packages, TTS, multi-overlay behaviors | Thin Tauri app: JSON triggers, one overlay |
| Broad EQ ecosystem | EverQuest Legends log paths only |
.gtp / GamTextTriggers import |
JSON config (GINA import later) |
Same core idea: watch the log → match text → notify.
Play EQ with osxEQL (Wine), and run EQL Alerts as a native Mac app. Auto-detect looks in the Wine prefix:
~/Library/Application Support/osxEQL/prefix/drive_c/users/Public/Daybreak Game Company/Installed Games/EverQuest Legends/Logs/eqlog_*.txt
- Install and run EQ Legends via osxEQL (
/log onin-game) - Install EQL Alerts from the latest
.dmgon Releases (or build locally — see below) - First open: the app isn’t signed by Apple, so macOS Gatekeeper blocks it (“damaged” / “can’t be opened”). Clear quarantine once in Terminal:
xattr -dr com.apple.quarantine "/Applications/EQL Alerts.app"After that it opens normally every time. 4. Click Find log — it should pick up the osxEQL path
Run the app on the Mac host; EQ stays in the Windows VM. The log is read through the mounted C: under /Volumes.
Typical path:
/Volumes/[C] Windows 11.hidden/Users/Public/Daybreak Game Company/Installed Games/EverQuest Legends/Logs/eqlog_*.txt
| Shortcut | Action |
|---|---|
Ctrl/Cmd+Alt+U |
Overlay editable (drag / setup) |
Ctrl/Cmd+Alt+L |
Click-through to the game |
Triggers live in app config as triggers.json:
{
"groups": [
{
"id": "general",
"name": "General",
"enabled": true,
"triggers": [
{
"id": "zoning",
"name": "Zoning",
"enabled": true,
"search": "LOADING, PLEASE WAIT...",
"use_regex": false,
"display_text": "Zoning…",
"timer_seconds": null,
"timer_name": null,
"early_end": [],
"sound": null,
"comments": null
}
]
}
]
}Matching uses the line after [timestamp]. Display tokens: {C} character name, {S} full action text.
npm run tauri:dev(or install from the Mac.dmg/ Windows setup.exe)- Find log (osxEQL Wine path, Parallels
/Volumes, or Windows Legends path) - Click your class chip to arm that set
- Open Overlay
A rebuilt Legends starter loads on first run:
- EQL Essentials — Core / Combat / Danger / Fades always on (spammy triggers inside stay off); Social is opt-in
- Classes — each class under
Classes / …(arm with the class chips) - EQL Raids → Zone → Boss — classic raid targets currently available (Nagafen, Vox, Fear, Hate, Sky, Hole, Kedge)
Everything except Essentials starts disabled. Use Reset starter to replace your library with this pack.
Regenerate from the archived GINA convert with:
python3 scripts/rebuild_eql_starter.pyMany self-buffs that were short classic timers are permanent on Legends (Yaulp I–III, Divine Might/Purpose, Lich, Elemental Armor, Greater Wolf Form, …). The starter pack and GINA import strip those countdown timers so the overlay does not show a fake expiry. List: samples/eql_permanent_buffs.json. Re-apply with:
python3 scripts/eql_compat.py samples/eql_starter.triggers.jsonExisting installs auto-strip these timers once on next launch (eql_compat_permanent_v1). You can still use Reset starter for a clean pack.
Many classic land emotes are zone-visible (X has been poisoned., X yawns., X has been mesmerized.). Without filtering, every nearby caster’s spells light your overlay.
EQL Alerts scopes those to your casts:
| Kind | How |
|---|---|
| Damage Over Time timers | Match You hit <target> … by <Spell> including EQL upgrade ranks (Plague IV) via ensure_eql_disease_dot_timers |
| Crowd Control (mez, etc.) | Land emote only arms if you recently You begin casting that spell (Dazzle still upgrades the shared mesmerize line) |
| Slowed / Maloed warnings | Same cast gate — ignores party Drowsy / other malo lands |
Restart the app after updates so migrations and engine cast-gating apply. Group buff trackers under Buffs / Others stay intentionally shared.
GINA/gina_pack.gtp converts into our trigger model (timers, text/TTS→toast, early-enders). Groups import disabled so you opt in like GINA. Permanent-buff timers are cleared during import.
In the app: Import GINA pack… and choose a .gtp / .json / .xml file. For a clean Legends layout prefer Reset starter over importing the raw classic GINA tree.
CLI (archive rebuild path):
python3 scripts/import_gina_gtp.py GINA/gina_pack.gtp -o samples/gina_pack.triggers.json
python3 scripts/rebuild_eql_starter.pyNotes: Rust regex skips a few GINA patterns that use lookaround/backrefs. GINA Text-to-voice lines become speak and play through native OS TTS (macOS say / Windows SAPI) — Web Speech inside Tauri is unreliable. Optional wav/mp3 paths can go in sound. Permanent-buff timer stripping still runs after import.
GitHub Actions builds a Windows NSIS setup.exe, a Mac Apple Silicon .dmg, and a shared auto-update feed.
- Download the latest
*_x64-setup.exefrom Releases - Run it (current-user install; no admin)
- Find log → Overlay → Ctrl+Alt+L for click-through
- Download the latest
.dmgfrom Releases - Drag EQL Alerts into Applications
- Clear Gatekeeper quarantine (required once — unsigned build):
xattr -dr com.apple.quarantine "/Applications/EQL Alerts.app"- Find log (osxEQL or Parallels) → Overlay → Cmd+Alt+L for click-through
Local Mac package:
npm install
npm run tauri:build:macos
# → src-tauri/target/release/bundle/dmg/*.dmg- Bump versions in
package.json,src-tauri/tauri.conf.json, andsrc-tauri/Cargo.toml - Tag and push:
git tag v0.1.0
git push origin v0.1.0Or: GitHub → Actions → release → Run workflow with v0.1.0.
CI creates a draft release with:
EQL.Alerts_*_x64-setup.exe(Windows)EQL Alerts_*_aarch64.dmg(Mac).sig+latest.jsonfor in-app updates
Then publishes only when Windows + Mac assets exist. In the app: Updates / banner Install update.
| Secret | Purpose |
|---|---|
TAURI_SIGNING_PRIVATE_KEY |
Contents of .tauri-keys/eql-alerts.key (local only; never commit) |
TAURI_SIGNING_PRIVATE_KEY_PASSWORD |
Optional if the key is passwordless |
Feature ideas and questions: use Discussions (Ideas / Q&A). Bugs: open an Issue.
Same lightweight approach as EQL Meter: Tauri 2 + Rust log tail (notify + poll) + React UI.