You are born to die. Only skill decides when.
A top-down 2D real-time sandbox MMORPG: permadeath, full-loot, PvP-driven survival. The server is fully authoritative; the client only sends input and renders state.
This repository currently contains the Walking Skeleton (M0) — the thinnest end-to-end vertical slice. See docs/MVP_ROADMAP.md for the full phased plan toward the MVP.
“Run like you’ve got another life — you don’t.”
- Register / log in with email + password (HTTP, returns a JWT).
- Create a character (one active character per account).
- Connect to the world over WebSocket and move freely (velocity-based).
- See other connected players move in real time.
- Server-authoritative position: the client sends only an input direction; the server integrates positions on a fixed tick and broadcasts snapshots.
- Hotbar (keys 1–9, 0), interactables (click or E), remember-me login.
| Layer | Technology | Language |
|---|---|---|
| Client | MonoGame 3.8 (DesktopGL), .NET 8 | C# |
| Server | Go monolith, WebSocket, fixed-tick loop | Go |
| Database | PostgreSQL (pgx) | SQL |
| Infra | Docker + Docker Compose | — |
The client is C# — all gameplay UI, rendering, and networking are plain C# classes (no scene editor). The server is Go.
server/ Go authoritative game server
client/
Deathborn.Client.sln
Deathborn.Client/ MonoGame C# client
Net/GameClient.cs HTTP auth + WebSocket
Screens/ Login, CharacterCreate, World
Game/ players, interactables, hotbar
docs/MVP_ROADMAP.md phased roadmap toward full MVP
Taskfile.yml task runner (server + client commands)
task up
# or: docker compose up --build -dPostgreSQL + Go server start on http://localhost:8080. Migrations run on startup.
task db
task devcurl -s -X POST localhost:8080/register \
-H 'Content-Type: application/json' \
-d '{"email":"a@b.com","password":"hunter2"}'Requires .NET 8 SDK.
- Start local dev (database + server + client):
task devOr run backend and frontend in separate terminals:
task dev:server # terminal 1
task dev:client # terminal 2For Docker-only server (no local client): task up
- Register or log in, create a character, enter the world.
- WASD to move, E or click to interact, 1–9 / 0 for hotbar.
- Multiplayer: run a second client instance with another account.
Check Remember email and password on the login screen to pre-fill credentials on the next launch.
Server URL: local 127.0.0.1:8080 when a dev server is running, otherwise production — see Server URL below and client/README.md.
See client/README.md for client-specific details.
Build a self-contained release and package it for friends. You only need the .NET SDK on your machine — friends do not need .NET installed.
| Platform | Command | Output | Friends run |
|---|---|---|---|
| This OS | task client:package |
Windows installer / Linux tar.gz / macOS dmg | See below |
| Windows | task client:installer |
dist/Deathborn-*-win-x64-Setup.exe |
Double-click Setup |
| Windows (zip) | task client:publish:win |
dist/Deathborn-*-win-x64.zip |
Unzip, run Deathborn.Client.exe |
| Linux | task client:package:linux |
dist/Deathborn-*-linux-x64.tar.gz |
tar -xzf … && ./install.sh |
| macOS | task client:package:mac |
dist/Deathborn-*-osx-*.dmg |
Open dmg, drag to Applications |
| Win + Linux | task client:publish:all |
Both zips | — |
One linux-x64 build runs on Ubuntu, Fedora, Arch, Mint, Steam Deck desktop mode, etc. (glibc-based 64-bit). macOS needs a separate Apple Silicon (osx-arm64) vs Intel (osx-x64) build — use task client:publish:mac on the Mac you have, or cut a GitHub release for both.
- .NET 8 SDK
- Task
- Windows installer: Inno Setup 6 —
winget install JRSoftware.InnoSetup - macOS .dmg: must run
task client:package:macon a Mac (or use CI)
task client:installer
# or: task client:package (on Windows)Output: dist/Deathborn-<version>-win-x64-Setup.exe
Send friends only that Setup.exe. Adds Start Menu + desktop shortcut + uninstaller.
task client:publish:winOutput: dist/Deathborn-<version>-win-x64.zip — unzip the whole folder; do not send only the .exe.
Works on most distros (single linux-x64 binary). Can be cross-built from Windows:
task client:package:linuxFriends:
tar -xzf Deathborn-<version>-linux-x64.tar.gz
./install.sh
deathbornInstalls to ~/.local/share/deathborn with a deathborn command and desktop menu entry (no sudo).
Build on a Mac only:
task client:package:macOutput: dist/Deathborn-<version>-osx-arm64.dmg (or osx-x64 on Intel Macs).
Friends open the dmg and drag Deathborn.app to Applications.
For both Mac architectures, use GitHub Actions (task release -- X.Y.Z) or run task client:publish:mac:arm64 / task client:publish:mac:x64 on each machine.
| Item | Windows | Linux | macOS |
|---|---|---|---|
| .NET installed | No | No | No |
| Your live server | Yes* | Yes* | Yes* |
*Default production API: https://api.deathborn.wolfskii.dev — or set DEATHBORN_SERVER_URL.
The client picks a server automatically (ServerEndpoints.cs):
DEATHBORN_SERVER_URLenvironment variable, if sethttp://127.0.0.1:8080if/healthresponds (local dev)https://api.deathborn.wolfskii.dev(production)
To point a installed build at another host without rebuilding:
set DEATHBORN_SERVER_URL=https://your-api.example.com
"C:\Program Files\Deathborn\Deathborn.Client.exe"Scripts live under installer/:
| Path | Purpose |
|---|---|
Deathborn.iss |
Windows Inno Setup wizard |
prepare_assets.py |
Wizard bitmaps from game art |
build-installer.sh |
Windows Setup.exe |
package-linux.sh + linux/install.sh |
Linux tar.gz + per-user installer |
package-macos.sh + macos/Info.plist |
macOS .app + .dmg |
Re-run task client:package (or the platform task) after client changes you want friends to receive.
This repo uses Task (Taskfile.yml). Run task to list everything.
| Command | What it does |
|---|---|
task dev |
Local dev: Postgres (Docker) + Go server (Air live-reload) + MonoGame client on host |
task dev:server |
Backend only — Go server with Air (rebuilds on .go / migration changes) |
task dev:client |
Frontend only — MonoGame client (server must be running) |
task up / task stop |
Full stack in Docker only (no local client) |
task client:package |
Native installer/package for this OS |
task client:installer |
Windows Setup.exe only |
task client:package:linux |
Linux tar.gz + install.sh |
task client:package:mac |
macOS .dmg (on Mac) |
task client:publish:all |
Windows + Linux zips |
task client:build |
Release compile only (CI / quick check) |
task client:publish |
Zip for this machine's OS/arch |
task check |
Server fmt + vet + test + client build |
task release -- v0.1.0 |
Tag release (triggers GitHub Actions) |
- CI — Go server checks + Docker image build + C# client build
- Release — cross-platform server binaries + Docker image to GHCR
Cut a release: task release -- v0.1.0

