A terminal app for Diablo III. It pulls your character straight from Blizzard's API, shows your gear and stats in one place, tells you what is holding your Greater Rift push back, and lets you diff your build against any other player like a git diff.
DANTE Grimward · Barbarian · paragon 2450 · season · GR 130 Max#1234 · US
1 Heroes 2 Overview 3 Gear 4 Audit 5 Ladder 6 Diff
─────────────────────────────────────────────────────────────────────────────────────
╭─────────────────────────────────╮╭──────────────────────────────────────────────────╮
│ OFFENCE ││ SKILLS │
│ Damage 4,500,000 ███ ││ Whirlwind Dust Devils │
│ Crit Chance 48.00% ███ ││ Sprint Marathon │
│ Crit Damage 490.00% ███ ││ │
╰─────────────────────────────────╯╰──────────────────────────────────────────────────╯
One command. It installs Go for you if you do not have it.
./install.shThen run:
danteThat is it. The first launch walks you through setup inside the app.
If you would rather not use the script:
make build && ./danteDante reads your character from Blizzard's official API, so it needs an API client. It is free, instant, and takes about a minute.
- Go to https://develop.battle.net and sign in with your Battle.net account.
- Click Create Client.
- Name it anything. Set Redirect URI to
https://localhost. Leave Service URL blank. - Copy the Client ID and Client Secret.
Dante will ask for both on first launch, along with your BattleTag and region.
It saves them to ~/.config/dante/config.json with owner only permissions.
If you prefer environment variables, dante reads these and they win over the saved file:
export BLIZZARD_CLIENT_ID=...
export BLIZZARD_CLIENT_SECRET=...
export DANTE_BATTLETAG='Name#1234'
export DANTE_REGION=usHeroes lists every character on the account. Seasonal and living characters sort to the top, dead ones to the bottom. Press enter to load one.
Overview is the character sheet. Offence, defence, core stats, resists, your six active skills with runes, your four passives, your three Kanai's Cube powers, and which sets you are wearing. The bars compare each stat to a rough reference value for a strong pushing build, so a short bar means that stat is behind, not that it is small.
Gear is a slot list on the left and full item detail on the right. Every
affix, every gem with its rank, augments, set membership, and flavour text.
Item names are coloured by quality the same way the game colours them. A red
! next to a slot means an empty socket. A green + means the item is
augmented. Follower gear is in the same list, below your own.
Audit is the part that answers "why am I stuck". It runs a set of checks over your build and sorts the results by how much they are costing you. See below for what it looks at.
Ladder pulls the current season leaderboards. Boards for your class are
highlighted. Pick one, and you get the top 100 with their GR level, clear time,
and paragon. Press d on any player to pull their build and diff it against
yours.
Diff compares two builds line by line.
This is the interesting bit. Press b on the Diff tab and type any BattleTag,
or press d on a leaderboard player, and dante fetches their character and
compares it to yours:
── Gear ──────────────────────────────────────────────
Head Leoric's Crown
~ +1,000 Strength → +1,300 Strength (+300)
- Cooldown Reduction 8.0%
+ Area Damage Increased by 20.0%
~ gem: Bane of the Stricken rank 70 → rank 125 (+55)
Ring 1 Convention of Elements
+ Critical Hit Damage Increased by 50.0%
Read it the same way you read a git diff:
-in red is something you have and they do not.+in green is something they have and you do not.~in yellow is the same affix rolled to a different number, with the gap shown.- Grey lines are identical.
It diffs identity, every stat, active skills with runes, passives, Kanai's Cube,
and every gear slot including gems and their ranks. By default it hides lines
that are the same so you only see what actually differs. Press a to show
everything.
The trick that makes this readable is that dante strips the numbers out of an
affix before comparing. So +950 Strength and +1,024 Strength are recognised
as the same affix with a different roll, instead of showing up as one line
removed and one line added.
- Empty sockets, which are free stats you are not taking.
- Slots with no Caldesann's augment.
- Items that do not read as Ancient.
- Missing class main stat on a slot.
- Legendary gems below rank 100, and a louder warning below rank 50.
- Crit chance and crit damage missing from gloves, amulet, and both rings.
- Kanai's Cube slots that are empty.
- Passive skill slots that are empty.
- Set piece counts, so you can see if you are one piece short of a 6 piece bonus.
- Follower slots that are empty, especially the relic slot that keeps them alive.
- Crit chance well below what a pushing build usually wants.
Each finding has a severity and a short explanation of why it matters. The score at the top is a rough single number, not gospel. Use the critical list.
| Key | What it does |
|---|---|
1 to 6 |
Jump to a tab |
tab / shift+tab |
Next or previous tab |
j / k or arrows |
Move up and down |
enter |
Select |
d |
On Ladder, diff against the selected player |
b |
On Diff, type a BattleTag to compare against |
a |
On Diff, show or hide identical lines |
x |
On Diff, clear the comparison |
r |
Refetch everything |
S |
Reopen settings |
? |
Toggle the full key list |
q |
Quit |
The API lags the game. Blizzard caches profile data and only refreshes it
periodically. If you just changed gear and dante shows the old setup, exit to
character select or log out, wait a few minutes, then press r.
Some things are not in the API at all. Dante cannot see your paragon point distribution, your Altar of Rites progress, or the season theme. Those are the two gaps you have to check in game yourself.
Ancient detection is a guess. The API does not expose a clean "is ancient" flag, so dante looks for the word in the item text. Augmented items always report correctly because the augment line says so. A non augmented ancient may be missed.
Profiles have to be public. They are public by default. If a diff target fails to load, that is usually why, or the region is wrong.
Rate limits exist. If you hammer r you will get told to wait. Just wait.
make check # format, vet, and test
make test # tests only
make dump # print every view to the terminal, useful for layout work
make run # build and runLayout is:
main.go entry point
internal/config reading and writing the saved config
internal/blizzard API client, types, leaderboards
internal/audit the build checks
internal/diff the build comparison engine
internal/ui every screen, built on Bubble Tea
The tests cover JSON decoding against realistic API payloads, the diff engine, and rendering every view at both a normal and a tiny terminal size so layout changes cannot silently panic.
If you publish this, change the module line at the top of go.mod to your own
repo path.
Bubble Tea for the app loop, Lip Gloss for the styling, and Bubbles for the text inputs and scrolling panes.
MIT. See LICENSE.
Diablo III is a trademark of Blizzard Entertainment. This project is not affiliated with or endorsed by them.