| .gitignore | ||
| alert_state.json | ||
| config.ini.example | ||
| eve_chat_watcher.py | ||
| eve_combat_watcher.py | ||
| eve_orehold_watcher.py | ||
| install.ps1 | ||
| README.md | ||
| requirements.txt | ||
| setup.ps1 | ||
| start-all.ps1 | ||
| update.py | ||
Eve Retriever ore-hold watcher (runs on Goliath)
Pings me on my phone (ntfy) and with an on-screen toast (Goliath) when my Retriever's ore hold is full, so I stop AFK-mining and unload/compress.
This runs entirely on Goliath (the Windows gaming PC) — Rocky isn't involved, it just reuses the same ntfy push app already on my phone.
Why not just read Eve's log files?
Eve writes (combat) / (notify) lines to Documents\EVE\logs\Gamelogs, but
there is no reliable log line for "ore hold full" — mining-laser auto-deactivation
is a client-side event the established mining bots detect by reading the in-game UI,
not the logs. So this watcher reads the Ore Hold inventory window (OCR mode), or
runs a yield-based countdown (timer mode).
Pick a mode
| OCR mode | Timer mode | |
|---|---|---|
| Accuracy | Reads real fill % | Estimate from yield |
| Setup | Tesseract + one-time --snip |
Just enter your m³/min |
| Fragility | Breaks if you move/close the Ore Hold window or change UI scale | Immune to UI; misses early rock depletion |
| In-game requirement | Keep the Ore Hold window open in a fixed spot | Press Enter when lasers go hot |
Start with timer mode to prove delivery in 2 minutes, switch to OCR for hands-off.
Install (Goliath + Adam's PC)
Prereqs once: git (winget install --id Git.Git -e) and Python 3
(python.org installer, keep "Add to PATH" checked — includes tkinter).
First time — clone and run the single setup/update command:
git clone https://git.armoredarmadillo.com/brockdarnold/eve-watcher.git
cd eve-watcher
python update.py
python eve_orehold_watcher.py --snip # one-time: aim OCR at the Ore Hold bar
(Or the one-liner bootstrap: irm https://git.armoredarmadillo.com/brockdarnold/eve-watcher/raw/branch/main/install.ps1 | iex)
To get updates afterward, just: python update.py — it does git pull, refreshes
deps, and restarts the watchers. Your config.ini (webhook + OCR snip) is gitignored,
so updates never overwrite it. The shared Discord webhook is already prefilled in
config.ini.example; update.py copies it to config.ini on first run.
Manual config (optional)
config.ini is created for you, but you can edit it:
[ntfy] topic→ pick a private string (e.g.eve-retriever-7h2k9). On your phone, open the ntfy app → Add subscription → enter that same topic.- For timer mode: set
[watcher] mode = timerand[timer] yield_m3_per_minto your effective yield (Retriever ≈ 1,000–1,600 m³/min depending on fit/skills). - For OCR mode: install Tesseract (
winget install --id UB-Mannheim.TesseractOCR), then run the region picker (below).
Test delivery
python eve_orehold_watcher.py --test
You should get a phone push and a Windows toast. If the toast fails, check
winotify installed; if the push fails, check the topic matches your phone subscription.
OCR calibration (one time)
In-game, open your Ore Hold so the 12,345 / 22,000 m³ text is visible and parked
in a fixed spot. Then:
python eve_orehold_watcher.py --snip
Drag a tight box around just the current / capacity m³ numbers; it saves the region
to config.ini. (Esc cancels.)
Run it
python eve_orehold_watcher.py
- OCR mode: leave it running; it re-arms after you unload (hold drops below
reset_pct). - Timer mode: press Enter each time you start a fresh hold.
Autostart (optional)
Task Scheduler → Create Task → Trigger At log on → Action: pythonw.exe with argument
<full path>\eve_orehold_watcher.py → Start in: this folder. pythonw runs it without a
console window.
Tuning
All in [watcher] of config.ini: alert_pct (default 95), poll_secs (10),
reset_pct (50), cooldown_secs (120).
Notify a fleetmate (e.g. Adam) → Discord
"Ping Adam to compress when his hold is nearly full" can't be done from ESI — cargo/ore-hold fill is not exposed by any API. The detection has to run on Adam's own PC. So:
- Adam installs this watcher on his machine (
setup.ps1/pip install -r requirements.txt). - In his
config.iniset his ship's hold (Venture ore/gas hold = 5,000 m³),alert_pct = 90, and a[discord] webhook(a webhook for your shared channel) withmention = <@his-id>. - OCR mode:
--sniphis Venture's Ore Hold window. Timer mode: set hisyield_m3_per_min. - When his hold passes 90%, the watcher posts "compress now" to your Discord channel
(and/or his phone if he also sets
[ntfy] topic).
- The watcher fans out to ntfy (phone) + Windows toast + Discord — set any/all.
Combat watcher — rats spawned / being tackled (eve_combat_watcher.py)
EVE has no API for in-space NPCs or being tackled — but it logs combat to disk. This
companion tails Documents/EVE/logs/Gamelogs and alerts (ntfy + toast + Discord) on:
- Incoming damage ("rats?") —
(combat) … from …lines. - ⚠ Tackled / EWAR'd —
(notify)warp-scramble/disrupt/jam/web/neut — top priority, no cooldown (if you can't warp, you need to know instantly).
Run: python eve_combat_watcher.py (--test fires one alert). Reads the same config.ini
([combat] section). Reading the log is legit — it never touches the game. Pair with
in-game Drone Settings = Aggressive so drones auto-engage rats.
Other holds (e.g. Pioneer gas hold)
This watcher is hold-agnostic — it works for any "current / capacity m³" readout.
- Pioneer gas/specialized hold = 8,000 m³. For timer mode, set
[timer] ore_hold_m3 = 8000and your gas yield (Gas Cloud Scoop I = 10 m³ / 30 s = 20 m³/min per scoop; ×2 with Gas Cloud Harvesting II → ~40 m³/min). For OCR mode, just--snipthe Pioneer's Gas Hold window instead of the ore hold. - Keep separate
config.inicopies (one per ship) if you switch between the Retriever and the Pioneer.