Old SchoolOps

Running the Website

Every game ships a website binary that serves accounts, live server status, news and downloads. Turning it on, and putting TLS in front of it.

For Every Game Updated 2026-07-26

What It Is

Alongside the game server, every release includes a website: a single binary that serves the game’s public site. Accounts, a live status panel, news, the changelog for each release, a leaderboard, and the client files your players patch from.

It is optional. A server runs perfectly well without one, and players can create accounts through the launcher instead. Run it when you want a public front door.

Starting It

From the archive root:

server/linux/webserver -http :8080

Then open http://localhost:8080. On Windows it is server\windows\webserver.exe with the same flag.

-http serves plain HTTP on the port you name and turns off TLS. That is the right mode for local testing, and also for a real deployment where something else terminates TLS in front of it.

Certificates

With no -http flag and a real hostname configured, the website obtains and renews its own certificate from Let’s Encrypt, serves HTTPS on 443, and redirects 80. There is no certificate tool to install and nothing to renew by hand.

Set the hostname in settings.cfg:

[webserver]
COOKIE_DOMAIN   your-server.example.com

For that to work, ports 80 and 443 must reach the machine, and the hostname must already resolve to it. If either is untrue the certificate request fails, and the site falls back to plain HTTP rather than refusing to start.

Behind a Reverse Proxy

If you already run nginx, Caddy or similar, use -http on a loopback port and proxy to it. Pass X-Forwarded-Proto through: the website reads it to decide whether to mark session cookies secure, and without it a player behind your proxy is issued a cookie that the browser will send over plain HTTP.

How It Knows the Game Is Up

The website does not guess from the database, and it does not merely report that it is itself running. The game server exposes a small status channel on a loopback address, and the website polls it about once a second. If the game server stops, the site says so within a few seconds, and it says why.

That channel is bound to 127.0.0.1 and nothing else. It publishes no credentials, but it does publish player counts, and a mistyped address in a config file cannot expose it.

News and the Changelog

Both are plain markdown files read from disk while the server runs, in articles/ and changelog/ beside the binary. Add a file, refresh the page. There is no rebuild, no publish step and no database involved.

Each file starts with a small block of metadata:

---
title: Server is up
date: 2026-07-26
author: You
category: News
slug: server-is-up
---

Body text goes here.

Client Patching

The client/ directory in the archive is served at /downloads/client/, with an index of file hashes at /downloads/client/manifest.txt. A player’s launcher compares its own copies against that index and fetches what differs.

To push out a client change: drop the files into client/, regenerate the index, and every launcher picks it up on its next run. Your players do nothing.

Two things have to be true for it to reach them. The website must be running, and each player’s launcher.ini must name your site under [Update] URL, which is empty by default. The launcher page covers both, along with the three files an update will never overwrite.