Skip to content

Run your own online server

blur-online is a Demonware-compatible service for accounts, login, lobby, matchmaking and IP/NAT discovery. Go, standard library only. The project’s own instance is at wss://online.blur.entropylan.party/socket.

Terminal window
cd server && go build -o blur-online .
./blur-online -listen :8080 -key <shared key> -accounts accounts.json -public-ip <server public IPv4>
./blur-online -accounts accounts.json -adduser name:password # optional; players can also create accounts in game
  • TCP -listen: websocket on path /socket. Put a TLS reverse proxy (e.g. Caddy) in front, with websockets on.
  • UDP 3074 and 3075: Demonware IP/NAT discovery. The game expects these fixed ports, so they must reach the host directly. A CDN or HTTP-only proxy in front breaks NAT discovery.
  • The key comes from -key or env BLUR_ONLINE_KEY. -version prints the build.
  • accounts.json holds Tiger password hashes. Keep it private and backed up.
  • Lobbies and logins are in memory; a restart drops them.

Image: git.mintopia.net/mintopia/blur-online:<tag> (develop, main, sha-<short>; release vX.Y.Z also tags X.Y.Z, X.Y, X and latest). server/docker-compose.example.yml runs it with host networking, the key in .env and ./data for accounts.json. server/deploy/ has an Ansible playbook that templates the compose file and starts it.

Terminal window
BLUR_ONLINE_URL=wss://your.host/socket BLUR_ONLINE_KEY=<key> ...

The key must match the server’s. BLUR_ONLINE_URL=off disables online (LAN only). A release build compiles in a default URL and key; see Build from source. Players create an account in game (the licence key field is ignored). BLUR_DWLOG=1 prints Demonware’s own client log, and the server logs every lobby task it doesn’t implement.

The full protocol is in Blur online server: full spec.