Pokémon UNITE Nuzlocke tracker and bingo board. Single HTML file, no build, no server — your run stays in your browser.
Lose a match on a Pokémon and it is gone for the rest of the run. Win on it and it benches for the next 10 matches. NuzDex does the bookkeeping so you can just play.
Live demo · Report a bug · Suggest a square
🌐 Open NuzDex here: https://aithaezio.github.io/NuzDex/
| Run bingo (5×5) | Daily bingo (3×3) |
|---|---|
![]() |
![]() |
| One hard card for the whole Nuzlocke | A fresh, easier card every day |
| Collection | Pokémon detail |
|---|---|
![]() |
![]() |
| Pick the licences you actually own | Full stats, both tier ratings, and why a Pokémon is locked |
A Nuzlocke turns UNITE into a resource-management game. The problem is that tracking it by hand is miserable — you have to remember which Pokémon are dead, which are benched, and how many more matches until each one comes back. Miss one and the run is quietly invalid.
NuzDex keeps that state exactly, and adds a bingo layer so people watching have something to play too.
- Two rules, enforced automatically. Lose on a Pokémon → eliminated permanently. Win on it → benched for the next N matches (10 by default, adjustable).
- Live availability for all 97 Pokémon — available, on cooldown with an exact countdown, or eliminated.
- One-click logging. Pick a Pokémon, hit Win or Loss.
- Rule-break override. Locked Pokémon can still be logged if you tick the override — and the app records that you broke your own rules.
- Full match log with per-match delete. Deleting renumbers everything and recalculates every cooldown, so a mis-click is always fixable.
- Search, class filters, availability filters and six sort modes (availability, name, class, cooldown, tier, most used).
- Random roller that only ever picks from what is actually available.
- Detail view per Pokémon: class, attack style, damage type, difficulty, both tier ratings, stat bars, and links to its Game8 and Unite-DB pages.
Not everyone owns every licence. On first launch NuzDex asks which Pokémon you actually have, and scopes the entire app to them — the grid, the counters, the random roller and every bingo square.
- Bulk actions: Own all, Own none, Invert, plus Own shown / Drop shown that respect the current filter
- Search and class filters inside the picker
- Pokémon already in your match log are locked as owned, so their history can never be stranded
- Editable any time from My Pokemon
Two boards, each with its own job.
| Daily 3×3 | Run 5×5 | |
|---|---|---|
| Refreshes | Every day | Only on a new run |
| Difficulty | Easy — winnable in a session | Hard — meant to last the whole Nuzlocke |
| Free square | No (all 9 must be earned) | Yes, centre |
- 152 squares across five categories: Nuzlocke events, in-match feats, objectives, tilt/teammates, and streamer moments.
- Two voices. Choose Player or Viewer and every square is reworded — "Misclick your Unite move" vs "Streamer misclicks the Unite move". Some squares are exclusive to one audience.
- 24 squares mark themselves from your match log — debut a Pokémon, bring one back off cooldown, win the comeback match, win with all five classes, break your own rules, and more. The rest you tick by hand.
- Every bingo pattern: 12 lines (rows, columns, diagonals), Four Corners, Plus, Double X, and Blackout — all scored, all with escalating celebrations.
- Season objectives are settings, not hardcoded squares. Set the centre, top and bottom bosses and every objective square renames itself live on both cards.
- Share a card as a code so viewers play the exact same board.
- Cards are balanced by construction — enforced category minimums and a fixed difficulty budget per board.
Runs end. NuzDex notices.
- Loss fires automatically on a genuine dead end. The primary rule is a deadlock, not bad luck: cooldowns only tick down when you play a match, so with zero Pokémon available nothing can ever come back. That condition is always on.
- Optional conditions you can toggle in Rules — full roster wipe, 75% eliminated, five straight losses; and for wins, reach 30 wins, ten in a row, or a flawless 25.
- Declare a win yourself with the Won the Run! button.
- Both windows show stats, a match-by-match timeline, a survivors/fallen split, per-class matches and win rate, a most-used table, and the fallen list — plus a rotating message.
- Export a shareable PNG of the run — drawn on a canvas, so it always works.
- Bundled roster of all 97 Pokémon with classes, official class colours, tiers, difficulty, stat ratings and artwork.
- Refresh Roster pulls the current roster live from Game8 and Unite-DB, shows you a diff, and only applies it when you say so.
- Export / Import the whole run as JSON — matches, collection, bingo cards and their marks, objectives, settings, and the run outcome.
- Everything is stored locally in your browser. No account, no server, no telemetry.
Match #1 Win with Pikachu → Pikachu benched for matches #2–#11
Match #2 Loss with Snorlax → Snorlax eliminated, permanently
...
Match #12 Pikachu available again
A Pokémon with any loss is out forever, even if it also has wins. Cooldown length is configurable in Rules and recalculates the whole log when changed.
Open the live demo. Your run is saved in that browser.
Download index.html and open it. That is the whole install.
One caveat when opening the file directly: browsers block cross-origin requests from
file://, so the Refresh Roster button falls back to a JSONP path for the Game8 data. It works, but serving the file overhttp://is smoother:python -m http.server 8765Then open http://127.0.0.1:8765/index.html.
- Fork this repo
- Make sure the app is named
index.htmlat the repo root - Settings → Pages → Source: Deploy from a branch →
main/root - It goes live at
https://YOUR-USERNAME.github.io/nuzdex/
Serving over HTTPS also means roster refresh uses the direct path rather than the fallback.
| Source | Provides |
|---|---|
| Game8 — Pokémon UNITE roster | Roster, classes, class colours, artwork, tiers, stat ratings |
| Unite-DB | Roles, attack range, difficulty and its own tier list |
Both are fetched live by the Refresh Roster button; the bundled data is a snapshot so the app works offline.
Everything lives in your browser's localStorage. Nothing is uploaded, and there is no analytics of any kind. The only outbound requests are Pokémon artwork, Google Fonts, and the two data sources above when you press Refresh.
Clearing your browser's site data wipes your run — use Export for backups.
- Pokémon artwork is hotlinked from Game8 rather than bundled, so images need a connection and depend on Game8 continuing to serve them.
- Bingo squares that are not derived from the match log are ticked manually — NuzDex cannot see your actual games.
- Shared bingo cards are a snapshot, not a live session; there is no server syncing two people's boards.
Made by Ezio Aitha and AI 💕
Feedback and ideas:
- karurosagu — GitHub idea
- ashsabre — Bingo idea
The NuzDex source is released under the Apache License 2.0 — see LICENSE.
Pokémon UNITE is © Nintendo / The Pokémon Company / TiMi Studio Group. This is an unofficial fan project, not affiliated with or endorsed by them. Pokémon names, artwork and game data belong to their respective owners; roster data and images are sourced from Game8 and Unite-DB as credited above.





