Offline Sim Setup Guide
The offline simulator runs the same engine as sim.epoglogs.com on your own machine. No iteration cap, no server queue, no rate limits. Each download is tied to your Discord account and one machine; if you change PCs, you re-bind on the new one (7-day cooldown).
Requirements
- One of: Windows 10/11 (amd64), macOS 12+ (Apple Silicon or Intel), Linux (amd64; glibc 2.31+)
- Modern CPU; a 10,000-iteration run takes ~30 seconds
- An active Discord login on epoglogs.com with sim access (Hunter is free for any logged-in user; Paladin and Rogue require a donor tier)
No Node, no Go, no install steps. The binary is one file.
Quick start (5 minutes)
- Visit /sim-license while logged in.
- Click β¬ Download for your OS on the sim you want to run. Save the file somewhere stable β
C:\Users\<you>\Tools\epoch-sim-paladin.exeon Windows, or~/bin/epoch-sim-paladinon macOS/Linux (thenchmod +xit). - Back on the page, click Activate. A modal pops with a 5-minute one-time token.
- Open a terminal (PowerShell, Terminal, or your favorite). Navigate to the folder with the binary. Then run:
.\epoch-sim-paladin.exe enroll <paste-token>
- Configure a build on the web sim (sim.epoglogs.com/paladin etc), click Export .json, save the file next to the binary.
- Run it:
.\epoch-sim-paladin.exe run my-config.json
Full Paladin walkthrough
Concrete example end-to-end. Same shape works for Hunter and Rogue β just swap paladin for the sim name.
1Configure your build on the web sim
Visit sim.epoglogs.com/paladin/ and configure:
- Talents β pick your spec inside the talent panel
- Gear β slot-by-slot (or paste a profile from the web sim's import)
- Buffs/Consumes β raid buffs, elixirs, food, sharpening stones
- Encounter β boss, duration, target armor
- Iterations β 5,000 is plenty for stable averages
Run a sim once on the web (the Run Sim button) to sanity-check the numbers before exporting.
2Export the config
In the Loadouts row at the top of the page, type a name (e.g. "ony-paladin-burst") into the loadout name field, then click Export .json. Your browser downloads ony-paladin-burst.json. Move it next to the CLI binary.
The exported JSON looks roughly like this (most fields elided):
{
"class": "paladin",
"sim": { "iterations": 5000, "duration_secs": 300 },
"talent_ranks": { "20218": 5, "20335": 5, "20911": 3, ... },
"gear": [
{ "slot": "head", "id": 22422, "enchant": "ZG +Str/+Crit" },
{ "slot": "mainhand", "id": 19019, "enchant": "Crusader" },
...
],
"buffs": { "blessing_of_might": "improved", "windfury_totem": true, ... },
"encounter": { "boss": "atressian", "armor": 4640 }
}
/run, so anything you can configure
in the GUI works in the CLI. You can also hand-edit the file in any text editor β useful for batch
comparison runs (just duplicate the file, change one field, re-run).
3Run the sim
Open PowerShell (or Terminal on macOS/Linux), navigate to the folder, and run:
.\epoch-sim-paladin.exe run ony-paladin-burst.json
Expected output:
[OK] License valid (donor25, 27 days remaining)
[sim] 5000 iterations Γ 300s (seed=1716831204871235000)...
[sim] done in 14.2s
[result] DPS: 2417.8 Β± 91.3 (mean Β± stddev)
[result] Written to ony-paladin-burst-result.json
4Inspect the result
The result JSON lives next to your config:
{
"sim_key": "paladin",
"iterations": 5000,
"duration_secs": 300,
"mean_dps": 2417.8,
"median_dps": 2415.1,
"stddev_dps": 91.3,
"p5_dps": 2273.2,
"p95_dps": 2569.5,
"build_version": "0.1.3"
}
p5 / p95 are the 5th / 95th percentiles β useful for comparing two builds: if one build's p95 doesn't beat another's mean, the "improvement" is noise.
5Iterate
To A/B test two builds:
copy ony-paladin-burst.json ony-paladin-tank-armor.json
# edit the new file to swap one gear slot or talent
.\epoch-sim-paladin.exe run ony-paladin-burst.json --seed 42
.\epoch-sim-paladin.exe run ony-paladin-tank-armor.json --seed 42
Same --seed on both runs eliminates RNG noise from the comparison; the delta you see is purely from the config change.
Subcommands
| Command | Purpose |
|---|---|
enroll <token> | One-time activation. Get the token from /sim-license. |
run <config.json> | Run a sim. Result lands at <config>-result.json. |
status [--verbose] | Show license + hardware fingerprint. --verbose prints (redacted) fingerprint inputs. |
version | Print binary version + sim_key + os/arch. |
Flags for run:
| Flag | Default | Meaning |
|---|---|---|
--iter N | from config, else 1000 | Iteration count |
--duration N | from config, else 300 | Encounter duration (seconds) |
--seed S | time-based | RNG seed. Set to a fixed value for reproducible runs. |
--out PATH | <config>-result.json | Result output path |
Creating sim configs
Use the web sim's Export .json button β it's the canonical path. The JSON is the same shape both the web sim and the CLI consume, so loadouts are freely interchangeable. The web sim's Import .json button reads the same files back, so you can edit a config in your text editor and re-load it on the web sim to see the GUI version.
License lifecycle
Renewal (every 30 days)
When the license expires, the next run prints:
error: license expired.
Get a fresh enrollment token from https://epoglogs.com/sim-license
and run: epoch-sim-paladin enroll <token>
Visit the URL, click Activate / Renew, run enroll again with the new token. Same flow as first-time.
New PC / hardware swap
The hardware fingerprint covers CPU brand, boot disk serial, primary NIC MAC, and machine UUID. Swap any one of those and run refuses with "fingerprint does not match". To re-bind:
- Go to /sim-license on the new machine.
- Click Activate, get a token, run
enrollon the new machine. - The server detects the hardware change. 7-day cooldown per sim β if you rebound within the last week the request is rejected.
The cooldown deters "share with one friend then rebind back" abuse.
Subscription ends / refund
Your existing 30-day token keeps working until expiry β we won't kill in-flight licenses. Renewal will fail at the 30-day mark.
Troubleshooting
"license: too few hardware identifiers (stripped VM?)" β the binary needs at least 2 of: CPU info, boot disk serial, MAC address, machine UUID. Some VMs / sandboxes strip all of these. Run status --verbose to see which sources are present. If you're on bare metal and still hit this, ping me on the Epog Logs Discord with the (redacted) output.
"signature does not verify" β corrupted license file, or you upgraded from a test/staging build to production. Delete ~/.epoch-sim/<sim>.license.jwt and run enroll again.
"sim does not match this binary" β you're trying to use e.g. a Paladin license with a Hunter binary. Each binary has its sim baked in; download the matching one from /sim-license.
connection refused during enroll β server side might be down or your firewall is blocking outbound HTTPS. Retry; if it persists, check epoglogs.com is reachable from your machine.
Antivirus flags the binary β unsigned Windows executables (Go or otherwise) occasionally trigger SmartScreen / Defender heuristics. The binaries contain no malware (the source is at github.com/Defcons/epoch-sim). Add a Windows Security exclusion for the file, or grab the SHA-256 from the download page and report as clean to your AV vendor.
Privacy
- The CLI talks to
epoglogs.comonly duringenrollβ one POST containing your hardware fingerprint hash. - Your sim configs and results stay on your machine. We never see them.
- The fingerprint is a SHA-256 hash. The raw inputs (CPU brand, disk serial, etc.) are never sent β only the hash.
Run status --verbose to see exactly what goes into the hash; the inputs are redacted to first-4 + last-2 chars so you can paste the output anywhere.
Reporting bugs
File issues at github.com/Defcons/epoch-sim/issues with:
- Output of
epoch-sim-<sim> version - Output of
epoch-sim-<sim> status --verbose - The config JSON that triggered it (no fingerprint info is in the config)
- The full error message
Or hop in the Epog Logs Discord.