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.
Built-in GB / GBA / NDS emulator, right in the browser — desktop or phone (fullscreen with touch controls). BYO ROM: your own legally-dumped game loads straight from your browser and never touches the server. Scan a QR from your desktop and keep playing on your phone, same run, no login. Saves resume automatically from the server.
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.
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.
Every runner streams their game to the lobby. Watch friends' runs — and their wipes — live while you play yours.
Locations appear on a map as you play, colored by encounter status. Dupes clause, shiny clause, and hardcore level caps built in.
When a run dies, restart into a fresh numbered attempt. Every past attempt — encounters, graveyard, diary — stays browsable forever.
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:
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. Register your game (BYO ROM: you pick the file, it stays in your browser, the server keeps only a fingerprint) and start attempt #1.
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.
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 a link manager — the lobby creator by default, who can deputize other runners — or from the admin dashboard.
The event that inspired this project — scaled down to your friend group.
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.
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.
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.
A clip-on controller turns the phone experience from touchscreen-passable to genuinely great. These are the ones we'd pick:
The all-rounder: Hall-effect sticks, console-grade grip, USB-C with pass-through charging. Android & iPhone 15+. Find it on Amazon →
Bluetooth, so it fits any phone (older iPhones included) — and the comfiest to hold, with swappable sticks and layouts. Find it on Amazon →
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.
You — and they stay with you. Nuz-Dash ships zero game files, and by default (BYO ROM) the server never stores any either: each runner picks their own legally-dumped ROM (patched hacks included) in their browser, where it boots straight into the emulator without ever uploading. The server keeps only a SHA-256 fingerprint so everyone provably races the same game. Private groups where every runner owns a legal copy can explicitly opt into classic hosted-ROM mode from the admin dashboard — that choice, and its responsibility, belongs to the host.
Everything lives in server/data/ on the host machine as plain JSON plus save states and sprites (and ROM files only if the host explicitly opted into hosted-ROM mode). Back up that folder and you've backed up every run. Runners also get automatic local .srm + .state downloads on every in-game save.
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.
Streamer-safe URL bar. The secret link is only in the address bar for the instant you sign in — it's immediately swapped for a random decoy session URL that works only in that browser, so showing your screen (or a VOD frame of it) never leaks your login.
BYO ROM by default. New servers never store or serve ROM files: each runner supplies their own ROM directly in their browser — it boots into the emulator locally and never touches the server, which keeps only a SHA-256 fingerprint to verify everyone races the same game. Hosting ROMs on the server is an explicit admin opt-in, gated behind a typed confirmation of what that choice means.
Found a security issue? Report it privately to [email protected] instead of a public GitHub issue — see SECURITY.md for the full policy and a hardening checklist for self-hosters.
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.
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.
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.
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.
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.