Skip to content

Repository files navigation

NuzDex

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.

single file no build step no dependencies roster license

Live demo · Report a bug · Suggest a square


Screenshots

The tracker

The tracker — availability at a glance, with the exact cooldown countdown on every benched Pokémon.

Run bingo (5×5) Daily bingo (3×3)
Run bingo card Daily bingo card
One hard card for the whole Nuzlocke A fresh, easier card every day
Collection Pokémon detail
Collection picker Pokémon detail
Pick the licences you actually own Full stats, both tier ratings, and why a Pokémon is locked

Run summary

End of run — stats, match timeline, roster split, per-class performance, and a shareable PNG.


Why

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.


Features

The tracker

  • 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.

Your collection

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

Bingo

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.

Run summary

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.

Data and sharing

  • 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.

How the rules work

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.


Getting started

Use it online

Open the live demo. Your run is saved in that browser.

Run it locally

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 over http:// is smoother:

python -m http.server 8765

Then open http://127.0.0.1:8765/index.html.

Host your own copy

  1. Fork this repo
  2. Make sure the app is named index.html at the repo root
  3. Settings → Pages → Source: Deploy from a branch → main / root
  4. 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.


Data sources

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.


Privacy

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.


Notes and limitations

  • 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.

Credits

Made by Ezio Aitha and AI 💕

Feedback and ideas:

  • karurosagu — GitHub idea
  • ashsabre — Bingo idea

License

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.

About

Pokémon UNITE Nuzlocke tracker and bingo board. Single HTML file, no build, no server — your run stays in your browser.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages