Race Nuzlockes with your friends.
On your own server.

Nuz-Dash is a self-hosted multiplayer Nuzlocke platform: play in the browser, let the tracker log encounters straight from the game's memory, and watch everyone's runs live — side by side. No accounts. Invite links are all it takes. Inspired by the PointCrow & pChal Nuzlocke Invitational.

🎮

Play anywhere

Built-in GB / GBA / NDS emulator, right in the browser — desktop or phone (fullscreen with touch controls). Scan a QR from your desktop and keep playing on your phone, same run, no login. Saves resume automatically from the server.

📡

Encounter radar

Wild battles are detected from the running game's memory — species, level, shiny — and logged with one click. Works with pokeemerald-expansion hacks, fakemon included.

❤️

Live party sync

Team, HP bars, and faint alerts parsed straight from the battery save. Deaths flow into the tracker with a cause-of-death note. Auto backups on every in-game save.

👀

Watch party

Every runner streams their game to the lobby. Watch friends' runs — and their wipes — live while you play yours.

🗺️

Self-drawing route map

Locations appear on a map as you play, colored by encounter status. Dupes clause, shiny clause, and hardcore level caps built in.

🏁

Attempts & history

When a run dies, restart into a fresh numbered attempt. Every past attempt — encounters, graveyard, diary — stays browsable forever.

Run your own server

Easiest: deploy on Railway — one click, a public URL out of the box, roughly $5/month for a hobby lobby, and your data persists on a volume. Prefer your own hardware? One machine hosts; everyone else just opens a link. Windows, macOS, and Linux:

Install Node.js

Nuz-Dash needs Node.js 20 or newer. Check with:

node --version

Download & build

Grab the source zip from the latest GitHub release and extract it anywhere (or git clone https://github.com/tummyslyunopened/nuz-dash), then in that folder:

npm install
npm run build
npm start

Open http://localhost:4517 — create your lobby and you're the first runner.

Go public with a Cloudflare Tunnel

To let friends join over the internet, install cloudflared (drop the binary into a tools/ folder next to the app, or put it on your PATH). Then open the admin dashboard at http://localhost:4518 — the tunnel panel offers two modes:

Quick — hit Start tunnel and you're public in seconds on a random *.trycloudflare.com URL. Zero setup, but the URL changes every time the tunnel restarts.

Named (recommended) — a permanent address on a domain you manage on Cloudflare. In the tunnel panel: switch to named, enter a tunnel name and your hostname (apex or subdomain, e.g. nuz.example.com), click Login to Cloudflare and approve in the browser, then Create tunnel & route DNS, then Start tunnel. Enable auto-start and your address survives every restart.

Either way, every invite link you copy automatically uses the public address.

Invite your runners

Copy the invite link from your lobby page and send it privately. Each joiner picks a name and gets their own secret link — that link is their login, so it should be treated like a password. Lost links can be regenerated by any lobby member or from the admin dashboard.

Run your own Invitational

The event that inspired this project — scaled down to your friend group.

🏆

The format

Nuz-Dash was inspired by the PointCrow & pChal Nuzlocke Invitational — 16 streamers, 8 teams, one month to survive a hardcore Nuzlocke, and the winning teams battle each other at the end. It's the best spectator format Pokemon has ever had, and nothing about it requires a Twitch audience.

🗓️

Your version

Pick a game or ROM hack, set a deadline, and race: everyone runs the same lobby with hardcore level caps and dupes clause enforced, watches each other live, and mourns each other's graveyards. Survivors bring their hall-of-fame teams to a finale battle — in person, or on Pokemon Showdown with Invitational-style rules.

📚

Resources

The Invitational — the event site and tracker · their ruleset · PointCrow on Twitch · the Nuzlocke challenge's history. Nuz-Dash is a fan project — not affiliated with PointCrow, pChal, or the Invitational.

Play it like a handheld

A clip-on controller turns the phone experience from touchscreen-passable to genuinely great. These are the ones we'd pick:

🎮

GameSir G8 Galileo

The all-rounder: Hall-effect sticks, console-grade grip, USB-C with pass-through charging. Android & iPhone 15+. Find it on Amazon →

🕹️

GameSir G8 Plus

Bluetooth, so it fits any phone (older iPhones included) — and the comfiest to hold, with swappable sticks and layouts. Find it on Amazon →

💸

GameSir X5 Lite

The budget pick: light, portable, still Hall-effect sticks and pass-through charging. Everything a Nuzlocke needs. Find it on Amazon →

As an Amazon Associate, the Nuz-Dash maintainer earns from qualifying purchases made through these links, at no extra cost to you.

FAQ

Where do ROMs come from?

You. Nuz-Dash ships zero game files — each lobby's host uploads their own legally-dumped ROM (patched hacks included). The ROM stays on the host's server and is served only to that lobby's members so everyone races the same game — it's designed for private groups where each runner owns their own copy.

Where is my data stored?

Everything lives in server/data/ on the host machine as plain JSON plus your ROMs, save states, and sprites. Back up that folder and you've backed up every run. Runners also get automatic local .srm + .state downloads on every in-game save.

How does login work with no accounts?

Secret links. Creating or joining a lobby mints a personal URL containing a random token — possession of the link is the identity. Share invite links privately, bookmark your personal link, and rotate it anytime if it leaks.

Which games are supported?

The emulator covers Game Boy, Game Boy Color, Game Boy Advance, and Nintendo DS. Deep integration — encounter radar, live party, auto backups — currently supports Gen 3 (Ruby/Sapphire/Emerald/FireRed/LeafGreen) and hacks built on them, including pokeemerald-expansion-based hacks. The manual tracker supports all 21 mainline games.

I deployed on Railway — where's my URL?

If your instance doesn't show a URL automatically: open your Railway project, click the service, go to Settings → Networking, and hit Generate Domain (accept the suggested port). That's your instance — open it and create your lobby. You only ever do this once.

How big a server does it need? What does it cost?

Tiny — the emulator runs in each player's browser, so the server just relays saves, tracker data, and low-fps stream frames. Railway scales resources automatically and bills actual usage; a hobby lobby typically lands around $5/month. Optionally cap costs under Settings → Deploy → Replica Limits. One rule: keep replicas at 1 — Nuz-Dash is single-instance by design (one volume, one save authority), and multiple replicas will corrupt lobby state.

Can I use my own domain?

Yes — if your domain is on Cloudflare (any plan, including just DNS), the admin dashboard sets up a named tunnel for you: log in once, click "Create tunnel & route DNS", and your instance gets a permanent hostname like nuz.example.com. No port forwarding, no exposed IP, free. If the hostname already has a DNS record, remove it first — the setup won't overwrite existing records.

How do I update?

Download the newest release over your install (or git pull), then npm install && npm run build and restart. Your server/data/ folder is untouched, and data migrations run automatically on boot.